Ардуино: управление сервоприводом. Подключение сервоприводов к Arduino

Несмотря на то, что автоматизированные системы управления вошли в наш быт, далеко не всем известно про сервопривод. Что это такое? Он представляет собой систему, реализующую высокоточные динамичные процессы. Устройство состоит из двигателя, датчика и блока управления, обеспечивающих отработку требуемых скорости, позиции и момента.

К сервоприводам относятся различные усилители и регуляторы, но термин больше применяется в автоматических системах при обозначении электропривода с отрицательной обратной связью по положению. Основой является корректировка работы электродвигателя при подаче управляющего сигнала.

Как устроен сервопривод

Что это такое, легче понять, если рассмотреть конструкцию и работу устройства. Электромеханический узел сервопривода размещается в одном корпусе. Его характеристиками являются конструкция, рабочее напряжение, частота и крутящий момент. По показаниям датчика от контроллера или микросхемы поступает сигнал на корректировку работы серводвигателя.

Простейшее устройство представляет собой электродвигатель постоянного тока, схему управления и потенциометр. Конструкция предусматривает наличие редуктора, чтобы получить заданную скорость перемещения выходного вала.

Схема управления

Подключение сервопривода можно производить с помощью простой схемы с таймером NE555 в режиме генератора импульсов.

Положение вала двигателя определяется шириной импульса, которая устанавливается переменным резистором R 1 . Сигналы должны подаваться генератором непрерывно, например каждые 20 мсек. При поступлении команды (перемещение движка резистора) выходной вал редуктора поворачивается и устанавливается в определенное положение. При внешнем воздействии он будет сопротивляться, пытаясь оставаться на месте.

Механическое регулирование системы отопления

Сервопривод - что это такое? Это хорошо понятно по его работе в системе теплого пола как приспособления, регулирующего поток теплоносителя. Если это делать вручную, придется непрерывно крутить вентили на коллекторах, поскольку расход горячей воды, подаваемой в обогревающие контуры, является переменной величиной.

Для автоматического регулирования систем теплого пола применяются разные устройства. Простейшим является термоголовка, устанавливаемая на регулирующий клапан. Она состоит из ручки механической настройки, пружинного механизма и сильфона, соединенного с толкателем. При повышении температуры внутри сильфона нагревается толуол, который при этом расширяется и давит на шток клапана, закрывая его. Поток теплоносителя перекрывается, и он начинает остывать в отопительном контуре. При охлаждении до заданного уровня сильфон снова открывает клапан, и новая порция горячей воды поступает в систему.

Механические регуляторы устанавливаются на каждый контур теплого пола и настраиваются вручную, после чего температура автоматически поддерживается постоянной.

Электрический сервопривод для отопления

Более совершенным устройством является электрический сервопривод для отопления или теплого пола. Он включает систему взаимосвязанных механизмов, обеспечивающих поддерживание температуры воздуха в помещении.

Сервопривод для отопления работает вместе с термостатом, который монтируется на стену. Кран с электроприводом устанавливается на подающей трубе, перед коллектором водяного теплого пола. Затем производится подключение, подача питания 220 В и установка на терморегуляторе заданного режима. Система снабжается двумя датчиками: один - в полу, а другой - в комнате. Они передают команды на термостат, который управляет сервоприводом, соединенным с краном. Точность регулирования будет выше, если установить еще прибор на улице, поскольку климатические условия постоянно меняются и влияют на температуру в помещениях.

Сервопривод управляет двух- или трехходовым клапаном. Первый изменяет температуру теплоносителя в системе отопления. Трехходовой клапан с сервоприводом поддерживает температуру постоянной, но изменяет расход горячей воды, подаваемой в контуры. Од содержит 2 входа для горячей жидкости (подающий трубопровод) и холодной (обратка). Выход всего один, через него подается смесь с заданной температурой. Клапан обеспечивает смешивание потоков, регулируя таким путем подачу тепла в коллекторы. Если один из входов открывается, то другой начинает прикрываться. При этом расход на выходе остается постоянным.

Сервопривод крышки багажника

Современные автомобили большей частью выпускаются с автоматическим открыванием и закрыванием багажника. Для этого требуется установка сервопривода. Производители применяют 2 способа, чтобы обеспечить авто подобной опцией. Надежным вариантом является пневмопривод, но он стоит дороже. Электропривод управляется несколькими способами на выбор:

  • с пульта;
  • кнопка на дверной панели водителя;
  • ручка на крышке багажника.

