Индуктивные всплески расстраивают прерывания
Я использую Arduino Uno для создания кинетической скульптуры с помощью магнитов и электромагнитов (ЭМ). У меня есть установка с двумя внешне защищенными кнопками с использованием резисторов, конденсатора и шестнадцатеричного инвертора CMOS 4584. Все неиспользуемые входы 4584 заземлены. Эти кнопки подают чистый сигнал на плату и запускают два прерывания, которые устанавливают флаги для включения или выключения светодиодов и запускают один или оба оптоизолятора (OI). Они подключаются к другой плате с отдельным источником питания 12 В. Один из OI включает силовой МОП-транзистор BUZ71, а другой запускает реле, которое может изменить полярность питания на небольшую электромагнитную катушку на 30 Ом. Это может привести к тому, что магнит, подвешенный вверху, как маятник, отлетит от катушки...
Это прекрасно работает с кнопками, светодиодами и двумя входами OI. Но когда я подключаю плату реле/MOSFET к выходу OI, она перестает работать должным образом. кнопка 2 выключает кнопку 1 и саму себя. Первая кнопка всегда выключается и включается чисто. Но вторая кнопка запускает ISR2 примерно 10 раз, а ISR1 пару раз, оставляя обе выключенными. Если отключить электромагнитную катушку, кнопки работают нормально. Кажется, что переключение полярности каким-то образом мешает работе Uno, возможно, из-за довольно сильного индуктивного всплеска, создаваемого переключением реле. Я попытался использовать экранированный коаксиальный кабель для катушки. У меня на обеих платах конденсаторы 47000 мкФ. Я попробовал грубую клетку Фарадея вокруг платы реле - не повезло. Может ли всплеск каким-то образом проходить через бытовой источник питания, даже если плата Uno и плата реле имеют разные источники питания и полностью разделены OI? Вот скетч, который я использую:
// Программирование Джереми 070520
// разработка модуля рикошета
const int coilButton = 2;
const int directionButton = 3;
const int coilPin = 8; //драйвер катушки
const int directionPin = 9; // драйвер направления
volatile bool coilFlag;
volatile bool directionFlag;
int coilLedState = LOW;
int directionLedState = LOW;
void setup()
{
pinMode(coilButton,INPUT);
pinMode(directionButton, INPUT);
pinMode(coilPin, OUTPUT);
pinMode(directionPin, OUTPUT);
digitalWrite(coilPin,LOW);
digitalWrite(directionPin, LOW);
attachInterrupt(digitalPinToInterrupt(coilButton), ISR1, FALLING);
attachInterrupt(digitalPinToInterrupt(directionButton), ISR2, FALLING);
Serial.begin(9600);
}
void loop(){
if(coilFlag)
{
coilFlag = false;
coilLedState = !coilLedState;
digitalWrite(coilPin, coilLedState);
}
if(directionFlag)
{
directionFlag = false;
directionLedState = !directionLedState;
digitalWrite(directionPin, directionLedState);
}
delay(1); // Я в отчаянии, я попробую что-нибудь ....
} // конец цикла
void ISR1()
{
Serial.println("ISR1");
coilFlag = true;
}
void ISR2()
{
Serial.println("ISR2");
directionFlag = true;
}
@Jeremy Brown, 👍0
Обсуждение1 ответ
Лучший ответ:
Я бы предложил построить клетку Фарадея вокруг катушки индуктивности. Вероятно, он индуцирует достаточный ток во всех проводах вокруг него, чтобы вызвать напряжение логического уровня в ваших сигнальных проводах, на плате и т. д.
Похоже, катушка должна отбрасывать магнит, поэтому вам, возможно, придется довольствоваться «чашей Фарадея» (клеткой Фарадея с открытым верхом). Некоторое магнитное поле будет вытекать из верхней части чаши, но если вы поместите панель управления ниже дна и на расстоянии нескольких футов, этого может быть достаточно.
Возможно, вам придется экранировать все по отдельности: клетка Фарадея вокруг Arduino. «Чаша Фарадея» вокруг катушки. Коаксиальные кабели для всего, где питание катушки подается по коаксиальному кабелю с отдельным заземлением и т. д.
- Какое максимальное энергопотребление Arduino Nano 3.0?
- Питание светодиодной ленты - Сколько ампер?
- Как запомнить значения переменных после перезагрузки платы Arduino Uno R3
- Power Bank самопроизвольно отключается
- Как я могу запитать Arduino Nano от батареи LiPo, желательно 3,7 В
- Если USB дает 5 В, как Arduino может подавать 5 В на контакт 5 В? (И еще вопрос)
- Могу ли я иметь резервное питание для устройства Arduino?
- Клон Digispark не распознается при подключении
Есть ли возможность получить принципиальную схему здесь?, @KIIV
Вы используете обратные диоды для ЭМ?, @Sim Son
Человек, нажимающий кнопку, не является подходящим местом для прерывания, если только он не выходит из состояния сна. Это проблема, которой у вас даже не должно быть. Просто опросите кнопки, и все заработает. Вы упомянули в комментарии, что находитесь в отчаянии и попытаетесь сделать что-нибудь, возможно, стоит попробовать сделать это обычным способом., @Delta_G