Arduino сбрасывается или зависает во время работы, только когда подключены двигатели постоянного тока

Я использую Arduino, подключенную к 2 двигателям постоянного тока через L298N. Arduino питается от батареи 9 В, а L298N питается от 4 батареек типа АА. есть также переключатель, который запускает движение.

Я добавил операторы печати для отладки, один в настройке, один в начале цикла и два до и после запуска, чтобы я знал, когда запускаются моторы и как долго они работают. Я также печатаю состояние переключателя. вот что я получаю:

1                          // состояние переключения. 1 означает выкл.
loop                       // начало оператора цикла
1
loop
0                          // состояние переключателя изменено на включено
0                          // добавлена еще одна проверка переключения после if
Forward for: 5 seconds     // двигатели включены
setup                      // сброс по какой-то причине
loop                       // начало цикла
0                          // включить еще
setup                      // очередной сброс
loop                      
0
0
Forward for: 5 seconds     // двигатель снова запускается
setup                      // очередной сброс
loop
0
0
Forward for: 5 seconds     // застрял с включенными двигателями, сбросов больше нет

это не всегда так плохо, иногда он работает один или два раза правильно (в течение пяти секунд), а затем выключается. иногда он зависает без сброса. Кроме того, иногда он начинает считывать значение переключателя как 1 через несколько секунд после считывания правильного значения, даже если переключатель не был перемещен. Кроме того, когда я удаляю один из аккумуляторов двигателя, чтобы они не получали питание, все работает отлично. Что вызывает сброс и зависание? Как это исправить?

это мой код:

#include <Arduino.h>
int RightSpeedPin = 5;
int Rdir2 = 6;
int Rdir1 = 7;
int led = 13;
int LeftSpeedPin = 10;
int Ldir2 = 8;
int Ldir1 = 9;
int SwitchPin = 4;
int ReadVal;
int baseSpeed = 230;
int Stime;
int Etime;

void go(int d) { // d = 1 будет двигаться, d = 0 остановится
  analogWrite(RightSpeedPin, (d == 1 ? 230 : 0));
  analogWrite(LeftSpeedPin, (d == 1 ? 255 : 0));
}

void forward(int t) {
  Serial.print("Forward for: ");
  Serial.print(t / 1000);
  Serial.println(" seconds");
  digitalWrite(Rdir1, HIGH);
  digitalWrite(Ldir1, HIGH);
  digitalWrite(Rdir2, LOW);
  digitalWrite(Ldir2, LOW);
  digitalWrite(led, HIGH);
  Stime = millis();
  while (millis() < Stime + t) {
    go(1);
  }
  go(0);
  Etime = millis();
  Serial.print("ran for ");
  Serial.println(Etime - Stime);
  digitalWrite(led, LOW);
}

void spin() {
  digitalWrite(Rdir1, LOW);
  digitalWrite(Rdir2, HIGH);
  digitalWrite(Ldir1, HIGH);
  digitalWrite(Ldir2, LOW);
  Stime = millis();
  while (millis() < Stime + 100) {
    go(1);
  }
  go(0);
}

void setup() {
  // поместите сюда код установки для однократного запуска:
  pinMode(Rdir1, OUTPUT);
  pinMode(Rdir2, OUTPUT);
  pinMode(RightSpeedPin, OUTPUT);
  pinMode(LeftSpeedPin, OUTPUT);
  pinMode(Ldir1, OUTPUT);
  pinMode(Ldir2, OUTPUT);
  pinMode(SwitchPin, INPUT_PULLUP);
  pinMode(led, OUTPUT);
  Serial.begin(9600);
  Serial.println("setup");
}

void loop() {  
  Serial.println("loop");
  ReadVal = digitalRead(SwitchPin);
  Serial.println(ReadVal);
  if (!ReadVal) {
    delay(500);
    Serial.println(ReadVal);
  // исходная ситуация - оба двигателя движутся вперед
    // работает 5 секунд
    forward(5000);
    delay(1000);
    spin();
  }
}

и это моя схема:

