Подключение двигателя постоянного тока к микроконтроллеру AVR ATmega16

Двигатели постоянного тока относятся к числу наиболее часто используемых двигателей. Их можно встретить где угодно – начиная от простейших конструкций до продвинутой робототехники. В этой статье мы рассмотрим подключение двигателя постоянного тока к микроконтроллеру ATmega16 (семейство AVR). Но сначала немного ознакомимся с принципами работы подобных двигателей.

Подключение двигателя постоянного тока к микроконтроллеру AVR ATmega16: внешний вид конструкции

Что представляет собой двигатель постоянного тока

Двигатель постоянного тока (DC motor) – это устройство, которое преобразует электрическую энергию в механическую энергию (вращения). Двигатели постоянного тока используют для своей работы постоянный ток. Основной принцип работы подобного двигателя заключается в том, чтобы обеспечивать взаимодействие между магнитным полем и электрическим током с целью производства силы, которая будет вращать двигатель. То есть когда электрический  ток проходит через проводник, находящийся в магнитном поле, генерируется магнитная сила (напряженность магнитного поля), которая формирует вращающий момент для двигателя. Направление вращения двигателя контролируется с помощью направления электрического тока. Скоростью вращения можно управлять с помощью приложенного значения напряжения и, поскольку микроконтроллеры AVR имеют контакты с  PWM (ШИМ, широтно-импульсной модуляцией), то их можно использовать для управления скоростью вращения двигателей постоянного тока.

Внешний вид двигателей постоянного тока приведен на следующем рисунке.

Внешний вид двигателей постоянного тока

Как правило, двигатель постоянного тока состоит из трех основных частей, которые показаны на рисунке ниже: внешнюю (неподвижную) часть двигателя, которая представляет собой стационарный магнит (статор), а на валу внутри статора располагается подвижная часть двигателя, состоящая из ротора и коллектора.

Внутреннее устройство двигателей постоянного тока

Ротор несет на себе проволочные катушки (обмотки) — на рисунке показаны три такие катушки , намотанные вокруг трех фасонных фрагментов ротора и подсоединенные к коллектору. Назначение коллектора — поочередно возбуждать по мере вращения ротора в его обмотках магнитное поле с тем, чтобы следующая обмотка всегда подтягивалась к постоянным магнитам статора, в результате чего ротор бы вращался.

Коллектор представляет собой сегментированное кольцо (на рисунке показаны три сегмента), а щетки служат для подключения питающих контактов к отдельным сегментам коллектора по мере того, как коллектор вращается вместе с ротором.

Необходимые компоненты

  1. Микроконтроллер ATmega16
  2. Источник питания с напряжением 5 Вольт
  3. Программатор AVR-ISP, USBASP или другой подобный
  4. Двигатель постоянного тока (на напряжение 5 В)
  5. Драйвер мотора L293D
  6. Кварцевый генератор на 16 МГц
  7. Конденсатор 100 нФ (2 шт.)
  8. Конденсатор 22 пФ (2 шт.)
  9. Кнопка (2 шт.)
  10. Соединительные провода
  11. Макетная плата
  12. Светодиод

Работа схемы

Схема устройства приведена на следующем рисунке.

Схема подключения двигателя постоянного тока к микроконтроллеру AVR ATmega16

Программирование микроконтроллера Atmega16 для управления двигателем постоянного тока

Мы будем программировать микроконтроллер Atmega16 с помощью программатора USBASP и программы Atmel Studio7.0. Полный текст программы приведен в конце данной статьи. Две кнопки в приведенной схеме используются для задания направления вращения двигателя – по часовой стрелке или против часовой стрелки. Двигатель постоянного тока подключается к микроконтроллеру при помощи драйвера мотора L293D. Двигатель постоянного тока будет вращаться в одном из направлений в зависимости от того какая кнопка нажата.

Драйвер мотора L293D

Но сначала необходимо подключить все нужные нам библиотеки и задать частоту работы микроконтроллера.

#define F_CPU 16000000UL
#include<avr/io.h>
#include<util/delay.h>

Затем определим переменную, которая будет задавать направление вращения двигателя в зависимости от того, какая кнопка будет нажата.

int i;

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

DDRA = 03;
PORTA &= ~(1<<1);
PORTA &= ~(1<<0);

Проверяем нажата ли 1-я кнопка, подключенная к PORTA4 микроконтроллера Atmega16, и сохраняем статус этой кнопки в соответствующей переменной.

