Процедура прерывания неожиданно выполнилась

Процедура прерывания выполняется неожиданно, и я не могу понять почему. Можете, пожалуйста, взглянуть?

Аппаратное обеспечение представляет собой обычный (поддельный) Arduino Mega с неиспользуемым Ethernet-шилдом и сенсорным экраном. Выглядит это примерно так:

Я подключаю расходомер, который выглядит так:

Он имеет внешний подтягивающий резистор и подключен следующим образом:

и я использую вывод 18, как предлагается для оборудования здесь: https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/.

Код прост:

Определение глобальной переменной:

константный байт прерыванияPin = 18;

volatile unsigned long waterFlowSensorCount= 0;

внутри setup():

pinMode(interruptPin, INPUT);

attachInterrupt(digitalPinToInterrupt(interruptPin), incrementWaterSensorCount, FALLING);

функция обработчика:

void incrementWaterSensorCount() { waterFlowSensorCount = waterFlowSensorCount + 1; }

Все работает как надо... пока я не активирую некоторые определенные выходы. 0 В и 5 В, которые питают расходомер, также являются тем же источником питания для реле, которые я включаю. В момент включения реле процедура прерывания запускается примерно 15 раз. Для полного раскрытия информации, проект имеет несколько источников питания и выглядит так:

Я перепробовал все аргументы при определении процедуры прерывания (RISING, FALLING, HIGH, LOW), и поведение то же самое, я имею в виду, расходомер просто стоит там, а счет увеличивается (но он «не должен»). Падение напряжения на источнике питания 5 В незначительно. Напряжение на выводе прерывания (18) меняется с 5,011 до 5,007, когда реле работают. Я попробовал внутренние подтягивающие резисторы, но это не помогло, и напряжение в порядке. Код выглядит нормально. Ничто из того, что я пробовал, не дало положительного эффекта. Почему вывод прерывания вызывает функцию обработчика, когда я включаю некоторые реле, когда напряжение на выводе прерывания, казалось бы, стабильно? Есть какие-нибудь советы? Есть какие-нибудь идеи по устранению неполадок?

Обновить Я выключил и снова включил питание блоков питания, и питание Arduino USB поддерживало питание системы, а провалы напряжения не повлияли на прерывание. Так что это не напряжение.

Я вытащил электромеханические реле, которые включались 6-релейным щитом, и когда 6 реле щита переключаются без электромеханических реле, прерывание не вызывается. Это что-то связанное с электромеханическими реле под релейным щитом. Любые идеи приветствуются.

Обновление 2 Наверняка это электромеханические реле. Когда их вынимают из гнезда, схема прерывания работает как надо. Странно то, что Arduino на самом деле не связан с реле. Реле переключают питание 12 В. Нет никакой связи с входами или выходами 5 В. Есть мысли? Любые попытки разобраться в этом будут очень признательны.

, 👍3

Обсуждение

Впечатляющая установка! Похоже на расходомер на эффекте Холла. Он физически удален от реле и других источников магнитных помех? С датчиком на эффекте Холла «подпрыгивание» не должно быть проблемой, как это было бы с механическими контактами. FALLING, похоже, создает правильный фронт для запуска ISR, а внешний подтягивающий резистор 10 кОм выглядит нормально. Больше ничего не использует контакт 18 через экран или иным образом?, @6v6gt

Похоже на проблему с электрическим шумом из-за дребезжания реле. Посмотрите здесь, как выглядит электрический шум: https://www.youtube.com/watch?v=Nj-Q8FQxHhU Я подозреваю, что реле что-то делает с источниками питания 12 В, которые затем что-то делают с источниками питания 3,3 В и 5 В, что и вызывает проблему. Электрический шум и реле... похоже, виновники., @Mike

@6v6gt спасибо. 100% проблема связана с реле, и я не думаю, что это магнетизм реле, влияющий на датчик Холла. Похоже, что работа реле вызывает шум в системе, который улавливается схемой прерывания. Я думаю, это вопрос для обмена электрическим стеком, @Mike

OK. Если вы также используете голые реле (в отличие от модулей, которые в любом случае их имеют), убедитесь, что на каждой катушке есть обратный диод. Также обратите внимание на демпферные цепи на выходной стороне реле, особенно если они переключают основное напряжение на индуктивную нагрузку., @6v6gt

@6v6gt если бы вы могли предоставить свой комментарий в качестве развернутого ответа, я бы с радостью попробовал и, скорее всего, соглашусь, так как он выглядит правильным. Стоит ли покупать диод обратного хода? что такое демпферная схема? 12 В, которые переключают реле, питают шаровой клапан с электроприводом. Моя электроника довольно слабая..., @Mike

Я не буду делать это как формальный ответ, потому что это выходит за рамки вопроса "Arduino" (и я рискую потерять несколько очков Brownie, если это будет оценено ниже). Возможно, то, что вы описали как электромеханические реле, не имеет обратного диода на катушке. Это может быть обычный диод 1n4007. См. https://en.m.wikipedia.org/wiki/Flyback_diode . Вот пример демпфера https://www.ebay.co.uk/itm/193580835405 . В противном случае погуглите по запросу реле-демпфер., @6v6gt

@6v6gt Интернет прекрасен, потому что есть такие люди, как ты. У меня как раз был 1n4007, я поставил его как «обратный ход» на все катушки реле, и вуаля! исправлено! Все работает! Большое спасибо!, @Mike


1 ответ


4

Электрический шум снова наносит удар! Действительно хорошее объяснение электрического шума можно найти здесь: https://www.youtube.com/watch?v=Nj-Q8FQxHhU

Как только я сузил проблему до электромеханических реле, поскольку они не были подключены ни к одному из источников питания Arduino (3,3 В и 5 В), я понял, что происходят какие-то электрические помехи. Какие-то электрические явления приводили к «сбою» вывода прерывания, т. е. к некорректному поведению. Я последовал совету по «обратноходовому» реле (https://en.m.wikipedia.org/wiki/Flyback_diode), где я просто подключил диод 1n4007 параллельно катушке реле, и БАБАХ! Больше никаких проблем с выводом прерывания.

Это может показаться неуместным для страницы Arduino, но я бы сказал, что это действительно проблема Arduino, поскольку Arduino — это и программное, и аппаратное обеспечение, и поскольку это может помочь кому-то еще с Arduino, то это должно быть здесь.

Огромное спасибо @6v6gt. Ты молодец!

,