Управление сервоприводом: как определить угол и необходимую ширину импульса?

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

Вопросы, с которыми я сейчас борюсь:

1. Учитывая характеристики сервопривода, как я могу вычесть минимальное и максимальное значения (углы) сервопривода?
2. Используя ШИМ-шляпу, описанную ниже, и библиотеку Python, которая поставляется вместе с ней, как точно рассчитать время, в течение которого импульс ШИМ должен быть установлен на высокий уровень для достижения определенного угла? Например: какой должна быть высокая длина импульса ШИМ для отправки на сервопривод, чтобы он находился в положении 90 градусов? И что это будет за положение 120 градусов?

Любые мысли, замечания или комментарии высоко ценятся, заранее спасибо!


Аппаратные и программные характеристики

Сервопривод

У нас есть сервопривод Power HD LF-20MG.

Крутящий момент (4,8 В): 16,5 кг-см
Крутящий момент (6,6 В): 20 кг-см
Скорость: 0,18 с (4,8 В) | 0,16 с (6,6 В)
Рабочее напряжение: 4,8–6,6 В пост. тока
Вес: 60 г
Рабочая частота: 1520 мкс (= 1,52 мс) при 333 Гц
Максимальный ход: 165 градусов

ШИМ-контроллер

Для управления сервоприводом с помощью Raspberry Pi мы используем PWM/SERVO HAT от Adafruit для точной синхронизации . HAT должен управляться с помощью их библиотеки Python, в которой следующие функции управляют сервоприводом:

Программный ШИМ-контроллер

Во-первых, установка частоты. Судя по спецификациям сервопривода, думаю, должно быть 333.

pwm.setPWMFreq(333)

Во-вторых, есть функция, которая фактически управляет импульсом ШИМ. Вот в чем я действительно сомневаюсь (см. второй вопрос выше).

var port = 15
var tickHigh = 0
var tickLow = 1400 #For example; range from 0-4096
pwm.setPWM(port, tickHigh, tickLow)

Как указано в документах (см. эту ссылку ), используемые значения рассчитываются на основе необходимой длительности импульса в микросекундах. Но я действительно борюсь здесь: я не могу определить, какой должна быть необходимая ширина импульса для этого сервопривода (отсюда и вопросы).
ЕСЛИ бы я знал это, вычисления для программного обеспечения стали бы намного проще:
(1 / частота) / 4096 = время за тик
Для частоты этого сервопривода это было бы: (1/333) / 4096 = 0,00000073315503
Тогда я мог используйте следующую формулу, учитывая необходимую длину импульса:
необходимая длина импульса / время на тик = tickHigh

> If you need to calculate pulse-width in microseconds, you can do that
> by first figuring out how long each cycle is. That would be 1/freq
> where freq is the PWM frequency you set above. For 1000 Hz, that would
> be 1 millisecond. Then divide by 4096 to get the time per tick, eg 1
> millisecond / 4096 = ~0.25 microseconds. If you want a pulse that is
> 10 microseconds long, divide the time by time-per-tick (10us / 0.25 us
> = 40) then turn on at tick 0 and turn off at tick 40.

Ответы (2)

Ваш вопрос был слишком длинным, чтобы его можно было прочитать.

Эти серводвигатели для хобби управляются шириной импульса. Стандартный диапазон составляет от 1 до 2 мс и должен повторяться каждые 20-50 мс. Ширина импульса 1,5 мс поместит сервопривод в середину его диапазона, с 1 мс на один конец и 2 мс на другой. Некоторые сервоприводы могут двигаться немного дальше, реагируя на значения, немного превышающие диапазон 1-2 мс.

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

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

Исходя из этой строки - « Рабочая частота: 1520 мкс (= 1,52 мс) при 333 Гц », 1,52 мс - это ширина импульса, необходимая для максимального вращения вашего сервопривода, т.е. 165 градусов.

в таком случае:

Как вы уже подсчитали, период времени вашего пульса составляет 1/333 = 0,003003 сек. Требуемое время максимума в периоде составляет 1,52 мс = 0,00152 сек. Как вы уже рассчитали время на тик = 1/333/4096 = 0,000000733

Таким образом, чтобы создать высокий импульс шириной 0,00152 с, вам нужно 0,00152/0,000000733 = 2073 тика.

попробуйте задать tickHigh = 0 и tickLow = 2073

или tickHigh = 4096-2073 = 2023 и tickLow = 4096

Нет. Вы исходите из неверного предположения. 1,5 миллисекунды обычно являются средней точкой с отклонением в обе стороны. Величина отклонения не указана, но традиционно она составляет порядка 0,5 мс в каждую сторону. 333 Гц — это максимум, а не требование; традиционная частота обновления составляет 50 Гц, хотя, вероятно, некоторые современные наборы RC на базе микроконтроллеров обновляются быстрее, поскольку они могут быть разработаны для генерации сервоимпульсов для нескольких каналов параллельно, а не по очереди.