Машинка на ДУ управлении своими руками — Вперёд-назад (Atmel)!

На этом уроке мы научимся изменять направление вращения с сохранением функции регулирования скорости вращения двигателя при помощи 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 во вложении.


Прикрепленные файлы:

Добавить комментарий

Ваш адрес email не будет опубликован.