Сервопривод - что это? Как сделать и подключить сервопривод своими руками? Управление сервоприводом на Arduino

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

Многие сервоприводы могут быть подключены к Arduino напрямую. Для этого от них идет шлейф из трех проводов:

красный – питание подключается к контакту 5V или непосредственно к источнику питания
коричневый или черный земля (GND контакт Arduino)
желтый или белый сигнал; подключается к цифровому выходу Arduino.

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

Ограничения по питанию

Обычный хобби-сервопривод при работе потребляет более 100 мА. При этом Arduino способно выдавать до 500 мА. Поэтому, если вам в проекте необходимо использовать несколько сервоприводов, есть смысл задуматься о выделении сервоприводов в контур с дополнительным питанием.

Ограничения по количеству подключенных сервоприводов

На большинстве плат Arduino библиотека Servo поддерживает управление не более 12 сервоприводами, на Arduino Mega это число возрастает до значения 48. При этом есть небольшой побочный эффект использования этой библиотеки: если вы работаете не с Arduino Mega, то становится невозможным использовать функцию analogWrite () на 9 і 10 контактах независимо от того, подключены сервоприводы к этим контактам или нет. На Arduino Mega можно подключить до 12 сервоприводов без нарушения функционирования ШИМ/PWM, при использовании большего количества сервоприводов мы не сможем использовать analogWrite () на 11 и 12 контактах.

Функции библиотеки Servo

Библиотека Servo позволяет осуществлять программное управление сервоприводами. Для этого создается обьект servo класса Servo. Управление осуществляется следующими функциями:

attach () – закрепляет привод с конкретным пином. Возможны два варианта синтаксиса для этой функции: servo.attach (pin) і servo.attach (pin, min, max) . При этом pin – номер пина, к которому присоединяют сервопривод, min и max – длины импульсов в микросекундах, отвечающие за углы поворота 0 ° и 180 °. По умолчанию выставляются равными 544 мкс и 2400 мкс соответственно.
write () – отдает команду сервоприводу принять некоторое значение параметра. Синтаксис следующий: servo.write (angle) , где angle – угол, на который должен обернуться сервопривод.
writeMicroseconds () – отдает команду отправить на сервопривод импульс определенной длины, является низкоуровневым аналогом предыдущей команды. Синтаксис следующий: servo.writeMicroseconds (uS) , где uS – длина импульса в микросекундах.
read () – читает текущее значение угла, в котором находится сервопривод. Синтаксис следующий: servo.read () , возвращается целое значение от 0 до 180.
attached () – проверка, был присоединен объект к конкретному пину. Синтаксис следующий:servo.attached () , логическая единица возвращается, если объект был присоединен к какому-либо пену, или ноль в противном случае.
detach () – выполняет действие, обратное действию attach () , т.е. отсоединяет объект от пина, к которому он был приписан. Синтаксис следующий: servo.detach () .

Для управления изменением положения сервопривода можно использовать потенциометр. Он имеет три контакта подключаемые следующим образом:
Два крайних контакты (как правило) это питание и земля, а средний – информационный. Подсоединяем питания потенциометра –> 5 V Arduino, земля –> GND Arduino, информационный –> аналоговый пин Arduino.
Вот так может выглядеть схема:

А так примитивная программа:

#include Servo myservo; // create servo object to control a servo int potpin = 0; // analog pin used to connect the potentiometer int val; // variable to read the value from the analog pin void setup() { myservo.attach(9); // attaches the servo on pin 9 to the servo object } void loop() { val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023) val = map(val, 0, 1023, 0, 179); // scale it to use it with the servo (value between 0 and 180) myservo.write(val); // sets the servo position according to the scaled value delay(15); // waits for the servo to get there }

#include

Servo myservo ; // create servo object to control a servo

int potpin = 0 ; // analog pin used to connect the potentiometer

int val ; // variable to read the value from the analog pin

– это привод, вал которого может встать в заданное положение или поддерживать заданную скорость вращения. Другими словами, валом сервопривода можно управлять, например, задавая ему положение в градусах или определенную частоту вращения.

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


Устройство сервопривода

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

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



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


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





Принцип работы

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


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


Основные технические характеристики сервопривода

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


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


Угол поворота . Это максимальный угол, на который может повернуться выходной вал. Наиболее распространенные значения для этой характеристики: 180° и 360°.


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


Материал шестерней . Шестерни редуктора производятся из пластика, карбона, металла. Пластиковые шестерни легкие, но не предназначены для серьезных нагрузок. Карбоновые шестерни более прочные, но и более дорогие. Металлические шестерни – самые тяжелые, идеально подходят для максимальных нагрузок.




