Arduino вылетает и перезагружается

Недавно я написал программу, которая должна изменять рабочий цикл, чтобы поддерживать напряжение обратной связи, измеренное на A0, A1, постоянным. Проблема в том, что Arduino начнет давать сбои через довольно постоянные промежутки времени, если он приблизится к целевому току. Я подтвердил, что после сбоя программа перезапускается (но через мгновение снова вылетает).

Вот пример последовательного вывода во время сбоя:

Current A: 65   Current B: 67   PWM A: 174.98   PWM B: 236.00
Current A: 65   Current B: 67   PWM A: 174.98   PWM B: 235.96
Current A: 65   Current B: 67   PWM A: 174.98   PWM B: 235.92
Current A: 64   Current B: 67   PWM A: 175.00   PWM B: 235.88
Current A: 64   Current B: 66   PWM A: 250.00   PWM B: 285114740000000000000000000.00
Current A: 0    Current B: 0    PWM A: 1.30     PWM B: 0.00
Current A: 0    Current B: 0    PWM A: 2.60     PWM B: 1.30
Current A: 0    Current B: 0    PWM A: 3.90     PWM B: 2.60
Current A: 0    Current B: 0    PWM A: 5.20     PWM B: 3.90

А вот весь мой код:

#include <MemoryFree.h>

//Программа для запуска в Вегетариуме
//Написано Леоном Тейхробом 06.12.2016

//Описание оборудования:
//- Генератор 2A и 2B для двух встроенных схем драйвера
//-Пин 13 подключен к светодиоду «пульса»
//-Каналы А(3) и В(11) измерения тока на А0 и А1

//Функциональность:
//-Каналы управления при заданном токе

float PWMA = 0;
float PWMB = 0;

int TARGETA = 65;
int TARGETB = 65;


void setup() {
  Serial.begin(115200);

  pinMode(3, OUTPUT);
  pinMode(11, OUTPUT);
  TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
  TCCR2B = _BV(CS20);
  OCR2A = (int)PWMA;
  OCR2B = (int)PWMB;
  digitalWrite(3, LOW);
  digitalWrite(11, LOW);

  delay(5000);
}

void loop() {
  int CURRENTA = analogRead(A0) / 4;

  if(CURRENTA < TARGETA) {
    PWMA += (TARGETA - CURRENTA) * 0.020f;
    if(PWMA > 250) {
      PWMA = 250;
    }
  }
  if(CURRENTA > TARGETA) {
    PWMA += (TARGETA - CURRENTA) * 0.020f;
    if(PWMA < 5) {
      PWMA = 5;
    }
  }

  int CURRENTB = analogRead(A1) / 4;

  Serial.println("Current A: " + (String)CURRENTA + "\t" + "Current B: " + (String)CURRENTB + "\t" + "PWM A: " + (String)PWMA + "\t" + "PWM B: " + (String)PWMB);
  //Serial.println("PWM A: " + (String)PWMA + "\t" + "PWM B: " + (String)PWMB);
  //Serial.print("freeMemory()=");
  //Serial.println(freeMemory());


  if(CURRENTB < TARGETB) {
    PWMB += (TARGETB - CURRENTB) * 0.020f;
    if(PWMB > 250) {
      PWMB = 250;
    }
  }
  if(CURRENTB > TARGETB) {
    PWMB += (TARGETB - CURRENTB) * 0.020f;
    if(PWMB < 5) {
      PWMB = 5;
    }
  }

  if(PWMA < 10) {
    digitalWrite(3, LOW);
  } else {
    analogWrite(3, (int)PWMA);
  }
  if(PWMB < 10) {
    digitalWrite(11, LOW);
  } else {
    analogWrite(11, (int)PWMB);
  }

  delay(40);
}

Моя схема также обеспечивает питание Arduino через простой стабилизатор напряжения 7815. Аналоговый вход не превышает нескольких вольт, а выходы ШИМ управляют двумя МОП-транзисторами логического уровня. Если необходима дополнительная информация о схеме, дайте мне знать!

РЕДАКТИРОВАТЬ: Я обнаружил, что это не ошибка в двух циклах обратной связи, потому что оба работают самостоятельно. Он выходит из строя, как только я использую обе петли обратной связи вместе. Насколько мне известно, между ними нет общих переменных или данных

, 👍0

Обсуждение

Я не вижу в вашем коде ничего ужасного. Возможно, проблема с памятью. Вы пробовали печатать без String? Например: Serial.print("Текущий A:"); Serial.print(CURRENTA); .... Это громоздко, но полезно для памяти., @Edgar Bonet

Я определенно могу попробовать, но на самом деле я написал последовательный код специально для устранения этой проблемы. Я также подозревал проблемы с памятью, но с помощью MemoryFree.h я обнаружил, что у меня все еще свободно> 1500 байт и нет утечек., @lte678

285114740000000000000000000 довольно странно. Кроме того, PWM B: 0.00 кажется невозможным для приведенного выше кода. Очень странно. (Вы добавили конденсаторы на выход 7805?), @Gerben

Сигнал ШИМ 0,0 возможен, поскольку он ограничен значением 5,0 только в том случае, если он _понижает_ рабочий цикл. Кроме того, у меня на выходе 7805 стоит конденсатор емкостью 0,1 мкФ, хотя он питается от лабораторного блока питания., @lte678

Целевой ток или целевое напряжение?, @Duncan C


1 ответ


Лучший ответ:

1

Наконец-то я понял: Arduino переходил в режим текущей защиты, вызывая его перезагрузку. После начала регулирования контакты, управляющие МОП-транзисторами, потребляли слишком большой ток из-за входной емкости BUZ11.

Чтобы решить проблему, мне просто пришлось добавить резисторы сопротивлением 120 Ом последовательно с затвором. Это замедлило активацию и деактивацию, что привело к уменьшению тока.

,

Вы хотите сказать, что добавили резистор сопротивлением 120 Ом последовательно с микросхемой 7815? У меня та же проблема. скажите пожалуйста, это соль. будет работать, @neehit goyal

Что такое BUZ11, MOSFET? Значит, входная емкость затвора полевого МОП-транзистора превышала пределы тока на логических линиях? Или вы говорите о потребляемой мощности МОП-транзистора? Можете ли вы предоставить схему подключения? Трудно понять, что вы говорите., @Duncan C