Зачем нужна библиотека Servo?

Modsley
Offline
Зарегистрирован: 14.01.2018

Приветствую.

Поясните, пожалуйста, мне, тупому, для чего нужна библиотека Servo?

Почему просто не обойтись analogWrite?

Ан нет, есть специальная библиотека, да не одна...

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Modsley , вы это тролите или о ситуации вообще тупите ?

Modsley
Offline
Зарегистрирован: 14.01.2018

Нет, я действительно не могу этого понять. 

Пишем analogWrite, всё работает вроде. Зачем библиотеки? Они ведь память отъедают, прерывание занимают... 

Что они такого особенного делают? 

Я совершенно искренне не понимаю. 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Это совершенно разные системы. Они не совместимы и они для разных систем и систем подходов. 

Проще всего они разные. Это как шапка и сапог. Вы же не носите сапог на голове. Потому что шапка это лишняя покупка и занимает место в квартире.

sadman41
Offline
Зарегистрирован: 19.10.2016

Не в первый раз читаю тут о волшебном способе управления серводвигателями через analogWrite(). Откуда это вообще лезет, с какого ютуб-урока?

Modsley
Offline
Зарегистрирован: 14.01.2018

Уважаемый, вот ничего не понимаю. 

Чем PWM, выдаваемый на пин библиотекой Servo отличается от того, который получаем путём analogWrite?

Или для сервы частота другая нужна?

sadman41
Offline
Зарегистрирован: 19.10.2016

Серве (цифровой) частота не нужна. Нужны импульсы заданной длительности. Сможете на analogWrite гарантированно дать импульс в 961мс?

Modsley
Offline
Зарегистрирован: 14.01.2018

Это-то понятно. 

Я имел в виду, что импульсы-то этой самой заданной длительности ведь следуют с какой-то частотой... 

В общем, если я правильно понял, analogWrite не обеспечивает заданной точности. 

Правильно?

sadman41
Offline
Зарегистрирован: 19.10.2016

Я не знаю, что он там серве вообще обеспечивает.

Потому что дергать стандартную серву на той частоте, что выдает analogWrite вообще смысла нет. Среднестатистическая серва ожидает импульсы заданной длительности ~раз в 20мс. Т.е. с частотой 50Гц. 490Гц ШИМ-а Ардуины как бы на порядок выше номинала.

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

Modsley
Offline
Зарегистрирован: 14.01.2018

Спасибо. Теперь всё понятно. 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

sadman41 пишет:

Серве (цифровой) частота не нужна. Нужны импульсы заданной длительности. Сможете на analogWrite гарантированно дать импульс в 961мс?

Легко. Проблема и разница только в одном месте: analogWrite() нормально работает на серву только при правильной перенастройке таймера и он должен быть .. 16-и битным. То есть далеко не везде. Библиотека Servo.h имитирует верное управление на любом пине .. ценой программного времени микроконтроллера. Это всё и есть ответ на вопрос зачем нужна библиотека.

sadman41
Offline
Зарегистрирован: 19.10.2016

Продемонстрируете? Мне интересно на анализаторе глянуть, как analogWrite будет давать нужную длительность.

svm
Offline
Зарегистрирован: 06.11.2016

Что-то мне подсказывает, что разговор беспредметный. Нет ни модели "сервы" ни скетча,  кстати серва что это такое - прецизионный сервопривод на 50-100 Квт или китайская рулевая машинка от игрушечного медвежонка. От этого многое зависит. Если второе, то ему и ШИМа за глаза, если первое то и библиотеки не помогут. О чем спорим? У автора ведь от ШИМа работает.

sadman41
Offline
Зарегистрирован: 19.10.2016

Да пусть работает, кто ж запрещает ему рулить сервой, как получается. Мне действительно хочется глянуть, как можно в два счета перестроить таймеры, чтобы analogWrite выдавал 540...2400мкс каждые 20мс, к примеру. А то я лепил себе облегченную servo.h на таймерах, теперь интересно глянуть - короче выйдет код или нет.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015
// Примерно так устанавливается 16-и битный таймер на период 20мсек:

// @see Arhat.h
// v.1 set 16bit timer (only t:[1,3,4,5]) to PWM special for servo motors:
//     1/64 FAST-pwm mode with ICP, 50hz (20msec) and set to pwmOut PWM pin,
// Установка 16битного таймера и его каналов в типовой ШИМ для серво моторов. Ноги на вывод устанавливать отдельно!
//
// @example: set timer5 to pwmServo and use 2 servo at pins 44,46:
//   timerSetServo(5, pwmPinMode(44, PWM_NORMAL)|pwmPinMode(46, PWM_NORMAL))
//   ** set pins 44,46 to OUTPUT manually!
#define timerSetServo(t,pwmPinMask)                               \
{                                                                 \
  timerControl(t, A) = (1<<WGM11)|(pwmPinMask);                   \
  timerControl(t, B) = (1<<WGM13)|(1<<WGM12)|(1<<CS11)|(1<<CS10); \
  timerCapture(t) = 4999;                                         \
}

// 20мсек = 20000мксек = 5000 тиков таймера или 1 тик = 4мксек. 960/4 = 240.
analogWrite(t16pin, 240);

Если Вам надо точно 961мксек, то надо поднять разрешение таймера в 4 раза из 1/64 в 1/16 и увеличить период счета также в 4 раза до 60000.

sadman41
Offline
Зарегистрирован: 19.10.2016

Пример, конечно, интересный, но я так понимаю, что нужно еще откуда-то нарыть эти timerCapture(), timerControl() и еще десяток каких-нибудь скрытых функций. Т.е. фактически переписать servo.h другими словами.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Да не. Это я года 2 назад с целью вспомнить язык после 17-летнего перерыва, накатал простенький набор дефайнов, подобных функциям Ардуино библиотек, чтобы было проще осваивать все это барахло. Там все просто: это просто макросы, вычисляющие соотв. регистры таймеров и пр. ерунды по номеру пина и "какой" нужен регистр А,В или Capture. Вспринимайте просто: в регистра таймера control A надо записать вот такое. А в его регистр capture - это.