Исполнительные механизмы. Сервопривод – аппаратный ШИМ

Электроника

На этом уроке мы познакомимся с интерфейсом API, создадим свой собственный API, разберем предлагаемый функционал и протестируем некоторые имеющиеся возможности
Глоссарий
Для успешного освоения материала рекомендуем вам изучить следующие понятия:
Сервопривод
(от лат. servus — слуга, помощник, раб) или следящий привод — механический привод с автоматической коррекцией состояния через внутреннюю отрицательную обратную связь в соответствии с параметрами, заданными извне
Таймер
в информатике — средство обеспечения задержек и измерения времени средствами компьютера. Существуют два вида таймеров:
  • аппаратные таймеры функционируют независимо от центрального процессора и в момент срабатывания генерируют прерывание
  • программные таймеры реализуются за счет выполнения в цикле заданного количества одинаковых «пустых» операций. При фиксированной частоте работы процессора это позволяет точно определять прошедшее время. Главными минусами такого метода являются зависимость количества итераций цикла от типа и частоты процессора и невозможность выполнения других операций во время задержки
Широтно-импульсная модуляция (ШИМ, англ. PWM)
процесс управления мощностью методом пульсирующего включения и выключения прибора
Видеолекция
Конспект
Попробуем настроить таймер-счетчик в режиме ШИМ и написать программу для управления сервоприводом. Сервопривод — это специфический двигатель, для его управления необходим широтно-импульсно модулированный (ШИМ) сигнал, который формируется микроконтроллером.

Например, для поворота на ноль градусов нам надо передать импульс 544 мкс, для поворота на 180° — импульс 2400 мкс, а период должен составлять 20 мс.

Задача
  1. Настроить таймер-счетчик в режиме ШИМ
  2. Реализовать функцию изменения ШИМ для поворота крыльчатки по событиям, например, каждую 10-ю секунду на 0,5 градуса
  3. Использовать эту функцию для поворота крыльчатки с течением времени, например, вращая от 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 мкс/°)
Проект на компьютере
1. Копируем прошлый проект, переименовываем и открываем

2. Загружаем конфигурационную вкладку и в разделе Categories находим таймер
3. В таймере TIM2 устанавливаем тактирование Internal Clock

4. Устанавливаем вывод ШИМ из канала 1
5. Инициализируем значение Prescaler вычисленным заранее значением 79

6. Counter Period выставляем равным 19999

7. Значение регистра CCR (Pulse) по умолчанию при загрузке — 544
8. Сохраняем и генерируем код

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. Прописываем условие для наступления события
//генерируем событие на 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.
Компилируем, прошиваем устройство, сбрасываем контроллер
Тестирование работы сервопривода
  1. После прошивки подключаем питание для сервопривода — 5 Вольт и ограничение тока — 700 мА
  2. Подключаем осциллограф для измерения сигнала ШИМ на сервоприводе
Важно
По окончании проверки сначала отключаем блок питания, далее отсоединяем щуп от сервопривода и от платы и только потом отсоединяем плату от компьютера
Итак, мы провели расчеты для таймера для формирования ШИМ-сигнала управления сервоприводом и написали код для движения по граничным углам сервопривода. Давайте проверим полученные знания.
Интерактивное задание
Тест
Для закрепления полученных знаний пройдите тест
Стартуем!
Отметьте верные импульсы для поворота на 0° и на 180° соответственно:
Дальше
Проверить
Узнать результат
Где находится максимальное значение top?
Дальше
Проверить
Узнать результат
Вычислите, сколько мкс ШИМ содержится в одном градусе поворота, если для поворота на 0° длительность импульса ШИМ — 544 мкс, а на 180° — 2400 мкс
Дальше
Проверить
Узнать результат
Выберите верную последовательность действий, выполняемых по окончании проверки:
Дальше
Проверить
Узнать результат
К сожалению, вы ответили неправильно
Прочитайте лекцию и посмотрите видео еще раз
Пройти еще раз
Неплохо!
Но можно лучше. Прочитайте лекцию и посмотрите видео еще раз
Пройти еще раз
Отлично!
Вы отлично справились. Теперь можете ознакомиться с другими компетенциями
Пройти еще раз