Для управления двигателями в электронных проектах в настоящее время находят применение разнообразные драйверы двигателей — с их помощью можно управлять как скоростью, так и направлением вращения двигателей. В данной статье мы рассмотрим основные принципы работы драйвера двигателей DRV8833 и его подключение к плате Arduino. DRV8833, является, может быть, не самым популярным драйвером двигателей, как, к примеру L293D, но в некоторых случаях его использование является более предпочтительным чем применение других аналогичных драйверов — по крайней мере, она очень дешево стоит.
Ранее на нашем сайте мы рассматривали подключение к плате Arduino и других драйверов двигателей:
Необходимые компоненты
- Плата Arduino Pro Mini (купить на AliExpress).
- Драйвер двигателя DRV8833 (купить на AliExpress).
- Двигатели постоянного тока.
Управление двигателем постоянного тока с помощью микроконтроллера
Для управления двигателями постоянного тока с помощью микроконтроллеров в современной схемотехнике используется ШИМ (широтно-импульсная модуляция) и устройства под названием H-мосты. ШИМ применяется для управления скоростью вращения вращения двигателя, а H-мосты — для управления направлением его вращения.
ШИМ для управления скоростью вращения двигателя
Для того чтобы изменить скорость вращения двигателя постоянного тока необходимо изменить амплитуду входного напряжения, подаваемого на двигатель. Распространенным методом для этого является ШИМ (широтно-импульсная модуляция). Регулируя величину цикла занятости/коэффициента заполнения (duty cycle) ШИМ можно изменять среднюю величину напряжения ШИМ и, следовательно, управлять скоростью вращения двигателя.
Чем больше значение коэффициента заполнения, тем выше среднее значение напряжения, подаваемого на двигатель постоянного тока (что приводит к более высокой скорости его вращения), а чем меньше значение коэффициента заполнения, тем ниже среднее значение напряжения, подаваемого на двигатель (что приводит к более низкой скорости его вращения).
Управление направлением вращения двигателя с помощью H-моста
Чтобы изменить направление вращения двигателя необходимо изменить полярность приложенного к нему напряжения. Один из наиболее простых способов сделать это — использование H-моста. По своей структуре H-мост состоит из 4-х переключателей (обычно это MOSFET транзисторы). Принцип действия H-моста наглядно показан на следующем видео.
Замкнув/включив два противоположных переключателя H-моста, мы можем изменить направление протекание тока, тем самым изменив направление вращения двигателя.
Микросхема драйвера двигателей DRV8833
Общие принципы работы
DRV8833 представляет собой двухканальную микросхему драйвера двигателей, способную управлять двумя двунаправленными двигателями или одним шаговым двигателем. Блок выходного драйвера каждого H-моста состоит из N-канальных мощных МОП-транзисторов, сконфигурированных как H-мост для управления обмотками двигателя. Каждый H-мост включает в себя схему для регулирования или ограничения тока обмотки. Данная микросхема может также использоваться для управления индуктивными нагрузками, такими как реле, соленоиды, двигатели постоянного тока и биполярные шаговые двигатели.
Структурная схема микросхемы DRV8833 приведена на следующем рисунке.
Устройство объединяет два Н-моста NMOS и схему регулирования тока. DRV8833 может питаться от напряжения питания от 2,7 до 10,8 В и может обеспечивать выходной ток до 1,5 А (среднеквадратичное значение). Устройство также имеет спящий режим с низким энергопотреблением, который позволяет системе экономить энергию, когда двигатель не работает.
Распиновка драйвера двигателя DRV8833
Распиновка микросхемы драйвера двигателя DRV8833 приведена на следующем рисунке. Всего она содержит 12 контактов.
EEP — контакт спящего режима модуля. При подаче на него high позволяет использовать модуль в обычном режиме, если low — модуль будет работать в спящем режиме
OUT(1-2) — выходы 1 и 2 внутреннего H-моста A.
OUT(3-4) — выходы 1 и 2 внутреннего H-моста B.
IN(1-2) — входы 1 и 2 внутреннего H-моста A.
IN(3-4) — входы 1 и 2 внутреннего H-моста B.
ULT — модуль неисправности микросхемы. На нем будет уровень low если условия работы микросхемы недопустимы (перегрев по температуре, перегрузка по току).
VCC — подача питания на модуль. Допустимое максимальное напряжение питания — 11.8V.
GND — контакт общего провода (земли) микросхемы).
Компоненты драйвера двигателя DRV8833
Основные компоненты драйвера двигателя DRV8833 показаны на следующем рисунке.
Как можно видеть из рисунка, в середине модуля находится микросхема DRV8833, также плата модуля содержит три обходных конденсатора, танталовый конденсатор 10 мкФ для входа, конденсатор 2,2 мкФ для вывода VINT и конденсатор 0,1 мкФ для вывода VCP. Также на модуле есть встроенный индикатор питания с токоограничивающим резистором 4,7 кОм
Схема драйвера двигателя DRV8833
Схема модуля драйвера двигателей DRV8833 показана на следующем рисунке.
Как вы можете видеть из представленного рисунка, на схеме показано соединение всех развязывающих конденсаторов с микросхемой, также показано соединение для штырькового разъема, а рядом с заголовком вы можете увидеть названия выводов на печатной плате. На печатной плате модуля, кроме того, имеется светодиод в качестве индикатора, с токоограничивающим резистором, включенным последовательно с ним.
Наиболее часто задаваемые вопросы про драйвер двигателя DRV8833
В чем разница между модулями L293D и DRV8833?
L293D и DRV8833 являются микросхемами драйверов двигателей, но у них есть различия. Обе микросхемы имеют максимальный ток 1,5 А, но рабочее напряжение микросхемы DRV8833 составляет 11,8 В, тогда как рабочее напряжение L293D составляет 40 В.
Могу ли я запустить шаговый двигатель с DRV8833?
Да, микросхема DRV8833 может управлять шаговыми двигателями. Но управление с помощью микрошагов невозможно с этой микросхемой, поэтому вам понадобится специальная микросхема драйвера.
Могу ли я подключить 4 двигателя к DRV8833?
DRV8833 предназначен для управления двумя двигателями постоянного тока. Если вы хотите управлять 4 двигателями, то это возможно если вы пожертвуете управлением направления вращения.
Схема проекта
Схема подключения драйвера двигателя DRV8833 к плате Arduino показана на следующем рисунке.
На схеме мы соединили модуль DRV8833 с платой Arduino Pro Mini и подключили ее контакты 9,6,5,3 к контактам IN1, IN2, IN3, IN4 модуля, а выходные контакты модуля подключили к двигателям. Переключатель подключен к контакту 10 Arduino Pro Mini; этот переключатель используется для изменения направления вращения. Для управления скоростью двигателей у нас в схеме есть два потенциометра, и мы питаем схему от батареи 8,4 В.
Внешний вид собранной конструкции проекта приведен на следующем рисунке.
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Первым делом в коде программы объявим все используемые контакты.
1 2 3 4 5 |
#define mode_pin 10 #define IN1_PIN 9 #define IN4_PIN 6 #define IN3_PIN 5 #define IN4_PIN 3 |
Далее, в функции setup, зададим режимы работы используемых контактов.
1 2 3 4 5 6 7 8 9 10 11 |
void setup() { pinMode(IN1_PIN, OUTPUT); pinMode(IN4_PIN, OUTPUT); pinMode(IN3_PIN, OUTPUT); pinMode(IN4_PIN, OUTPUT); pinMode(mode_pin, INPUT); digitalWrite(IN1_PIN, LOW); digitalWrite(IN4_PIN, LOW); digitalWrite(IN3_PIN, LOW); digitalWrite(IN4_PIN, LOW); } |
Затем, в функции loop, мы будем проверять положение переключателя. Если оно high, то мы будем вращать двигатель по часовой стрелке, если оно low, то мы будем вращать двигатель против часовой стрелки. Также мы будем использовать функцию analogRead() для считывания значения с выхода АЦП и функцию analogWrite() для формирования ШИМ сигнала.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
void loop() { int sensorValue = analogRead(A0); int sensorValue1 = analogRead(A1); if (digitalRead(mode_pin) == LOW) { digitalWrite(IN3_PIN, LOW); analogWrite(IN4_PIN, sensorValue); digitalWrite(IN1_PIN, LOW); analogWrite(IN4_PIN, sensorValue1); } if (digitalRead(mode_pin) == HIGH) { digitalWrite(IN4_PIN, LOW); analogWrite(IN3_PIN, sensorValue); digitalWrite(IN4_PIN, LOW); analogWrite(IN1_PIN, sensorValue1); } } |
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#define mode_pin 10 #define IN1_PIN 9 #define IN4_PIN 6 #define IN3_PIN 5 #define IN4_PIN 3 void setup() { pinMode(IN1_PIN, OUTPUT); pinMode(IN4_PIN, OUTPUT); pinMode(IN3_PIN, OUTPUT); pinMode(IN4_PIN, OUTPUT); pinMode(mode_pin, INPUT); digitalWrite(IN1_PIN, LOW); digitalWrite(IN4_PIN, LOW); digitalWrite(IN3_PIN, LOW); digitalWrite(IN4_PIN, LOW); } void loop() { int sensorValue = analogRead(A0); int sensorValue1 = analogRead(A1); if (digitalRead(mode_pin) == LOW) { digitalWrite(IN3_PIN, LOW); analogWrite(IN4_PIN, sensorValue); digitalWrite(IN1_PIN, LOW); analogWrite(IN4_PIN, sensorValue1); } if (digitalRead(mode_pin) == HIGH) { digitalWrite(IN4_PIN, LOW); analogWrite(IN3_PIN, sensorValue); digitalWrite(IN4_PIN, LOW); analogWrite(IN1_PIN, sensorValue1); } } |