Ручное открывание не всегда удобное, особенно зимой, когда замок может замерзнуть. Сервопривод багажника совмещается с замком, что дополнительно защищает авто от несанкционированного проникновения.

Устройства применяются на иномарках, но при желании их можно установить на отечественных моделях. Предпочтительно использовать привод с электродвигателем.

Есть еще устройства с магнитными пластинами, но они сложней и применяются реже.

Самыми дешевыми являются электроприборы, предназначенные только для открывания. Можно подобрать привод багажника, состоящий из электродвигателя с инерционным механизмом, отключающийся при возникновении препятствия перемещению. Дорогие модели состоят из устройства подъема и опускания крышки, доводчика запорного механизма, контроллера и датчиков.

Установка и настройка сервопривода крышки багажника производятся на заводе, но простые устройства могут быть установлены своими руками.

Характеристики сервоприводов

Устройства выпускаются аналогового и цифрового типов. Приводы внешне ничем не отличаются, но различие между ними существенное. Последние обладают более точной отработкой команд, поскольку управление производится микропроцессорами. Для сервоприводов пишутся и вводятся программы. Аналоговые устройства работают от сигналов микросхем. Их преимуществами являются простое устройство и меньшая цена.

Основными параметрами для выбора являются следующие:

  1. Питание. Подача напряжения производится по трем проводам. По белому передают импульс, через красный - рабочее напряжение, черный или коричневый является нейтральным.
  2. Размеры: большие, стандартные и микроустройства.
  3. Скорость. От нее зависит, за какой промежуток времени вал повернется на угол 60 0 . Недорогие устройства обладают скоростью 0,22 сек. Если требуется высокое быстродействие, она составит 0,06 сек.
  4. Величина момента. Параметр является приоритетным, поскольку при малом вращающем моменте управление затрудняется.

Как управлять цифровым сервоприводом?

Приводы подключаются к программируемым контроллерам, среди которых хорошо известен Arduino. Подключение к его плате производится тремя проводами. По двум подается питающее напряжение, а по третьему - управляющий сигнал.

Инструкция сервопривода с цифровым управлением предусматривает наличие в контроллере простой программы, позволяющей считывать с потенциометра показания и переводить их в число. Затем оно преобразуется в команду передачи на поворот вала сервопривода в заданное положение. Программа записывается на диске, а затем передается на контроллер.

Заключение

Мы подробно рассмотрели сервопривод. Что это такое, станет понятным, когда потребуется автоматизация различных процессов, где требуется поворачивать и удерживать в заданном положении вал электродвигателя. Устройства выпускаются аналоговые и цифровые. Последние нашли более широкое применение благодаря высокому уровню разрешения, большой мощности и точности позиционирования.

Учимся управлять сервомотором с использованием Arduino.

Сначала мы рассмотрим как обеспечить вращение выходного вала серводвигателя в автоматическом режиме "вперед" и в обратном направлении. После этого дополнительно включим в схему потенциометр, который обеспечит управление поворотом сервопривода.

Необходимые узлы

Для того, чтобы освоить приведенные в статье методики управления сервоприводом вам понадобятся:

1 переменный резистор (потенциометр) на 10 кОм



1 микроконтроллер Arduino Uno



1 конденсатор на 100 мкФ (не обязательно)


Схема подключения для "Sweep" (автоматическое вращение)

Для этого эксперимента вам надо подключить к Arduino только сервомотор.


На сервомоторе 3 контакта. Цвет контактов может отличаться в зависимости от фирмы производителя, но красный - это всегда контакт 5 В. Контакт GND (земля) может быть черным или коричневым. Оставшийся третий контакт - это сигнал, который используется для управления положением ротора сервы. Обычно он желтого или желтого цветов. Этот контакт мы подключаем к цифровому пину 9 на Arduino.

На контактах сервы предусмотрены разъемы, в которые можно установить коннекторы (провода) и соединить из макетной платой, а потом с Arduino.


Серводвигатель дергается

