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

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

Подключение к Arduino.

     Motor Shield разработан на базе микросхемы L298N. Позволяет управлять двумя моторами постоянного тока, либо одним шаговым двигателем. Максимальный потребляемый ток не должен превышать 2 Ампера. 

     В отличие от известной микросхемы L293D, в более мощный драйвер L298N не встроены защитные диоды. Их необходимо устанавливать в обвязку микросхемы дополнительно. На обозреваемом модуле мы можем увидеть эти диоды (4 штуки слева и 4 справа от микросхемы).

     По выполняемым функциям  L298N и L293D схожи чуть более чем полностью. Имеются те же управляющие выводы – IN1 и IN2, IN3 и IN4, ENA и ENB. Чередование сигналов разного уровня (высокий и низкий логический уровень) на парах выводов задаёт направление вращения моторов.

     Выводы ENA (привязан к IN1 и IN2) и ENB (привязан к IN3 и IN4) отвечают за раздельное управление каналами. Могут использоваться в двух режимах:

1.       Активный режим. Управление возлагается на контроллер (рис.а1). Высокий логический уровень разрешает вращение моторов, низкий запрещает, при этом уровни сигнала на выводах “IN” не имеет значения. Подавая на выводы “EN” ШИМ (PWM) сигнал, можно управлять скоростью вращения моторов.

2.       Пассивный режим. Подключение выводов “EN” к высокому уровню (+5 Вольт). Для этого на плате с помощью джамперов замыкаем штырьки +5V и EN, как показано на рис.а2. В таком режиме мы уже не сможем регулировать скорость двигателей, они всегда будут работать на полной скорости. Зато мы экономим два вывода микроконтроллера. Направление вращение по-прежнему задаётся состоянием выводов “IN”. А вот чтобы остановить двигатель, на парные выводы “IN” подаём сигнал одного уровня. В примерах программного кода в конце статьи все эти моменты подробно пояснены в комментариях.

     Разъём для подачи питания и работа стабилизатора.

  Подключение моторов к модулю L298N

   В первом примере рассмотрим подключение одного мотора без регулировки скорости. 

     Программный код:


int IN3 = 5; // Input3 подключен к выводу 5
int IN4 = 4;

void setup()
{
pinMode (IN4, OUTPUT);
pinMode (IN3, OUTPUT);
}
void loop()
{
// На пару выводов "IN" поданы разноименные сигналы, мотор вращается
digitalWrite (IN4, HIGH);
digitalWrite (IN3, LOW);
delay(4000);
// На пару выводов "IN" поданы одноименные сигналы, мотор не вращается
digitalWrite (IN4, LOW);
delay(500);
// На пару выводов "IN" поданы разноименные (и уже противоположные относительно первого случая) сигналы, мотор вращается
// относительно первого случая) сигналы, мотор вращается в другую сторону
digitalWrite (IN3, HIGH);
delay(4000);
// Снова на выводах "IN" появились одноименные сигналы, мотор не вращается
digitalWrite (IN3, LOW);
delay(5000);
}

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Во втором примере подсоединим ENB к выводу ШИМ (D3). Таким образом мы задействуем возможность драйвера управлять скоростью, меняя скважность ШИМ сигнала. Значение скважности устанавливается функцией analogWrite(pin, ЗНАЧ), где ЗНАЧ изменяется от 0 до 255, прямо пропорционально скважности сигнала. В скетче подобраны четыре значения, при которых двигатель стартует с низких оборотов, набирает средние, затем высокие и останавливается.

   Программный код:


int IN3 = 5; // Input3 подключен к выводу 5 
int IN4 = 4;
int ENB = 3;
void setup()
{
 pinMode (ENB, OUTPUT); 
 pinMode (IN3, OUTPUT);
 pinMode (IN4, OUTPUT);
}
void loop()
{
  // На пару выводов "IN" поданы разноименные сигналы, мотор готов к вращению
  digitalWrite (IN3, HIGH);
  digitalWrite (IN4, LOW);
  // подаем на вывод ENB управляющий ШИМ сигнал 
  analogWrite(ENB,55);
  delay(2000);
  analogWrite(ENB,105);
  delay(2000);
  analogWrite(ENB,255);
  delay(2000);
  // Останавливаем мотор, подав на вывод ENB сигнал низкого уровня. 
  // Состояние выводов "IN" роли не играет.
  analogWrite(ENB,0);
  delay(5000);
}

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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

   Программный код:


int IN1 = 5; // Input1 подключен к выводу 5 
int IN2 = 4;
int IN3 = 3;
int IN4 = 2;
int ENA = 9;
int ENB = 3;
int i;
void setup()
{
  pinMode (EN1, OUTPUT);
  pinMode (IN1, OUTPUT);
  pinMode (IN2, OUTPUT);
  pinMode (EN2, OUTPUT);
  pinMode (IN4, OUTPUT);
  pinMode (IN3, OUTPUT);
}
void loop()
{
  digitalWrite (IN2, HIGH);
  digitalWrite (IN1, LOW); 
  digitalWrite (IN4, HIGH);
  digitalWrite (IN3, LOW); 
  for (i = 50; i <= 180; ++i)
  {
      analogWrite(EN1, i);
      analogWrite(EN2, i);
      delay(30);
  }
  analogWrite (EN1, 0);
  analogWrite (EN2, 0);
  delay(500);
  digitalWrite (IN1, HIGH);
  digitalWrite (IN2, LOW); 
  digitalWrite (IN3, HIGH);
  digitalWrite (IN4, LOW);
  for (i = 50; i <= 180; ++i)
  {
      analogWrite(EN1, i);
      analogWrite(EN2, i);
      delay(30);
  }
  analogWrite (EN1, 0);
  analogWrite (EN2, 0);
  delay(8000);
}

     Ещё немного информации о разгоне двигателей с помощью выводов ENABLE. При старте двигатель потребляет ток  в среднем в 4-6 раз больше номинального, а при резком реверсе ещё больше. Такой скачок можно снизить или вообще убрать, если разгонять двигатель плавно в течение какого-то промежутка времени. В приведённом выше скетче как раз продемонстрирован такой подход.