Индуктивные всплески расстраивают прерывания

Я использую 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;
  }

, 👍0

Обсуждение

Есть ли возможность получить принципиальную схему здесь?, @KIIV

Вы используете обратные диоды для ЭМ?, @Sim Son

Человек, нажимающий кнопку, не является подходящим местом для прерывания, если только он не выходит из состояния сна. Это проблема, которой у вас даже не должно быть. Просто опросите кнопки, и все заработает. Вы упомянули в комментарии, что находитесь в отчаянии и попытаетесь сделать что-нибудь, возможно, стоит попробовать сделать это обычным способом., @Delta_G


1 ответ


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

0

Я бы предложил построить клетку Фарадея вокруг катушки индуктивности. Вероятно, он индуцирует достаточный ток во всех проводах вокруг него, чтобы вызвать напряжение логического уровня в ваших сигнальных проводах, на плате и т. д.

Похоже, катушка должна отбрасывать магнит, поэтому вам, возможно, придется довольствоваться «чашей Фарадея» (клеткой Фарадея с открытым верхом). Некоторое магнитное поле будет вытекать из верхней части чаши, но если вы поместите панель управления ниже дна и на расстоянии нескольких футов, этого может быть достаточно.

Возможно, вам придется экранировать все по отдельности: клетка Фарадея вокруг Arduino. «Чаша Фарадея» вокруг катушки. Коаксиальные кабели для всего, где питание катушки подается по коаксиальному кабелю с отдельным заземлением и т. д.

,