Иногда при подключении сервы не отрабатывают заданные команды или отрабатывают некорректно. Причем происходить это может только при подключении к определенным USB портам. Причина в том, что сервы требуют достаточно большую мощность для питания, особенно в начале движения ротора. Эти резкие скачки потребляемой мощности могут сильно "просаживать" напряжение на Arduino. Может произойти даже перезагрузка платы.

Если подобное происходит, вам надо добавить конденсатор (470 мкФ или больше) между рельсами GND и 5V на вашей макетке.


Конденсатор выполняет роль своебразного резервуара для электрического тока. Когда серводвигатель начинает работать, он получает остатки заряда с конденсатора и от источника питания Arduino одновременно.

Длинная нога конденсатора - это позитивный контакт, она подключается к 5V. Отрицательный контакт часто маркируется символом "-".

Скетч Arduino "Sweep" (автоматическое вращение)

Загрузите на Arduino скетч, который рассмотрен ниже. После загрузки ротор сервы должен начать вращаться в одном направлении, а потом в противоположном.

Программа основана на стандартном скетче "sweep", который вы можете найти в меню Arduino Examples в папке "servo".

#include <Servo.h>

int servoPin = 9;

int angle = 0; // угол сервы в градусах

servo.attach(servoPin);

// инкремент от 0 до 180 градусов

for(angle = 0; angle < 180; angle++)

servo.write(angle);

// теперь в обратном направлении от 180 до 0 градусов

for(angle = 180; angle > 0; angle--)

servo.write(angle);

Сервомоторы управляются серией импульсов. Для того, чтобы упростить управление сервами, написана специальная библиотека (Arduino library). С помощью этой библиотеки вы можете управлять сервой, задавая фактический угол поворота вала на выходе.

Управляющие команды для серв подобны встроенным в Arduino, но так как вы используете их далеко не во всех проектах, они хранятся в отдельной библиотеке. Если вы хотите использовать команды из библиотеки для серводвигателей, вам надо включить библиотеку в ваш скетч в Arduino IDE с помощью следующей строки:

#include <Servo.h>

Используем переменную "servoPin" для определения порта, который управляет сервой.

Следующая строка:

инициализирует новую переменную "servo" типа "Servo". Библиотека предоставляет нам новый тип данных наподобие "int" или "float", который отвечает за серву. Таким образом вы можете инициализировать восемь серводвигателей. Например, если у нас две сервы, можно записать следующее:

В теле функции "setup" мы должны согласовать переменную "servo" с пином, который будет управлять серводвигателем, используя команду:

servo.attach(servoPin);

Переменная "angle" используется для указания текущего угла поворота сервы в градусах. В теле функции "loop" мы используем используем два цикла "for". Один - для увеличения угла поворота в одном направлении и второй - для возврата, когда мы совершили поворот на 180 градусов.

servo.write(angle);

Сообщает серве, что надо обновить угол поворота выходного вала сервомотора в соответствии с углом, который указан в качестве параметра.

Схема подключения сервы с потенциометром ("Knob")

Следующий этап - добавить , чтобы управлять положением выходного вала сервы с помощью поворота ручки переменного резистора.

Надо просто добавить на макетную плату потенциометр и проводник от контакта сигнала с потенциометра на пин A0 на Arduino.


Скетч Arduino "Knob" (управление сервой с помошью потенциометра)

Программа, в которой положение выходного вала сервы контролируется углом поворота ручки потенциометра даже проще, чем рассмотренный ранее автоматический поворот и возврат в исходное положение.

#include <Servo.h>

int servoPin = 9;

servo.attach(servoPin);

int reading = analogRead(potPin); // от 0 до 1023

int angle = reading / 6; // от 0 до 180

servo.write(angle);

В скетче добавлена переменная с именем "potPin".

Для того, чтобы вывести вал сервы в положение, мы считываем значение с контакта Arduino A0. Значение с этого контакта будет находится в диапазоне между 0 и 1023. Так как серва может поворачиваться только на 180 градусов, нам надо масштабировать полученные значения. Разделив значения с контакта A0 на 6 мы получаем угол в диапазоне от 0 до 170, что нас вполне устраивает.

Сервомоторы - общая информация

Сервомоторы - один из типов двигателей , коотрые часто используются в робототехнике, мехатронных проектах, проектах на Arduino.

