Исполнительные механизмы. Сервопривод – аппаратный ШИМ
Электроника
“
На этом уроке мы познакомимся с интерфейсом API, создадим свой собственный API, разберем предлагаемый функционал и протестируем некоторые имеющиеся возможности
Глоссарий
Для успешного освоения материала рекомендуем вам изучить следующие понятия:
Сервопривод
(от лат. servus — слуга, помощник, раб) или следящий привод — механический привод с автоматической коррекцией состояния через внутреннюю отрицательную обратную связь в соответствии с параметрами, заданными извне
Таймер
в информатике — средство обеспечения задержек и измерения времени средствами компьютера. Существуют два вида таймеров:
- аппаратные таймеры функционируют независимо от центрального процессора и в момент срабатывания генерируют прерывание
- программные таймеры реализуются за счет выполнения в цикле заданного количества одинаковых «пустых» операций. При фиксированной частоте работы процессора это позволяет точно определять прошедшее время. Главными минусами такого метода являются зависимость количества итераций цикла от типа и частоты процессора и невозможность выполнения других операций во время задержки
Широтно-импульсная модуляция (ШИМ, англ. PWM)
процесс управления мощностью методом пульсирующего включения и выключения прибора
Видеолекция
Конспект
Попробуем настроить таймер-счетчик в режиме ШИМ и написать программу для управления сервоприводом. Сервопривод — это специфический двигатель, для его управления необходим широтно-импульсно модулированный (ШИМ) сигнал, который формируется микроконтроллером.
Например, для поворота на ноль градусов нам надо передать импульс 544 мкс, для поворота на 180° — импульс 2400 мкс, а период должен составлять 20 мс.
Например, для поворота на ноль градусов нам надо передать импульс 544 мкс, для поворота на 180° — импульс 2400 мкс, а период должен составлять 20 мс.
Задача
- Настроить таймер-счетчик в режиме ШИМ
- Реализовать функцию изменения ШИМ для поворота крыльчатки по событиям, например, каждую 10-ю секунду на 0,5 градуса
- Использовать эту функцию для поворота крыльчатки с течением времени, например, вращая от 0 до 180° и обратно
Работа таймер-счетчика
- Счетчик считает от нуля до какого-то значения top, которое находится в регистре ARR
- После достижения максимального значения происходит сброс к нулю, и счет повторяется
- При перезагрузке с максимального значения на ноль формируется единичка на определенной ножке
- Далее идет счет до определенного значения pwm из регистра CCR. При достижении этого значения вывод pwm control сбрасывается в ноль, который сохраняется до перезагрузки счетчика
Важно
Длительность импульса единицы формально располагается в CCR, а длительность общего цикла pwm — это максимальное значение таймер-счетчика в регистре ARR
Алгоритм
1. Вычислим сколько микросекунд ШИМ находится в 1° поворота сервопривода: (2400 мкс – 544 мкс) / 180° = 10.311 мкс/°. Зная этот коэффициент, мы можем вычислить какой период нужно заложить в таймер, чтобы получить определенный угол. Если мы выберем дискретность таймера в 1 мкс, то в наихудшем случае получим погрешность угла в 3% от 1°, что значительно лучше погрешности самого среднего сервопривода.
2. Рассчитаем «Prescaler», так чтобы при тактировании от 80 МГц счетчик таймера тикал каждые 1 мкс. Prescaler = 80000000/1000000-1=79.
3. Рассчитаем значение перезагрузки таймера. По заданию таймер должен возобновлять ШИМ-импульс каждые 20 мс. Т.е. тикая каждую 1 мкс таймер должен перезагрузится через 20 мс. Получим ARR = 0.02/0.000001 -1=19999.
4. Рассчитаем допустимые пределы для регистра CCR. Старт сервопривода начинается с 544 мкс (тик таймера 1 мкс) – значение 544, и заканчивается 2400 мкс – значение 2400.
5. Текущее значение CCR рассчитывается от требуемого угла поворота angle: CCR = 544 + int(angle*10.311 мкс/°)
2. Рассчитаем «Prescaler», так чтобы при тактировании от 80 МГц счетчик таймера тикал каждые 1 мкс. Prescaler = 80000000/1000000-1=79.
3. Рассчитаем значение перезагрузки таймера. По заданию таймер должен возобновлять ШИМ-импульс каждые 20 мс. Т.е. тикая каждую 1 мкс таймер должен перезагрузится через 20 мс. Получим ARR = 0.02/0.000001 -1=19999.
4. Рассчитаем допустимые пределы для регистра CCR. Старт сервопривода начинается с 544 мкс (тик таймера 1 мкс) – значение 544, и заканчивается 2400 мкс – значение 2400.
5. Текущее значение CCR рассчитывается от требуемого угла поворота angle: CCR = 544 + int(angle*10.311 мкс/°)
Проект на компьютере
1. Копируем прошлый проект, переименовываем и открываем
2. Загружаем конфигурационную вкладку и в разделе Categories находим таймер
2. Загружаем конфигурационную вкладку и в разделе Categories находим таймер
3. В таймере TIM2 устанавливаем тактирование Internal Clock
4. Устанавливаем вывод ШИМ из канала 1
4. Устанавливаем вывод ШИМ из канала 1
5. Инициализируем значение Prescaler вычисленным заранее значением 79
6. Counter Period выставляем равным 19999
7. Значение регистра CCR (Pulse) по умолчанию при загрузке — 544
6. Counter Period выставляем равным 19999
7. Значение регистра CCR (Pulse) по умолчанию при загрузке — 544
8. Сохраняем и генерируем код
9. В функции main делаем вызов для запуска таймера в режиме PWM и указываем, что это таймер TIM2
10. В обработчике прерываний таймера реализуем алгоритм для изменения угла поворота
9. В функции main делаем вызов для запуска таймера в режиме PWM и указываем, что это таймер TIM2
10. В обработчике прерываний таймера реализуем алгоритм для изменения угла поворота
//событие "раз в 100 мс"
#define HTIM1_EVENT_100ms 100
volatile int32_t htim1_event_100ms_count = HTIM1_EVENT_100ms; //счетчик тиков таймера для полуения события раз в 100 мс
volatile uint8_t event_100ms_flag = 0; //флаг события - изначально событие не установленно
11. Создаем обработчик события в прерывании таймера TIM1
12. Как только событие установится, меняем угол поворота сервопривода на 0,5 градуса, при этом, если угол поворота достигает максимальной границы, то он должен вернуться к нулю, изменяя шаг
13. Создаем перечисление для направления typedef enum ( Angle_Down = 0, Angle_Up = 1)
14. Создаем переменную, сохраняющую текущее вещественное значение угла
15. Прописываем условие для наступления события
12. Как только событие установится, меняем угол поворота сервопривода на 0,5 градуса, при этом, если угол поворота достигает максимальной границы, то он должен вернуться к нулю, изменяя шаг
13. Создаем перечисление для направления typedef enum ( Angle_Down = 0, Angle_Up = 1)
14. Создаем переменную, сохраняющую текущее вещественное значение угла
15. Прописываем условие для наступления события
//генерируем событие на 100 мс
htim1_event_100ms_count--; //уменьшаем счетчик для события
if(htim1_event_100ms_count==0)
{//счетчик достиг конуа - генерим событие
event_100ms_flag = 1; //установим флаг события
htim1_event_100ms_count = HTIM1_EVENT_100ms; //установим счетчик в изначальное состояние
if(dir == Angle_Up)
{//вращение в увеличение угла
if((angle+= 0.5) <= 180)
{//приращение угла не выйдет за пределеы сервопривода
angle+= 0.5; //увеличиваем угол
TIM2->CCR1 = 544 + (10.311*angle); //изменяем ШИМ для сервопривода
}
else
dir = Angle_Down; //достигли угла в 180 градусов - будем двигаться назад - в уменьшение угла
}
16. Аналогично заполняем случай, когда мы двигаемся по событию от 180° к нулю
17. Перед обработкой устанавливаем событие, а после сбрасываем
18. Компилируем, прошиваем устройство, сбрасываем контроллер
17. Перед обработкой устанавливаем событие, а после сбрасываем
18. Компилируем, прошиваем устройство, сбрасываем контроллер
Тестирование работы сервопривода
- После прошивки подключаем питание для сервопривода — 5 Вольт и ограничение тока — 700 мА
- Подключаем осциллограф для измерения сигнала ШИМ на сервоприводе
Важно
По окончании проверки сначала отключаем блок питания, далее отсоединяем щуп от сервопривода и от платы и только потом отсоединяем плату от компьютера
“
Итак, мы провели расчеты для таймера для формирования ШИМ-сигнала управления сервоприводом и написали код для движения по граничным углам сервопривода. Давайте проверим полученные знания.
Интерактивное задание
Тест
Для закрепления полученных знаний пройдите тест
Стартуем! |
Отметьте верные импульсы для поворота на 0° и на 180° соответственно:
Дальше |
Проверить |
Узнать результат |
Где находится максимальное значение top?
Дальше |
Проверить |
Узнать результат |
Вычислите, сколько мкс ШИМ содержится в одном градусе поворота, если для поворота на 0° длительность импульса ШИМ — 544 мкс, а на 180° — 2400 мкс
Дальше |
Проверить |
Узнать результат |
Выберите верную последовательность действий, выполняемых по окончании проверки:
Дальше |
Проверить |
Узнать результат |
К сожалению, вы ответили неправильно
Прочитайте лекцию и посмотрите видео еще раз
Пройти еще раз |
Неплохо!
Но можно лучше. Прочитайте лекцию и посмотрите видео еще раз
Пройти еще раз |
Отлично!
Вы отлично справились. Теперь можете ознакомиться с другими компетенциями
Пройти еще раз |