Драйвер двигателя L298N

Материал из MIK32 микроконтроллер
Внешний вид драйвера L298N

L298N - драйвер коллекторных двигателей на 2 канала, который может также применяться для управления одним шаговым мотором. Представляет собой полный H-мост, главная функция которого — менять полярность на нагрузке. Если в качестве нагрузки будет мотор постоянного тока, то смена полярности приведет к смене направления его вращения.

Драйвер позволяет просто и понятно управлять скоростью вращения моторов в обоих направлениях с помощью ШИМ (раздельно для каждого мотора).

Спецификация модуля L298N:

  • напряжение питания двигателей: до 35 В;
  • рабочий ток (на каждый канал): 2 А;
  • периодический ток (80% — вкл, 20% — выкл): 2,5 А;
  • кратковременный ток: 3 А;
  • вес: 33 г.

Контакты драйвера

  • OUT1 и OUT2 – разъёмы для подключения первого щёточного двигателя или  первой обмотки шагового двигателя;
  • OUT3 и OUT4 – разъёмы для подключения второго щёточного двигателя или  второй обмотки шагового двигателя;
  • VSS – вход для питания двигателей (максимальный уровень +35V);
  • GND – общий провод (не забываем соединить с аналогичным входом Arduino!!!);
  • Vs – вход для питания логики +5V. Через него непосредственно запитывается сама микросхема L298N. Есть ещё второй способ питания, при котором 5V для L298N берётся от встроенного в модуль стабилизатора напряжения. В таком случае на разъём подаётся только питание для двигателей (Vss), контакт Vs остаётся не подключенным, а на плате устанавливается перемычка питания от стабилизатора, который ограничит питающее моторы напряжение до приемлемых 5V.
  • IN1, IN2 – контакты управления первым щёточным двигателем или первой обмоткой шагового двигателя.
  • IN3, IN4 – контакты управления вторым щёточным двигателем или второй обмоткой шагового двигателя.
  • ENA, ENB –  контакты для активации/деактивации первого и второго двигателей или соответствующих обмоток ШД. Подача логической единицы на эти контакты разрешает вращение двигателей, а логический ноль – запрещает. Для изменения скорости вращения щёточных моторов на эти контакты подаётся ШИМ-сигнал. Для работы с шаговым двигателям, как правило, на эти контакты ставят перемычки, обеспечивающие постоянную подтяжку к +5V.

Логика микросхемы L298N питается напряжением 5 Вольт. Для этого на модуле предусмотрен стабилизатор напряжения 78M05. На вход этого стабилизатора можно подавать напряжение до 35 В, а на выходе всегда получается 5 В. Рабочий ток у 78M05 небольшой — до 500 мА.

Назначение элементов и контактов драйвера L298N

Тройная клемма снизу отвечает за питание модуля. Самый левый контакт — питание моторов. Сюда можно подавать до 35 В. Средний контакт — земля, которая должна быть общей для модуля и контроллера. Правый контакт имеет двоякую функцию. Если на модуле стоит перемычка питания стабилизатора, то на этом контакте будет +5В и к нему можно ничего не подключать, либо питать от него контроллер. Но если перемычку убрать, то к этому контакту нужно будет непременно подключить +5В от контроллера, чтобы питать драйвер.

Две другие винтовые клеммы (OUT1/2 и OUT 3/4) служат для подключения моторов. Надо отметить, что моторы постоянного тока неполярные, но от того на какой контакт мотора подается плюс, а на какой минус, зависит направление их вращения.

Контакты управления

Контактов по три штуки на каждый мотор. Контакты ENA и ENB позволяют управлять моторами с помощью ШИМ сигнала. Если ENA и ENB подключить строго к +5 В, то моторы будут всегда вращаться с максимальной возможной скоростью. Именно для этого режима на модуле предусмотрены две перемычки рядом с ENA и ENB.

С помощью контактов IN1,IN2,IN3,IN4 задаётся режим работы моторов. Таблица режимов для двигателя A имеет вид:

Режим работы IN1 IN2
Вращение в одну сторону 1 0
Вращение в обратную сторону 0 1
Блокировка мотора 1 1
Отключение мотора 0 0

Если нам необходимо резко остановить мотор, то выбираем режим блокировки. Для плавной остановки — выбираем «отключение мотора»

Подключение драйвера L298N к Arduino uno

Схема подключения драйвера к Arduino uno

Для управления скоростью вращения, уберем перемычку с контакта ENA.

Перемычка питания стабилизатора установлена на драйвере. Поэтому arduino можно запитать от вывода +5В.

Программа для драйвера мотора L298N

Программа, которая вращает мотор в одну сторону 3 секунды с максимальной скоростью, и затем 3 секунды в обратную сторону с более медленной скоростью.

Внешний вид макета
byte ena = 3;
byte in1 = 4;
byte in2 = 5;
void setup() {
    pinMode(ena, OUTPUT);
    pinMode(in1, OUTPUT);
    pinMode(in2, OUTPUT);
}
void loop() {
    // выставляем 100% мощность на моторе А - 255 из 255
    analogWrite(ena, 255);
    // выставляем режим мотора - вращение по часовой
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    delay(3000); // пауза 3сек

    // выставляем мощность на мотора А - 150 из 255
    analogWrite(ena, 150);
    // режим мотора - вращение против часовой
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    delay(3000); // пауза 3сек
}
Внешний вид макета с двумя двигателями

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

Перемычки на контактах ENA и ENB убраны - можно менять скорость вращения.

Перемычка питания стабилизатора на драйвере убрана. Драйвер не питает Arduino.

byte ena = 9;
byte in1 = 7;
byte in2 = 6;
byte enb = 3;
byte in3 = 5;
byte in4 = 4;
void setup() {
    pinMode(ena, OUTPUT);
    pinMode(in1, OUTPUT);
    pinMode(in2, OUTPUT);
    pinMode(enb, OUTPUT);
    pinMode(in3, OUTPUT);
    pinMode(in4, OUTPUT);
}
void loop() {
    // выставляем 100% мощность на моторе А - 255 из 255
    analogWrite(ena, 255);
    // выставляем 100% мощность на моторе B - 255 из 255
    analogWrite(enb, 255);
    // выставляем режим моторов - вращение по часовой
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);
    delay(3000); // пауза 3сек

    // выставляем мощность на мотора А - 150 из 255
    analogWrite(ena, 150);
    // выставляем мощность на мотора B - 150 из 255
    analogWrite(enb, 150);
    // режим моторов - вращение против часовой
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
    delay(3000); // пауза 3сек
}