Положение выходного вала сервомотора определяется длиной импульса. Серва может получать импульсы каждые 20 миллисекунд. Если импульс high длится 1 миллисекунду, угол поворота сервы будет равен нулю. Если 1.5 миллисекунды, тогда серва выйдет в свое центральное положение, а если 2 миллисекунды - выйдет в положение, которое соответствует 180 градусам.


Крайние положения сервомоторов могут отличаться. Кроме того, многие сервы могут поворачиваться на 170 градусов. Есть и "continuous" сервы, которые совершают оборот на полные 360 градусов.

Внутри сервы

На видео, которое приведено ниже, показано, что происходит внутри сервомотора.

Будьте аккуратны. Если вы разберете серву подобным образом, есть вероятность, что собрать обратно ее не получится.

Дальнейшие эксперименты с сервой и Arduino

Откройте скетч "sweep" и попробуйте сократить задержки с 15 миллисекунд до, скажем, 5 миллисекунд. Обратите внимание, насколько быстрее начали вращаться сервы.

Попробуйте изменить скетч "knob". Вместо того, чтобы ориентироваться на значения с потенциометра, реализуйте управление сервой с помощью значений, которые вы указываете в окне серийного моитора Arduino IDE.

Небольшая подсказка: для того, чтоьы скетч считывал значения угла с серийного монитора, вы можете использовать функцию Serial.parseInt(). Эта функция парсит (считывает) числовые значения с серийного монитора.

Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!

Возможности Arduino очень разнообразны: от обычного контроля температуры и сбора данных до управления 3D принтерами и умными домами. Также с помощью этой платы можно программировать различные механизмы и даже роботов. Для таких целей очень часто применяются различные движки, моторчики и приводы.

Самыми распространенными и популярными в механизмах являются шаговые двигатели и сервоприводы. О последних мы и поговорим в этой статье. Сервоприводы являются самыми дешевыми и практичными в использовании моторчиками. Их размеры и масса малы, а комбинация из таких модулей поможет успешно создавать роботов.

Начнем знакомство с самым популярным из них, по-другому он еще называется SG90 (Tower Pro Micro Servo 9G). Сервопривод представляет небольшую коробку, в которую запрятан сам механизм. Научившись правильно писать программный код, можно управлять положением вала.

Для подключение сервопривода к Arduino , на плате используется 3 контакта (для подключения используются 3 провода “папа-папа”): питание (5V), заземление и аналоговый выход (расположены на панели digital ). Наглядная схема подключения изображена на рисунке ниже:

Внимание! При подключение более чем одной сервы или одной, но более мощной, можно допустить просадку напряжения на плате Arduino (из-за слабой стабилизации на плате) Поэтому, если подключаете более одного сервопривода, то контакты питания лучше подключать к отдельному источнику, чем к плате.

После того, как подключили, можно зайти в среду разработки Arduino IDE и опробовать первую программу для проверки работоспособности модуля. Также советуем использовать библиотеку Servo.h . Она уже встроена в Arduino IDE, а значит скачивать и устанавливать ее не нужно. И кстати, эта библиотека уже содержит в себе некоторые команды и тем самым упрощает работу с сервоприводом, избавляя нас от очень длинных и занимаемых много места кодов. Она содержит в себе следующие полезные команды:

  • attach (номер_вывода) - инициализация сервопривода;
  • write (угол) - поворот сервопривода на заданный угол;
  • read () - получение текущего угла сервопривода.

Теперь рассмотрим первую программу с использованием сервопривода.

Данная программа позволит изменять угол поворота вала на сервоприводе с течением времени:

#include ; //используем библиотеку для работы с сервоприводом Servo servo; //объявляем переменную servo типа Servo void setup() //процедура setup { servo.attach(10); //привязываем привод к порту 10 } void loop() //процедура loop { servo.write(0); //ставим вал под 0 delay(2000); //ждем 2 секунды servo.write(180); //ставим вал под 180 delay(2000); //ждем 2 секунды }

#include ; //используем библиотеку для работы с сервоприводом

Servo servo ; //объявляем переменную servo типа Servo

void setup () //процедура setup

servo . attach (10 ) ; //привязываем привод к порту 10

void loop () //процедура loop

servo . write (0 ) ; //ставим вал под 0

delay (2000 ) ; //ждем 2 секунды

