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. Аналоговый вход не превышает нескольких вольт, а выходы ШИМ управляют двумя МОП-транзисторами логического уровня. Если необходима дополнительная информация о схеме, дайте мне знать!
РЕДАКТИРОВАТЬ: Я обнаружил, что это не ошибка в двух циклах обратной связи, потому что оба работают самостоятельно. Он выходит из строя, как только я использую обе петли обратной связи вместе. Насколько мне известно, между ними нет общих переменных или данных
@lte678, 👍0
Обсуждение1 ответ
Лучший ответ:
Наконец-то я понял: Arduino переходил в режим текущей защиты, вызывая его перезагрузку. После начала регулирования контакты, управляющие МОП-транзисторами, потребляли слишком большой ток из-за входной емкости BUZ11.
Чтобы решить проблему, мне просто пришлось добавить резисторы сопротивлением 120 Ом последовательно с затвором. Это замедлило активацию и деактивацию, что привело к уменьшению тока.
Вы хотите сказать, что добавили резистор сопротивлением 120 Ом последовательно с микросхемой 7815? У меня та же проблема. скажите пожалуйста, это соль. будет работать, @neehit goyal
Что такое BUZ11, MOSFET? Значит, входная емкость затвора полевого МОП-транзистора превышала пределы тока на логических линиях? Или вы говорите о потребляемой мощности МОП-транзистора? Можете ли вы предоставить схему подключения? Трудно понять, что вы говорите., @Duncan C
- attiny85 и arduino — аналоговое чтение + pwmOut
- Двигатель постоянного тока шумит, но не вращается
- Можно ли использовать цифровые контакты в качестве выхода ШИМ?
- Как прочитать значение PIN PWM-выхода?
- Можем ли мы записать загрузчик Arduino в любой чип микроконтроллера?
- Как подключить USB к пользовательской схеме Arduino Uno и программированию Atmega?
- Программирование ATMega328P без платы Arduino всегда возвращает ошибку: avrdude: stk500_recv(): programmer is not responding
- Задержка PWM без блокировки кода
Я не вижу в вашем коде ничего ужасного. Возможно, проблема с памятью. Вы пробовали печатать без 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