Подключение двигателя постоянного тока к микроконтроллеру 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)
Загрузка...
19 просмотров


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

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