servo . write (180 ) ; //ставим вал под 180

Является элементом точной кинематики, позволяющий достигать точное позиционирование механизмов. Но в отличии от шагового двигателя, сервопривод имеет обратную связь, позволяющую в любой момент отследить точный угол поворота вала. В качестве источника обратной связи могут быть использованы различные типы энкодеров и потенциометры.

В статье рассмотрим подключение и работу с младшими представителями сервоприводов - т.н. сервомашинками - горячо любимыми среди роботостроителей и моделистов.

Конструктив

Сервомашинка состоит из корпуса, в котором заключен небольшой коллекторный электромотор, редуктор и управляющая электроника.

В качестве обратной связи применяются потенциометры. Поэтому эти сервы имеют ограничения по углу поворота вала вокруг оси. Так, в приобретенных мной сервах Futaba S3003, угол поворота выходного вала составляет 225°.

Технические характеристики Futaba S3003

Параметр Напряжение питания, В
4,8 6,0
Усилие на валу 3,2 кг/см 4,1 кг/см
Скорость позиционирования 0,23 sec/60° 0,19 sec/60°
Размер, Д х Ш х В 41мм х 20мм х 36мм
Масса, г 37

Потенциометр обратной связи посажен прямо на выходной вал, благодаря ему блок управления сервомашинки отслеживает точное положение вала: сопротивление потенциометра изменяется пропорционально углу поворота . Считав сопротивление, блок управления сравнивает это значение с тем, которое должно быть при заданном положении вала. Если эти значения отличаются, блок управления дает команду двигателю повернуть вал в заданном направлении, уменьшая разницу значений. Достигнув положения вала, когда значение с потенциометра совпадает с заданным значением, двигатель останавливается. Считывание значения с потенциометра и его сравнение происходит с большой частотой, поэтому выходной вал будет стремиться занять заданное положение при изменении внешней нагрузки.

Конструкция сервомашинки выполнена таким образом, что крутящий момент от двигателя к выходному валу передается через редуктор с большим передаточным числом, поэтому при малых размерах и энергозатратах, сервомашинки могут обеспечивать большую тягу.


Управление

В качестве управляющего сигнала служит импульсный сигнал с периодом 20 мс и с длительностью от 0,8 до 2,2 мс. Это некий стандарт управления сервомашинок. Чем длинее пришел импульс, тем на больший угол повернется вал сервомашинки. Для разгона сервомашинки период следования импульсов можно уменьшить до 10 мс.


Управляющий сигнал подается на серву по сигнальному проводу S. В моей сервомашинке он белый, в некоторых моделях - желтый. Помимо сигнального провода из сервомашинки выходят два провода - линии питания - земля (черный) и питание (красный)


Программная часть

Как видно управлять сервой достаточно просто - достаточно гнать импульсный сигнал с нужной частотой и скважностью. Этот сигнал можно генериовать ШИМ , или написать свою функцию обработки прерывания по таймеру. Но в Bascom-AVR уже есть встроенная команда для управления сервомашинками - Servo . Ее и рассмотрим.

Для начала необходимо сконфигурировать подключение сервомашинок:

Config Servos = X , Servo1 = Portb . 0 , Servo2 = Portb . 1 , Reload = Var

Servos = X ; указывается количество подключаемых сервомашинок, возможно подключение до 14 серв.

Servo1 = Portb . 0 ; указывается порт подключения первой сервы

Servo2 = Portb . 1 ; указывается порт подключения второй сервы

Reload = Var ; здесь Var время в микросекундах, которое проходит между прерываниями от таймера.

По умолчанию для организации прерываний используется Timer0, поэтому использовать его в своих целях уже не получиться. Bascom-AVR позволяет перебросить обслуживание прерываний на любой другой таймер, например чтобы освободить Timer0 и задествовать Timer1 достаточно указать это в строке конфигурации:

Config Servos = 2 , Servo1 = Portb . 0 , Servo2 = Portb . 1 , Reload = 10 , Timer = Timer1


После того как все сконфигурировали остается только рулить нашей сервомашинкой. Это делается следующей командой

Servo ( a) = F

а - порядковый номер сервомашинки

F - переменная, значение которой задает угол поворота вала сервы

Тестовый код целиком:


