На этом уроке мы научимся изменять направление вращения с сохранением функции регулирования скорости вращения двигателя при помощи AVR-микроконтроллера компании ATMEL.
Для изменения направления вращения нашего двигателя нам необходимо изменять полярность. Осуществить это можно несколькими способами: реле, интегральные драйверы (L293, L292, L292).
Релейный H-мост не устраивает быстродействием. Интегральные драйверы – решение для «ленивых».
Наш выбор H-мост на биполярных транзисторах. Схематическое изображение представлено ниже. Включив транзисторы Q1 и Q4, вращаем двигатель в одну сторону, включив Q2 и Q3 в другую. Всё просто!
Обратим внимание на тот факт, что нельзя допускать одновременного включения Q1 и Q3, Q2 и Q4. Это приведёт к короткому замыканию! Потому отключив Q1 и Q4 необходимо дать им время закрыться, прежде чем включить Q2 и Q3. Эту паузу назовём -+ dead time.
Управлять будем следующим способом.
Точка «А» включает вращение в направлении FORWARD (FWR), в точку «D» поступает ШИМ последовательность режима FWR. Соответственно точка «B» включает вращение в направлении BACKWARD (BWR), точка «D» — ШИМ режима BWR.
Пишем программу. Добавляем новый файл…
#include «H-bridge.c» // Файл инициализации периферии
…с процедурами управления двигателем:
void FORWARD(); // Движение вперёд
void BACKWARD(); // Движение назад
Чтобы исключить ложные выполнения процедур введём переменную направления движения direction_of_motion перечисляемого типа direction. Начальное значение переменной присвоим _BACKWARD.
enum direction {_FORWARD,_BACKWARD} direction_of_motion = _BACKWARD;
Далее, после инициализации…
initPORTs(); // Инициализация портов
initTIMERs(); // Настройка таймера
initADC(); // Настройка АЦП
…в основном цикле…
OCR2 = ADCH; // Опрашивем ручку газа
Если предыдущее движение было _BACKWARD кнопка заднего хода не нажата, переключаем Н-мост в режим движения вперёд. Скорость движения соответствует положению ручки газа на момент переключения.
// Движение вперёд
if (direction_of_motion != _FORWARD && PIND & (1 << PD4)){
direction_of_motion = _FORWARD;
FORWARD();
}
Если предыдущее движение было _FORWARD и кнопка заднего хода нажата, переключаем Н-мост в режим движения назад. Скорость движения соответствует положению ручки газа на момент переключения.
// Движение назад
if(!(PIND & (1 << PD4)) && direction_of_motion != _BACKWARD){
direction_of_motion = _BACKWARD;
BACKWARD();
}
Проект с исходным кодом и симуляция в Proteus во вложении.
Прикрепленные файлы:
- uprav77.rar (35 Кб)