Виды сервоприводов

Сервоприводы бывают цифровые и аналоговые.

По внешнему виду они почти не отличаются друг от друга. Основное отличие заключается в принципе управления мотором. У аналоговых сервоприводов управление происходит с помощью специальной микросхемы, цифровые сервоприводы обладают микропроцессором. Микросхема и микропроцессор способны принимать и анализировать управляющие импульсы. Только на микросхему они обычно поступают с частотой 50 Гц, а на микропроцессор – с частотой 200 Гц и более. В результате этого цифровой сервопривод мобильнее и четче реагирует на управляющий сигнал.



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


Подключение к Arduino

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





Красный кабель отвечает за питание сервопривода. Коричневый - за заземление. Желтый – подключается непосредственно к плате Arduino и предназначен для передачи управляющего сигнала.

Подключение сервопривода к плате Arduino производится через ШИМ-выводы.



Итак, черный провод подключается к любому GND-пину.

Красный кабель питания (VTG) - к соответствующему выводу для подключения питания.

Белый сигнальный кабель – к ШИМ-выводу.


Питание сервоприводов

Большинство плат Arduino рассчитано на 500 мА. Исходя из этого, сервопривод является достаточно энергоемким компонентом, так как потребляет более 100 мА. Если в ходе проекта требуется использование мощного сервопривода или нескольких сервоприводов, то необходимо позаботиться об их дополнительном питании. Проблема дополнительного питания сервоприводов может быть решена следующим образом:

Обеспечить питание сервопривода от дополнительно приобретенного блока питания, например, 5 или 6 В;

При отсутствии блока питания с нужным напряжением, можно использовать стабилизатор.

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


Количество сервоприводов

Количество подключаемых к плате Arduino сервоприводов ограничено. Большинство моделей Arduino предусматривает подключение 12 сервоприводов, Arduino Mega позволяет подключить до 48 сервоприводов.





Управление сервоприводом


Библиотека Servo

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

На сегодняшний день уже написаны программы для самых разных целей. Библиотеки можно подобрать по ссылке .

На платах Arduino за исключением модели Arduino Mega обращение к библиотеке отключает функцию analogWrite(PWM) на пинах 9 и 10. Наличие подключения сервопривода или отсутствие такового при этом роли не играет. На платах Arduino Mega можно подключить до 12 сервомоторов без отключения функции PWM.


Для управления сервоприводом предусмотрена библиотека Servo.h.



Вызывается она через #include . После подключения библиотеки становится возможным пользоваться списком, содержащихся в ней функций. С функциями библиотеки можно ознакомиться через меню «Файл/примеры». Для каждого сервопривода создается свой «объект» (servo), который прикрепляется к соответствующему цифровому пину. После этого программируемый контроллер Arduino готов отправлять управляющие сигналы на конкретный сервопривод. Передача сигналов производится постоянно, даже при «простое» сервопривода. Для приостановки передачи сигналов нужно отправить команду вручную.


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

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

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


Управляющие команды

Управление сервоприводом через библиотеку основано на следующих командах:

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


Невозможность поворота на заданный угол

Бывают случаи, когда поворот сервопривода на заданный угол невозможен. Например, на его пути возникает какая-либо преграда. Этой преградой может стать закрепленное на сервоприводе устройство или его часть. Упираясь в преграду, сервопривод начинает характерно жужжать. Чтобы решить данную проблему, в программу вносятся команды, ограничивающие перемещение сервопривода путем изменения угла перемещения.


Настройки начальной и конечной позиции

Иногда необходимо подкорректировать координаты начальной или конечной позиции. Это нужно когда значения датчика и фактического положения выходного вала расходятся относительно конечной позиции последнего. Например, выходной вал находится в конечной позиции, но датчик считает, что он еще ее не достиг и пытается заставить выходной вал продолжить движение. Возникает характерный шум. В этом случае начальная позиция не обязательно должна начинаться с 0°С, а конечная не обязательно должна заканчиваться на 180°C. Эти предельные значения можно немного сдвинуть на 5-10°C, и проблема будет решена.




Заключение

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

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



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

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

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

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

Основные компоненты сервопривода:

    Привод;

    Датчик;

    Блок управления;

    Конвертер.

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


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

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

Точное управление группами или одиночными сервоприводами достигается применением контроллеров ЧПУ, которые, кстати, могут быть построены на программируемых логических контроллерах. Сервоприводы на основе таких контроллеров достигают по мощности 15 кВт, и могут развивать крутящий момент до 50 Нм.

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

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

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