$regfile = "m8def.dat" "микроконтроллер ATmega8
$crystal = 8000000 "частота работы 8МГц

"конфигурируем порты для подключения сервоприводов
Config Portb . 0 = Output
Config Portb . 1 = Output

"настраиваем подключения двух сервомашинок
Config Servos = 2 , Servo1 = Portb . 0 , Servo2 = Portb . 1 , Reload = 15

Dim F As Byte "переменная для первой сервы
Dim S As Byte "переменная для второй сервы

"разрешаем прерывания
Enable Interrupts

F = 15 "значением переменной задается угол поворота вала сервомашинки
S = 70

Do

Servo (1 ) = F
Servo (2 ) = S

Loop

End


Схему подключения не привожу, думаю один сигнальный провод проблем не вызовет;) Его можно подключать к порту микроконтроллера напрямую, а можно через резистор сопротивлением пару сотен ом - для перестраховки.

Меняя значения перемменных F и S можем менять угол поворота первой и второй сервомашинок соответственно. Чем меньше значение параметра Reload, тем шустрее наши сервомашинки будут поворачиваться на нужный угол.

Для своих серв подобрал рабочий диапаз он значений Servo(a), в которых вал может вращаться. Крайнее положения вал занимает при значении 0 и 150, соответственно при значении 75 вал занимает промежуточное положение.


Servo(a) =0 Servo(a) =75 Servo(a) =150

Опубліковано 25.07.2012

Сервомашинки или сервоприводы нашли широкое применение не только в роботостроении, моделизме, но и в различных отраслях промышленности и приборостроении.

Как устроена сервомашинка

Большинство сервоприводов используют три провода для работы. Провод для питания, обычно 4.8В или 6В, общий провод (земля) и сигнальный провод. Управляющий сигнал передает информацию о требуемом положении выходного вала. Вал связан с потенциометром, который определяет его положение. Контроллер в сервоприводе по сопротивлению потенциометра и значению управляющего сигнала определяет, в какую сторону требуется вращать мотор, чтобы получить нужное положение выходного вала. Чем выше напряжение питания сервопривода, тем быстрее он работает и больший момент развивает.

Характеристики сервоприводов

Размер и вес

Размеры бывают: “микро”, “мини”, “стандартный” и “гигант”. В пределах каждого класса размеры могут немного меняться. Средние размеры сервоприводов для справки:

  • Микро: 24мм x 12мм x 24мм, вес: 5-10 г.
  • Мини: 30мм x 15мм x 35мм, вес 25 г.
  • Стандарт: 40мм x 20мм x 37мм, вес: 50-60 г.

Скорость

Скорость сервоприводов измеряется временем поворота качалки сервопривода на угол 60 градусов при напряжении питания 4.8В и 6В. Например, сервопривод с параметром 0.22с/60° при 4.8В поворачивает вал на 60 градусов за 0.22с при напряжении питания 4.8В. Это не так быстро, как может показаться. Наиболее быстрые сервоприводы имеют время перемещения от 0.06 до 0.09с.

Угол поворота

Сервоприводы могут иметь угол поворота вала 60, 90, 180 градусов. Угол поворота ограничивается электроникой и механически. Существуют сервоприводы без ограничения, т.е. вращающиеся на 360 градусов. Если у Вас имеется сервопривод с рабочим диапазоном 60 градусов, то расширить его можно только изменив конструкцию сервомашинки. Иногда можно увеличить диапазон специальным образом исказив управляющий сигнал. Но это нестандартный и ненадежный способ.

Момент на валу

Момент сервопривода измеряется по весу груза в кг, который сервопривод может удерживать неподвижно на качалке с плечом 1 см. Указывают две цифры, для напряжения питания 4.8В и 6В. Например, если указано, что сервопривод развивает 10кг/см, значит, что на качалке длиной 1см сервопривод может развить усилие 10 кг, прежде чем остановится. Для качалки в 2см такой сервопривод сможет развить усилие 5кг, а на 5мм 20кг.

Цифровые и аналоговые сервоприводы

Цифровые и аналоговые сервоприводы механически не отличаются друг от друга. У них те же корпуса, моторы, шестеренки и даже потенциометры. Все дело в способе управления мотором. Цифровые сервоприводы более точны и, как правило, имеют меньшее время реакции. Но они потребляют больше энергии, чем аналоговые сервоприводы. Управляющий сигнал для аналоговых и цифровых сервоприводов одинаков.

