PWM

Материал из virt2real wiki
Перейти к: навигация, поиск

Содержание

Аппаратные PWM

Общая информация

Процессор DM365, используемый в Виртурилке, обеспечивает 4 независимых аппаратных PWM, каждый из которых использует высокоточный 64-х битный счётчик.


TMS320DM36x Digital Media System-on-Chip (DMSoC) Pulse-Width Modulator (PWM)


Аппаратные PWM на Виртурилке

Канал PWM Пины
PWM0 CON40, CON43
PWM1 CON44, CON84
PWM2 CON16, CON17, CON18, CON19
PWM3 CON42, CON63, CON64, CON65


Теория

Частота таймеров, используемых для PWM, составляет 24МГц. Соответственно, 1 тик таймера занимает 1000000 / 24000000 = 0,042 мкс

Чтобы получить частоту PWM 20кГц (чтобы не было слышно писка), требуется задать период, считаем:

20 кГц = 20 000 Гц, период равен 1 / 20000 = 0,00005 с

Необходимое количество тиков, которое укладывается в этот период равно

0,00005 / 0.000000042 = 1190,47619047619, округляем до целого и получаем 1190. Т.е. необходимо задать period 1190


Конфигурирование аппаратных PWM

Для того чтобы нужный пин начал работать в режиме PWM, необходимо его сконфигурировать. Делается это с помощью драйвера /dev/v2r_pins

Формат команд:

set con <номер_CON> pwm<номер_PWM>

Например, чтобы сконфигурировать пин CON44 в режиме PWM, надо задать команду

echo "set con 44 pwm1" > /dev/v2r_pins

pwm1 - именно так, без пробелов!


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


Управление аппаратными PWM сигналами

echo "set pwm <номер_pwm> <duty> <period>" > /dev/v2r_pins


Программные PWM

Помимо аппаратных PWM реализованы и программные, низкоточные.

echo "start con:<номер_CON> duty:<duty>" > /dev/v2r_sw_pwm
echo "stop con:<номер_CON> duty:<duty>" > /dev/v2r_sw_pwm

Внимание! Драйвер v2r_sw_pwm теперь не входит в стандартную прошивку, т.к. толку от него реально мало. Лучше использовать нормальные аппаратные PWM на самой Виртурилке или на моторшилде.


Наглядный пример

Рассмотрим применение двух каналов аппаратных PWM для управления моторами гусеничной тележки DAGU RP5.

Для управления моторами использую то что было под рукой (пока нет в наличии наших моторшылдов) - регулятор коллекторных двигателей DFRobot 2A Dual Motor Controller.

Подключение регулятора очень простое - боковые синие колодки подключаем напрямую на моторы гусениц. Синюю колодку GND подключаем к минусовой клемме аккумулятора (я использую Li-po 3S 1900mAh), синюю колодку VS подключаем к плюсовой клемме аккумулятора.

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

За управление каждым мотором на этом регуляторе отвечают два контакта - E1 и M1 для одного, E2 и M2 - для второго.

E1 и E2 - PWM сигнал для регулирования скорости вращения двигателей.

M1 и M2 - выбор направления вращения двигателя. Если подать 0 - вращается в одну сторону, если подать 1 - в другую.


Итак, для полного управления парой двигателей нам необходимо подключить контакты E1 и E2 к выходам PWM Виртурилки. Для примера, я подключил их вот так

E1 -> CON44 (PWM1)
M1 -> CON42
E2 -> CON43 (PWM0)
M2 -> CON41

Теперь надо сконфигурировать нужные пины

echo "set con 44 pwm1" > /dev/v2r_pins # установить PWM1 на CON44
echo "set con 43 pwm0" > /dev/v2r_pins # установить PWM0 на CON43

Задаём направление движения (разные, т.е. моторы стоят симметрично, но на противоложных сторонах)

echo "set con 42 output 1" > /dev/v2r_pins
echo "set con 41 output 0" > /dev/v2r_pins

Остановить моторы

echo "set pwm 1 0 1500" > /dev/v2r_pins
echo "set pwm 0 0 1500" > /dev/v2r_pins

Запустить моторы на максимальной скорости

echo "set pwm 1 1500 1500" > /dev/v2r_pins
echo "set pwm 0 1500 1500" > /dev/v2r_pins

Запустить моторы на средней скорости

echo "set pwm 1 1000 1500" > /dev/v2r_pins
echo "set pwm 0 1000 1500" > /dev/v2r_pins


Величины duty и period (1500 в данном примере) подбираются экспериментально для разных моторов. Для избавления от писка моторов (когда они работают на низкой частоте) рекомендуется понизить период.