Область применения сервоприводов сегодня весьма широка, благодаря возможности исключительно точного позиционирования рабочего органа.

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

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

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

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

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

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

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

Для самых начинающих. Проверенный код в статье. Подключим, повернем, разберемся с питанием.
В руки прибыл сервопривод SD90 с диагнозом неправильной работы и практически с полным отказом (По словам). Надо разобраться.
Общая информация нужна, информация важна
SD-90 - практически самый дешевый сервопривод на рынке электроники.
Вес всего 15 грамм, а крутящий момент 2кг/см. Работает данный сервопривод SD90 в температурах от -30 до +60 градусов.
Рабочее напряжение от 4В до 8В.
Потребление в движении 70 мА, а в удержании 15 мА.
Угол поворота составляет всего 180 градусов.
Сервопривод SD90 идеально подходит для установки на авиамодели.

Для управления сервоприводами с помощью Ардуин есть стандартная библиотека в IDE Arduino Servo.h , которая включает в себя функции для установки настроек сервопривода, необходимого угла, считывания состояния. Некоторые методы являются перегруженными.

Обращаемся к китайским друзьям за мануалами и судя по рисунку ниже подключение сервопривода SG90 не составляет труда.

Два провода отвечают за питание и один провод для управления. Ниже приведен код программы для ардуино который даст некоторые пояснения.

    * Специально для сайта сайт

    * Сервопривод SG90 + Arduino. Подключение

    //Библиотека для работы с сервоприводом

    #include ‹Servo.h›

    //Обьявление переменной - объекта

    Servo servo;

  1. void setup()

    //К пину №7 подключен управляющий вывод сервопривода

    //Данный метод библиотеки указывает пин через который происходит управление

    servo.attach (7 ) ;

    //servo.detach(7); - этот метод отключит управление от указанного пина.

  2. void loop()

    //Установка вала в 0 градусов

    servo.write (0 ) ;

    delay(2000 ) ; //ждем 2 секунды. Необходимо как минимум 30 микросекунд для установки.

  3. servo.write (90 ) ; //ставим вал под 90 градусов

  4. // В библиотеке есть функция для чтения текущего положения (угла) сервопривода.

    // Будет считано последнее установленное значение в сервоприводе.

    // int AngleServo=servo.read();

    // От 0 до 180 градусов.

  5. servo.write (180 ) ; //ставим вал под 190 градусов

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

  6. //Медленно возвращаемся обратно с интервалом в 1 градус

    for (int p= 179 ; p>= 1 ; p-- )

    servo.write (p) ;

    delay(20 ) ;

    //Угол (Установить) можно задать во времени от нуля.

    //Так как у сервопривода есть характеристика скорости поворота 0.12 сек/60 град

    1 - Коннектор для подключения
    2 - Схема управления сервоприводом, обработки сигналов
    3 - Потенциометр
    4 - Двигатель
    5 - Вал

    Так вот, в самом начале я говорил что в руки попал почти не рабочий сервопривод (По словам). После разбирательств стало понятно что Ардуина имела питание от USB компьютера, а сам сервопривод от Arduino.
    Если углубится в подробности то в экспериментах с было установлено то что китайская версия MEGA не вытягивает нагрузку 150 мА. Сервопривод SG90 в момент движения вала создает нагрузку 75-90 мА в зависимости от нагрузки вала. В итоге при старте Ардуины у человека который попросил разобраться в данной проблеме происходил сброс самой ардуины от повышенной нагрузки и соответственно сервопривод не подавал никаких признаков.

    Решение проблемы самое простое. Необходимо усилить питание для ардуины с помощью внешнего источника (блока питания) или отдельно для сервопривода SG90.
    Но ситуация была такова что в месте установки сервопривода не было возможности применить внешний источник питания. Решение нашлось ниже на рисунке.

    В итоге что бы предотвратить нагрузку на Arduino необходимо между питанием и землей установить поддерживающий конденсатор емкостью 1000мФ 10V. И керамический конденсатор любой емкости для предотвращения дребезга от сервопривода (при нагрузке) на Ардуину. Это решение нельзя использовать для постоянного использования, но в экстренных случаях этот вариант вполне подойдет.

    Обратите внимание что данный вариант подойдет для сервоприводов типа "микро". Для больших сервоприводов данный метод для питания все равно даст просадку напряжения, это будет заметно по LED индикаторам ардуины, но все же предотвратит полный сброс.

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