Управляющий сигнал

Управляющий сигнал представляет собой импульсы переменной ширины. Импульсы повторяются с постоянной частотой (как правило, с частотой 50Гц). Положение сервопривода определяется шириной импульса. Для типичного сервопривода, используемого в радиоуправляемых моделях, длительность импульса в 1500 мкс означает, что сервопривод должен занять среднее положение. Увеличение или уменьшение длины импульса заставит сервопривод повернуться по часовой или против часовой стрелки, соответственно.

Таким образом, для управления сервоприводом нам потребуется формировать ШИМ с частотой 50 герц. При этом для положения “0” длительность импульса должна составлять 1000 микросекунд, а для положения “максимум” – 2000 микросекунды. Среднее положение – 1500 микросекунд.

Финалом наших изысканий будет плата сервотестера, работающая с двумя сервоприводами. Светодиоды отображают режим сервотестера. Формировать ШИМ будем использовать аппаратные возможности микроконтроллера ATMega8, а задающий сигнал будем формировать с учетом положения потенциометра.
Управляющие сигналы для сервоприводов формируются на ногах OC1A , OC1B .
Режимы переключаются кнопкой. Три светодиода отображают режим работы сервотестера.

  • Режим 1 – положение сервомашинок задается потенциометром
  • Режим 2 – задается среднее положение сервоприводов
  • Режим 3 – задающий сигнал циклически изменяется от одного крайнего положения к другому.

Питание сервотестера осуществляется от батарей напряжением 6..12В.

Исходный код

#include #include #include //=================================== АЦП ================================== //Инициализация АЦП: void adc_init(void){ ADCSRA = _BV(ADEN) | _BV(ADPS0) | _BV(ADPS1) | _BV(ADPS2); // prescaler = 128 } //Чтение канала АЦП: uint32_t adc_read(uint8_t ch){ ADMUX = _BV(REFS0) | (ch & 0x1F); // set channel (VREF = VCC) ADCSRA &= ~_BV(ADIF); // clear hardware "conversion complete" flag ADCSRA |= _BV(ADSC); // start conversion while(ADCSRA & _BV(ADSC)); // wait until conversion complete return ADC; // read ADC (full 10 bits); } int main() { char mode=0; // Режим - по умолчанию 0 int direct=0; uint16_t adc_result; #define ICR_MAX F_CPU/50 // ICR1(TOP) = fclk/(N*f) ; N-Делитель; f-Частота; 1000000/1/50 = 20000 #define OCR_MIN ICR_MAX/20 #define OCR_MAX ICR_MAX/10 #define OCR_CENTER (ICR_MAX/4/10)*3 // На порту кнопки включаем подтягивающий резистор DDRB &= ~(1<<4); PORTB |= (1<<4); // Настраиваем порт светодиодов DDRC = (1<<1) | (1<<2) | (1<<3); PORTC |= (1<<(mode+1)); // Настраиваем PWM на таймере 1 (выход на ногах PB1, PB2) TCCR1A = 0; // Отключаем PWM пока будем конфигурировать ICR1 = ICR_MAX; // Частота всегда 50 Гц // Включаем Fast PWM mode via ICR1 на Таймере 1 без делителя частоты TCCR1A = (1< 2) { mode = 0; } // Включаем нужный светодиод PORTC &= ~((1<<1) | (1<<2) | (1<<3)); PORTC |= (1<<(mode+1)); } switch (mode){ case 0:{ // Задаем положени сервомеханизма, в зависимости от положения потенциометра adc_result adc_result=adc_read(0); OCR1A = OCR_MIN+(adc_result * (OCR_MAX-OCR_MIN)/1024); OCR1B = OCR1A; break; } case 1:{ // Задаем центральное положение сервомеханизма direct=0; OCR1A = OCR_CENTER; OCR1B = OCR1A; break; } case 2:{ // Циклическое изменение положения сервомашинки if (direct==0){ OCR1A++; OCR1B++; if (OCR1A >= OCR_MAX) { direct=1; } } if (direct==1){ OCR1A--; OCR1B--; if (OCR1A <= OCR_MIN) { direct=0; } } _delay_ms(1); break; } } } }




Top