схема цепи

, 👍4

Обсуждение

Он тоже зависает, если снять моторы (не их аккумуляторы)?, @PMF

не пробовал, так как он не зависает, когда я вынимаю батарею. Я не думал, что их полное удаление может иметь другой результат., @young marx

Подтягивающие резисторы микропроцессора могут сильно различаться. Если вытягивание двигателей улучшает ожидаемое поведение, рассмотрите возможность добавления подтягивающего резистора 1 кОм (1 кОм/3 В = 3 мА) к переключателю включения/выключения. Если это улучшит ситуацию, попробуйте увеличить его до 10K (10K/3V = 0,3 мА). Поскольку вы хотите потреблять как можно меньший ток, чтобы продлить срок службы батареи. Кроме того, по возможности избегайте параллельной прокладки проводов аккумуляторов 9 В и 6 В., @st2000

@ st2000 проблема в том, что Arduino сбрасывается и зависает в середине работы, когда двигатели подключены, как вы думаете, почему здесь причиной является подтягивающий резистор? У меня не возникает проблем, когда двигатели не запитаны, а резистор все еще используется. 9В подключено к разъему ствола Arduino, 6В подключено к L298N и отрицательной шине. нет пересечения., @young marx

Это похоже на то, что драйвер двигателя вызывает падение напряжения на микроконтроллере, вызывая его зависание или перезагрузку. Вероятно, одна из цифровых линий потребляет слишком много энергии, что может быть вызвано неисправной платой драйвера двигателя., @PMF

Щеточные двигатели постоянного тока (предположим, что они используются) замыкают и разрывают контакт с индуктивной нагрузкой при каждом обороте. Это много шума! Большинство небольших двигателей поставляются с небольшими конденсаторами на входных клеммах для смягчения проблем. Схема выглядит правильно. И код активировал внутренний подтягивающий резистор на входе разрешения. Но если бы внутренний подтягивающий резистор был большим, шум мог вызвать достаточно высокое напряжение, чтобы неожиданно отключить двигатели. Или, возможно, при достаточном количестве шума процессор может увидеть достаточное изменение напряжения питания, чтобы неожиданно сбросить его., @st2000

L298 имеет пару биполярных транзисторов Дарлингтона на каждом выводе двигателя. Это приведет к падению напряжения на двигателе как минимум на 1,4 В или 2,8 В, что приведет к его обесточиванию. Оно сгорает в виде тепла, выделяемого вашей батареей. Кроме того, батарея дымовой сигнализации на 9 В — плохой выбор для питания Arduino, хотя во многих местах показано ее использование в качестве источника питания., @Gil


2 ответа


1

Когда речь идет о щеточных двигателях, я обычно думаю о дугогасительных колпачках на клеммах двигателя, колпачке на 100 мФ или больше на источнике питания двигателя, сплошных общих (GND) соединениях. Искрящие коллекторы двигателей могут вызвать всевозможные проблемы.

,

Я пробовал использовать конденсатор 4700 мкФ, 16 В, между драйвером двигателя и общей землей, это самый высокий F, который я мог получить, и это ничего не дало. стоит ли мне заказать более прочную крышку онлайн?, @young marx


2

L298 имеет пару биполярных транзисторов Дарлингтона на каждом выводе двигателя. Это приведет к падению напряжения как минимум на 1,4 В на каждом проводе или на 2,8 В на двигателе, что приведет к его обесточиванию. Это падение напряжения сжигается в виде тепла, которое выделяет ваша батарея. Батарея дымовой сигнализации напряжением 9 В — плохой выбор для питания Arduino, хотя во многих местах показано ее использование в качестве источника питания. Взгляните на эту ссылку, там есть несколько хороших графиков, показывающих, насколько велико будет падение напряжения. https://www.powerstream.com/9V-Alkaline-tests.htm Максимальное потребление тока Arduino R3 находится в диапазоне 200 мА. Попробуйте подключить несколько батарей 9 В параллельно, и если проблема исчезнет, то следует подключить батарею 9 В.

,