Угол на который поворачивается серва, задается шириной импульса. Стоит уточнить небольшую тонкость, сервоприводы бывают разные. Бывают такие, которые крутятся постоянно в определенную сторону, при этом ширина импульса влияет только на скорость поворота. Бывают многооборотистые. Те о которых речь пойдет дальше, на сайте производителя имеют явную маркировку, в которой указан угол поворота. Поэтому учтите если серва, не имеет явной маркировки, то может оказаться так, что она тупо постоянно вращается. Не путайте, надписи 0.20 sec/60° означают скорость вращения, они никак не связаны с максимальным углом поворота.

Перейдем к теории. Представляем себе микроконтроллер с подключенным к АЦП входу резистором R и некий движок, который крутится по ШИМ сигналу PWM. Допустим уровень сигнала АЦП напрямую связан с ШИМ выходом, тогда когда мы будем крутить резистор, то скорость будет меняться, когда напряжение АЦП станет равным 0, движок остановится.

Теперь рассмотрим вариант 2. Ручка резистора насажена на вал двигателя, таким образом, что когда двигатель вращается, он изменяет сопротивление резистора, следовательно и напряжение, которое подается на вход АЦП. При этом, если имеется еще один источник сигнала, то микроконтроллер сравнивает напряжение на входах и если оно больше, то крутит в одну сторону, если меньше, то в другую. Рано или поздно напряжения уровняются и движок остановится. Поэтому серва включает в себя все что нарисовано: резистор, микроконтроллер, двигатель. Внешний сигнал естественно подавать должны мы, чтобы управлять.

Типовые кишки выглядят так:

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

Чаще всего ширина импульса колеблется в диапазоне от 1100мкс до 1900мкс, при периоде 20мс, но цифры могут отличаться, причем достаточно сильно. Пример из даташита:
Control System: +Pulse Width Control 1520usec Neutral
Required Pulse: 3-5 Volt Peak to Peak Square Wave
Operating Voltage: 4.8 Volts
Operating Speed (6V): 0.20sec/60 degrees at no load
Operating Angle: 45 Deg. one side pulse traveling 400usec
Continuous Rotation Modifiable: No
Direction: Counter Clockwise/Pulse Traveling 1520-1900usec

Отсюда четко видно, что средняя точка 1520мкс, чтобы повернуть такую серву на 45градусов, уже нужно подать импульс 1900мкс, соответственно остальные углы рассчитываются пропорцией. Чтобы повернуть на -45 градусов нужно подать импульс 1100мкс. Т.е. диапазон 90град. Еще видно, что под Continuous Rotation сей девайс не заточен, что хорошо.

Перейдем к практике. Есть поциент Futaba S3152, которым нужно покрутить туды — сюды.

Также можно это дело потестить в протеусе. Обычное подключение по трем проводам красный +5В, черный — земля, белый — управляющий.

В последних версиях CAVR, в Codewizard появилось много ништяков, например можно вбить цифры в попугаях и увидеть период и импульс в секундах. Собственно нам важен режим fast pwm top ICR. Примечателен этот режим тем, что ICR задает период, а OCR ширину импульса.

Период вычисляется очень просто:
ICR = (Частота таймера/50Hz)-1

Тогда нужную ширину импульса можно легко вычислить по пропорции:
20ms = ICR
?ms = OCR

В итоге можно переписать так:
OCR = (x*ICR)/20; где x это необходимая длительность импульса. Например, нужна длительность импульса в 1мс, значит OCR= (1*9C3)/20=0x7C.

Собственно и все. Теперь исходим из того, что нейтральная точка = 1524мкс или OCR1 = (1.524*9C3)/20 = 0xBE и зависимости от тогу куда нам нужно повернуть пересчитываем OCR. Простенький пример, поворачиваем на -45, затем 0 и потом +45.

#include #include void main(void ) { // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=Out Bit2=In Bit1=Out Bit0=In DDRB= (0 << DDB7) | (0 << DDB6) | (0 << DDB5) | (0 << DDB4) | (1 << DDB3) | (0 << DDB2) | (1 << DDB1) | (0 << DDB0) ; // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=0 Bit2=T Bit1=0 Bit0=T PORTB= (0 << PORTB7) | (0 << PORTB6) | (0 << PORTB5) | (0 << PORTB4) | (0 << PORTB3) | (0 << PORTB2) | (0 << PORTB1) | (0 << PORTB0) ; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 125,000 kHz // Mode: Fast PWM top=ICR1 // OC1A output: Non-Inverted PWM // OC1B output: Disconnected // Noise Canceler: Off // Input Capture on Falling Edge // Timer Period: 20 ms // Output Pulse(s): // OC1A Period: 20 ms Width: 0,9924 ms // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A= (1 << COM1A1) | (0 << COM1A0) | (0 << COM1B1) | (0 << COM1B0) | (1 << WGM11) | (0 << WGM10) ; TCCR1B= (0 << ICNC1) | (0 << ICES1) | (1 << WGM13) | (1 << WGM12) | (0 << CS12) | (1 << CS11) | (1 << CS10) ; TCNT1H= 0x00 ; TCNT1L= 0x00 ; ICR1H= 0x09 ; ICR1L= 0xC3 ; OCR1AH= 0x00 ; OCR1AL= 0x7C ; OCR1BH= 0x00 ; OCR1BL= 0x00 ; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK= (0 << OCIE2) | (0 << TOIE2) | (0 << TICIE1) | (0 << OCIE1A) | (0 << OCIE1B) | (0 << TOIE1) | (0 << TOIE0) ; while (1 ) { //-45 OCR1A = (1100 * 0x9C3 ) / 20000 ; delay_ms(1000 ) ; //0 OCR1A = (1524 * 0x9C3 ) / 20000 ; delay_ms(1000 ) ; //+45 OCR1A = (1900 * 0x9C3 ) / 20000 ; delay_ms(1000 ) ; } }

#include #include void main(void) { // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=Out Bit2=In Bit1=Out Bit0=In DDRB=(0<

Получилось так:

Для stm32 приведу пример настройки, которая помойму даже проще. Пример для stm32f103, нога PA1, тактовая 72МГц.

//Настройка ножки PA1 на альтернативную функцию GPIO_InitTypeDef PORT_SETUP; PORT_SETUP.GPIO_Mode = GPIO_Mode_AF_PP; PORT_SETUP.GPIO_Pin = GPIO_Pin_1; PORT_SETUP.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, & PORT_SETUP) ; //настройка таймера TIM_TimeBaseInitTypeDef TIM_SETUP; TIM_SETUP.TIM_CounterMode = TIM_CounterMode_Up; TIM_SETUP.TIM_Period = 4096 ; TIM_SETUP.TIM_Prescaler = 351 ; // 72мгц/4096/351=50hz TIM_TimeBaseInit(TIM2, & TIM_SETUP) ; //настройка ШИМ TIM_OCInitTypeDef PWM_SETUP; //PWM_SETUP.TIM_Pulse = 200; //4096 = 20ms 200 ~ 1ms PWM_SETUP.TIM_Pulse = 0 ; PWM_SETUP.TIM_OCMode = TIM_OCMode_PWM2; PWM_SETUP.TIM_OutputState = TIM_OutputState_Enable; PWM_SETUP.TIM_OCPolarity = TIM_OCPolarity_Low; TIM_OC2Init(TIM2, & PWM_SETUP) ; TIM_Cmd(TIM2, ENABLE) ; while (1 ) { .... //где то внутри основного цикла меняем угол поворота переменной result TIM2-> CCR2 = (4096 * result) / 20000 ; }

//Настройка ножки PA1 на альтернативную функцию GPIO_InitTypeDef PORT_SETUP; PORT_SETUP.GPIO_Mode = GPIO_Mode_AF_PP; PORT_SETUP.GPIO_Pin = GPIO_Pin_1; PORT_SETUP.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &PORT_SETUP); //настройка таймера TIM_TimeBaseInitTypeDef TIM_SETUP; TIM_SETUP.TIM_CounterMode = TIM_CounterMode_Up; TIM_SETUP.TIM_Period = 4096; TIM_SETUP.TIM_Prescaler = 351; // 72мгц/4096/351=50hz TIM_TimeBaseInit(TIM2, &TIM_SETUP); //настройка ШИМ TIM_OCInitTypeDef PWM_SETUP; //PWM_SETUP.TIM_Pulse = 200; //4096 = 20ms 200 ~ 1ms PWM_SETUP.TIM_Pulse = 0; PWM_SETUP.TIM_OCMode = TIM_OCMode_PWM2; PWM_SETUP.TIM_OutputState =TIM_OutputState_Enable; PWM_SETUP.TIM_OCPolarity = TIM_OCPolarity_Low; TIM_OC2Init(TIM2, &PWM_SETUP); TIM_Cmd(TIM2, ENABLE); while(1) { .... //где то внутри основного цикла меняем угол поворота переменной result TIM2->CCR2 = (4096 * result)/20000; }

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

Еще один момент, это крепление нагрузки. Пластиковые штуки, которые крепятся на вал называются качалками.