if(!bit_is_clear(PINA,4))
{
i = 1;
PORTA &= ~(1<<1);
_delay_ms(1000);
}

Аналогично поступаем и со второй кнопкой.

else if (!bit_is_clear(PINA,5))
{
i = 2;
PORTA &= ~(1<<0);
_delay_ms(1000);
}

Если статус 1-й кнопки равен «1» (то есть она нажата), то вращаем двигатель по часовой стрелке, а если нажата вторая кнопка – то тогда вращаем двигатель против часовой стрелки.

if (i == 1)
{
PORTA |= (1<<0);
PORTA &= ~(1<<1);
}
else if (i == 2)
{
PORTA |= (1<<1);
PORTA &= ~(1<<0);
}

Вы можете подключить двигатель постоянного тока к любым свободным контактам микроконтроллера общего назначения. Но необходимо использовать драйвер мотора чтобы уменьшить нагрузку на микроконтроллер поскольку микроконтроллер сам по себе не способен обеспечить необходимый для запуска двигателя ток.

Исходный код программы на языке С (Си) с пояснениями

Программа для рассматриваемой схемы управления двигателем постоянного тока с помощью микроконтроллера AVR ATmega16 представлена следующим фрагментом кода на языке С (Си). Комментарии к коду программу поясняют принцип работы отдельных команд.

#define F_CPU 16000000UL // задаем частоту микроконтроллера
#include<avr/io.h>
#include<util/delay.h>

int i; // определяем переменную, в которой будем хранить номер нажатой кнопки
int main(void)
{
//DDR – регистр направления данных
DDRA = 03; // конфигурируем контакты PORTA0,1 на вывод, а Rest – на ввод
// подаем на контакты PORTA0 и PORTA1 низкий уровень чтобы предотвратить вращение двигателя до того момента пока не будет нажата одна из кнопок
PORTA &= ~(1<<1);
PORTA &= ~(1<<0); while(1)
{
if(!bit_is_clear(PINA,4)) // проверяем нажата ли кнопка подключенная к PORTA4
{
i = 1; // сохраняем номер этой кнопки в переменной i
PORTA &= ~(1<<1);
_delay_ms(1000);
}
else if (!bit_is_clear(PINA,5)) // проверяем нажата ли кнопка подключенная к PORTA5 {
i = 2; // сохраняем номер этой кнопки в переменной i
PORTA &= ~(1<<0);
_delay_ms(1000);
}

if (i == 1) // если 1-я кнопка нажата
{
PORTA |= (1<<0); // вращаем двигатель по часовой стрелке
PORTA &= ~(1<<1);
}
else if (i == 2) // если 2-я кнопка нажата
{
PORTA |= (1<<1); // вращаем двигатель против часовой стрелки
PORTA &= ~(1<<0);
}
}
}

Видео, демонстрирующее работу схемы

(1 голосов, оценка: 5,00 из 5)
Загрузка...
242 просмотров

Комментарии

Подключение двигателя постоянного тока к микроконтроллеру AVR ATmega16 — 2 комментария

  1. Здравствуйте! Спасибо за интересный урок. Нельзя ли расширить тематику с двигателями постоянного тока. Меня очень интересует создание защиты двигателя, например, отключение мотор-редуктора при превышении поднимаемого веса. Срабатывание защиты не от механики, а именно по параметру тока.
    Еще интересует создание информационного табло с высвечиванием ошибки в зависимости от принятого сигнала(например, от концевика).

    • Здравствуйте, спасибо за то, что оценили мой труд. К сожалению я сам пока не могу самостоятельно проектировать подобные системы. Статьи я перевожу с авторитетных иностранных сайтов — считаю что это тоже полезный труд потому что в англоязычном интернете информации на тему микроконтроллеров значительно больше чем в русскоязычном сегменте интернета. Да, я обладаю определенными знаниями и в электронике, и в принципах работы микроконтроллеров, и в программировании и я понимаю те статьи, которые я перевожу, но пока уровня чтобы самостоятельно проектировать подобные схемы, я не достиг, потому что плотно начал заниматься этой тематикой всего несколько месяцев назад.
      Если вы найдете ту статью, которая вам нужна, в англоязычном сегменте интернета, то я могу перевести ее и разместить здесь на сайте. К сожалению, пока могу оказать только подобную помощь в вашей проблеме. Ну или хотя бы название на английском укажите что примерно искать, я попробую сам найти статью на такую тему

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *