Подключение драйвера A4950 к Arduino UNO
Введение
Сегодня расскажу о драйвере A4950, с помощью которого можно одновременно управлять двумя двигателями постоянного тока с применением широтно-импульсной модуляции, а также менять направление вращения моторов. Устройство рассчитано на максимальную нагрузку до 3,5 ампера и поддерживает максимальное напряжение питания до 40 вольт.

Технические характеристики
- Напряжение питание: 7.6 ~ 40 В;
- Максимальный ток: 3.5 А (ограничено на 2А);
- Габариты: 24 х 19 мм;
- Вес: 3 грамма
Описание
Модуль собран на базе двух микросхем A4950T, установленных на компактной плате размером 24×19 мм. У каждой микросхемы установлен токоограничивающий резистор номиналом 25 Ом, а так же фильтрующими конденсаторами по питанию.

Микросхема A4950 предназначена для управления двигателями постоянного тока. Все выходные драйверы реализованы на основе N-канальных МОП-транзисторов, выполненных по технологии DMOS. Ток в выходном полномостовом преобразователе контролируется схемой управления с использованием широтно-импульсной модуляции (ШИМ) с фиксированным временем выключения. Управление осуществляется двумя входами (IN1 и IN2).

Схема защиты микросхемы предусматривает встроенную тепловую защиту, а также автоматическое отключение при коротком замыкании нагрузки, выходе на короткое замыкание на массу («землю») или на источник питания.
Режим низкого потребления активируется автоматически, если на обоих управляющих входах (INx) удерживается низкий сигнал более 1 миллисекунды. В данном состоянии большинство внутренних цепей отключаются, включая схему заряда и регулятор напряжения. При выходе из режима ожидания необходимо сделать задержку 200 микросекунд.
Максимально возможный ток определяется сопротивлением внешнего резистора RS и уровнем опорного напряжения VREF.
Назначение контактов
► GND — общий контакт, минус;
► VM — питание двигателя, до 40В;
► VCC — питание логики 5В;
► AIN2 — вход управления первым двигателем;
► AIN1 — вход управления первым двигателем;
► BOUT1 — выход второго двигателя;
► BOUT2 — выход второго двигателя;
► VM — питание двигателя;
► VCC — питание микросхемы 5В;
► BIN2 — вход управления первым двигателем;
► BIN1 — вход управления первым двигателем;
► AOUT1 — выход первого двигателя;
► AOUT2 — выход первого двигателя;
Подключение драйвера A4950 к Arduino
В качестве примера приведу схему подключения драйвера A4950 к плате Arduino UNO и подготовлю простой скетч, с помощью которого мы сможем менять скорость вращения двигателя, а также изменять направление вращения.
Необходимые детали
- Контроллер Arduino UNO R3 x 1 шт.
- Провода DuPont, 2,54 мм, 20 см x 1 шт.
- Драйвер A4950 x 1 шт.
- Мотор 12В x 2 шт.
- Блок питания 12В 2А х 1 шт.
Подключение
Схема подключения несложная, входа BIN1, BIN2, AIN1, AIN2 с драйвера A4950 подключаем к выводам D12, D11, D5, D6 платы Arduino UNO соответственно. Затем подключаем питание микросхем, выводы VCC и GND к контактам +5V и GND. Два мотора подключаем к выходам AOUT1, AOUT2, BOUT1 и BOUT2. Далее осталось подключить питание моторов, вывод VM и GND подключаем с блоком питания GND и 12В. Проверяем еще раз схему и приступаем к загрузке скетча.

Программа
Открываем среду разработки Arduino IDE и загружаем первую программу в Arduino UNO.
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
const int IN1 = 12; // Управляющий вывод мотора 2 const int IN2 = 11; // Управляющий вывод мотора 2 const int IN3 = 5; // Управляющий вывод мотора 1 const int IN4 = 6; // Управляющий вывод мотора 1 void setup() { pinMode(IN1, OUTPUT); // Установка вывода как как выходы pinMode(IN2, OUTPUT); // Установка вывода как как выходы pinMode(IN3, OUTPUT); // Установка вывода как как выходы pinMode(IN4, OUTPUT); // Установка вывода как как выходы } void loop() { // Двигатель №1 вращается вперед digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); delay(1000); // Ждем секунду // Останов двигателя №1 digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); delay(1000); // Ждем секунду // Двигатель №1 вращается назад digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); delay(1000); // Ждем секунду // Останов двигателя №1 digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); delay(1000); // Ждем секунду // Двигатель №2 вращается вперед digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); delay(1000); // Ждем секунду // Останов двигателя №2 digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); delay(1000); // Ждем секунду // Двигатель №2 вращается назад digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); delay(1000); // Ждем секунду // Останов двигателя №2 digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); delay(1000); // Ждем секунду // ШИМ первого двигателя for(int speed = 0; speed <= 255; speed++) { // Увеличиваем скорость от нуля до максимума analogWrite(IN1, speed); // Устанавливаем скорость delay(10); // Небольшая задержка для плавности разгона } // Останов двигателя №1 digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); delay(1000); // Ждем секунду // ШИМ второго двигателя for(int speed = 0; speed <= 255; speed++) { // Увеличиваем скорость от нуля до максимума analogWrite(IN3, speed); // Устанавливаем скорость delay(10); // Небольшая задержка для плавности разгона } // Останов двигателя №1 digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); delay(1000); // Ждем секунду } |
Описание программы:
Первым делом указываем, к каким контактам подключены выходы от драйвера.
1 2 3 4 |
const int IN1 = 12; const int IN2 = 11; const int IN3 = 5; const int IN4 = 6; |
Далее указываем, что выводы используются как выходы.
1 2 3 4 |
pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); |
В основном цикле программы вращаем двигатель сначала вперёд одну секунду, затем делается пауза на одну секунду, после этого двигатель вращается назад также одну секунду, затем делаем паузу одну секундой паузы. Эта последовательность действий повторяется для второго двигателя аналогичным образом.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); delay(1000); digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); delay(1000); digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); delay(1000); digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); delay(1000); |
Следующая функция предназначена для управления скоростью двигателя
1 2 3 4 |
for(int speed = 0; speed <= 255; speed++) { analogWrite(IN3, speed); delay(10); } |
