Что может привести к тому, что чтение АЦП зависает?

Я делаю контроллер солнечного нагрева воды с помощью arduino. У меня произошло замораживание считываемого значения АЦП (зонда ntc, считывающего показания солнечных панелей), которое оставалось на уровне -1,75 градуса Цельсия. это было подтверждено отправленными и записанными последовательными данными (с использованием Raspberry и базы данных временных рядов), а также прямым считыванием на ЖК-дисплее (16x2). После перезагрузки Arduino все возвращается в нормальное русло. Кроме того, странно то, что значение серийных данных датчика температуры резервуара для воды ds18b20 показало огромный всплеск 1e4... Это длится менее 1 секунды (чего не может быть, так как максимальное значение датчика составляет 125 ° c от этого цифрового датчика.). После этого скачка записанное значение АЦП оставалось замороженным. Другие ds28b20 и навигация по ЖК-меню и дисплей были в порядке ...

Может ли это быть связано с EMI?

К переполнению SRAM? Даже если остальная часть программы, кажется, работает?

Что могло бы позволить мне провести различие между этими проблемами?

Кажется, это произошло примерно через 2 дня после перезагрузки Arduino.

Описание настройки: Я использую автономный atmega 328 с программатором polulu. внутренний кристалл 8 МГц. Все размещено на veroboard (основной). Затем дочерняя плата veroboard содержит различные резисторы (Pullup, pulldown) для входных сигналов. Другой дочерний блок veroboard содержит выходы (драйвер скорости насоса pwm), оптопару для реле насоса. Источником питания является устройство meanwell din rail 5v ac-dc concerter. Я разместил разделительные колпачки вокруг atmega 328, диод + подтягивающий резистор + колпачок на линии сброса, поскольку я регулярно выполнял сброс (сейчас они исчезли). Реле насоса подключено к отдельному источнику питания 24 В. Заземления отделены от Arduino с помощью этой схемы 24 В (которая включает обратный диод). Но основания являются общими для основных и 2-х дочерних veroboards. Провод датчика солнечной панели ntc скручен rj45 cat6. Он экранирован, и экранирование подключено к заземлению atmega.

Моя программа неблокирующего типа с использованием миллиметров и конечных автоматов. Во время разработки я проверил время работы программы, которая работала быстро (без задержек). Основная структура довольно прямолинейна. См. Комментарий ниже:

//Получить состояние кнопки и отменить
buttonLeft.launchSM();
buttonRight.launchSM();
buttonDown.launchSM();
buttonUp.launchSM();

//Меню (использует библиотеку menubackend)
menuNavigationBehavior(); // ie обнаруживает действие по нажатию кнопки.Должно быть выполнено очень быстро... (менее 10 мс).
EditingVarInMenu(); // изменение переменных в меню, требующее циклического изменения скорости (например, установка параметров)

//Получение температуры с панели 1,5 для 5 усредненных значений 
// каждые 20 мс, т.е. 20 * 5, мы меняем температуру каждые 100 мс.
TemperaturePanel1(5,20,Tpanel1);

// Получение температуры от одного провода. Время между извлечением и возвратом 100 мс.
getOneWireTemp (); 

//КОНТРОЛЛЕР---------------------------------------------------------------
// Логика управления системой обновляется во временном цикле
// Переключатель выполнения конечного автомата логики контроллера
switch (ControllerMainState)
    {
        case CONTROL_MANUAL:
          ManualStateActions();
          break;

        case CONTROL_AUTO:
          AutoStateActions();
          break;

        case CONTROL_ERROR:
          ErrorStateActions();
          break;
    }

    //ОТОБРАЖЕНИЕ МЕНЮ_____________________________

    if( millis() - timer_50_ms > 200) // 
         {
              timer_50_ms = timer_50_ms+200;
              displayMenu(); // изменить отображение. Можно делать реже, т.е. каждые 200 мс.
          }

, 👍0

Обсуждение

Код, проводка, номера моделей / деталей и т.д., @timemage

Спасибо за ваш комментарий. Я использую автономный atmega 328 places на veroboard. Датчик ntc находится на панели. Используя простой делитель напряжения, чтобы прочитать его. резистор 10 Ком параллельно. Как быть уверенным и отличить проблему программы от проблемы EMI?, @Nikito

Смотрите дополнительные подробности в описании. Надеюсь, это поможет., @Nikito

Вполне вероятно, что эту вещь и ее код нужно будет ** увидеть **, чтобы кто-нибудь мог оказать большую помощь. Тем не менее, у вас много чего происходит в "вопросе". Вероятно, вам придется потратить много времени на то, чтобы изолировать проблему от определенной части вашего проекта, прежде чем кто-нибудь сможет предоставить что-то похожее на "ответ". Единственный совет, который у меня есть для вас сейчас, заключается в том, что если вы считаете, что это проблема EMI, вы можете изменить свои настройки, чтобы усугубить проблему. Если вы считаете, что включение и выключение насоса приводит к его блокировке, делайте это почаще, чтобы сократить цикл отладки., @timemage

Спасибо timemage за ваш ответ. И да, вы пишете. Но мне нужно с чего-то начать, и ваши комментарии ценны для меня. Код большой, и это также затруднило бы получение некоторых ответов. У меня не было никаких проблем с тем, чтобы заставить систему работать. Когда произошло замораживание, в системе ничего не работало. Просто измеряю..., @Nikito

Вы питаете ds28b20 от паразитного питания или вы подключаете к ним 3-й провод с Vcc?, @st2000

@st2000. 3-й провод с vcc. Тот же источник питания на din-рейке, что и у atmega., @Nikito

Код состоит из 144870 символов. Как я могу поделиться этим?, @Nikito

Если проблема возникает только при измерении, сократите код до такой степени, чтобы все, что он делает, это измеряет и все равно блокируется. Тогда его размер может быть достаточно управляемым, чтобы внести изменения в вопрос., @timemage

Я могу попробовать это сделать. Сохраните жидкокристаллическое меню и дисплей, отключите главный конечный автомат, который запускает рабочие режимы, и отключите последовательный мониторинг. Заставит ли это sens отображать свободную память на ЖК-дисплее? Я добавил некоторые подробности о коде в описание, @Nikito

Начните изолировать компоненты и код, который их запускает, например, попробуйте заменить реле насоса светодиодом. Что меняется? Напишите функции-заглушки для каждой основной функции, по одной за раз. Заглушка - это тривиальная функция, которая не делает ничего, кроме возврата заранее определенного результата, но ничего не вычисляет и не выполняет чтение / запись на аппаратное обеспечение. Сделайте это, чтобы изолировать части вашего кода, пока не увидите изменения в поведении. Затем сосредоточьтесь на той части, которую вы выделили, и выполняйте те же действия, пока не сузите причину проблемы., @JRobert

Спасибо тебе, Джроберт. Главная проблема здесь заключается в том, что это произошло через два дня... Прямо сейчас я предпринимаю попытку без основной части кода контроллера, которая содержит большинство вложенных функций. Если это продлится 1 неделю без сбоев, я, вероятно, смогу уменьшить проблему, но это займет время.... Примечание: размер программы сократился с 85% до 60%., @Nikito

Я размышляю... Я использую прерывание для состояния чтения шим-насоса (обратная связь), которое я ввожу в serial.write для записи на raspberry. Может ли это повлиять на аналоговое считывание делителя напряжения датчика ntc и заморозить его?, @Nikito


1 ответ


-1

Похоже, у вас сложная проблема. Одно из правил, которые я использую, - никогда не подключать arduino к сети 5 В, всегда использовать разъем barrel и использовать напряжение около 8 вольт. Дополнительная фильтрация и т.д., которую выполняет встроенный источник питания, просто потрясающая. Внешний 5 В подходит для большинства других устройств. Другой вариант - пойти в местный магазин электротоваров, приобрести металлическую распределительную коробку и установить в нее электронику в комплекте с металлической крышкой. Убедитесь, что он заземлен на землю. Причина этого в том, что в вашем прототипе имеется множество антенн, которые улавливают практически все электрические помехи в этом районе. Помните, что все основания должны быть подключены. Arduino не закалены для промышленных или коммерческих контроллеров.

,

Спасибо тебе, Гил, за твой ответ. Как уже упоминалось, я использую не arduino, а atmega 328. Никакой дополнительной фильтрации не существует. Как вы думаете, это обязательно должно быть?, @Nikito

Фильтрация всегда обязательна, и лишнее ничему не повредит. Вам нужны как объемные, так и высокочастотные. Тантал был бы великолепен, но в редких случаях они могут взорваться. Если вы используете алюминий, используйте по крайней мере два. Посмотрите на допуск и используйте меньшее значение. Например, если оно равно 100 мкФ +- 20%, используйте 80 мкФ в качестве вашего значения. Предполагая, что ваши расчеты верны, вам нужно 70uF использовать два из 100. Я перехожу на SMD и использую устройства MMLC, они намного лучше. Кроме того, колпачки должны быть установлены на расстоянии не более 4 мм от того места, где провода регулятора входят в плату. Надеюсь, это поможет., @Gil

3 дня без проблем . Я скрещиваю пальцы. До сих пор я удалил только выполнение основного конечного автомата. Я все еще считываю все значения датчиков и записываю их через последовательное соединение... Если это проблема только с программным обеспечением, я надеюсь, что устранение неполадок будет проще., @Nikito

Что такое объем и высокая текучесть. Отсюда я вывожу расстановку для каждой рекомендации:http://www.gammon.com.au/breadboard, @Nikito

Попробуйте перейти по этой ссылке, она дает вам учебное пособие Analog Devices MT-101, объясняющее методы развязки и почему. https://www.analog.com/media/en/training-seminars/tutorials/MT-101.pdf Это был мой второй поиск в Google по запросу "объем схемы и развязывающая емкость". Существует очень много доступных данных. МТ-101 состоит всего из 14 страниц., @Gil

Интересно. Тогда, может быть, если у меня есть шум, это приводит к снижению надежности микроконтроллера? В сочетании с несколькими конечными машинами это может привести к дрожанию программы. Другими словами, когда у меня простая и крошечная программа, у меня нет проблем, но когда программа больше, есть больше шансов пропустить изменение семафора состояния, которое мешает полной программе?, @Nikito

уже 6 дней без каких-либо проблем. Все кривые датчиков onewire и NTC (с помощью аналогового считывания) отображаются красиво, без каких-либо зависаний и прерываний. Я начинаю думать, что проблема не связана с оборудованием, несмотря на то, что фильтрация источника питания может быть лучше., @Nikito

Существуют спецификации для каждого полупроводникового устройства, и если оно изготовлено уважаемым производителем, то при условии, что вы работаете в пределах заявленных допусков 100% времени, они будут работать так, как рекламируется 100% времени. Шум во многих случаях выводит устройство из рекомендуемых эксплуатационных характеристик, поэтому результаты непредсказуемы. Иногда ничего не происходит, иногда он поджаривается, но обычно это приводит к сбоям в работе устройства, не обязательно заметным. Шум повлияет на надежность системы. Осторожно, из проводов получаются отличные антенны, которые будут пропускать шум в микропроцессор., @Gil

Так что, возможно, когда я удалил часть кода, выполняющего каждый такт процессора, я на самом деле просто не в состоянии заметить эти сбои. Например, считывание показаний датчиков выполняется каждые 200 мс. Статистически меньше шансов, что в это время у меня возникнет сбой, по сравнению с тем, когда я выполняю код, который запускает что-то на каждом такте..., @Nikito

В любом случае, я поставлю один дополнительный конденсатор емкостью 10 мкм для сглаживания внешнего источника переменного / постоянного тока напряжением 5 В и посмотрю, что произойдет. У меня уже есть быстроразъемный колпачок 0,1 micro, близкий к atmega328. Антенну трудно избежать, так как датчик ntc находится в солнечной панели на крыше. Таким образом, у меня есть провод длиной 11 метров, подключенный к atmega к делителю напряжения аналогового порта. Я мог бы также сгладить входной аналоговый сигнал с помощью 0,1-микрочастицы. А ты как думаешь?, @Nikito

Это самая сложная часть дизайна. Вам следует разработать какой-то тип защиты входного сигнала с фильтром нижних частот. Простой заземляющий колпачок на 200 Нф и входной контакт могут помочь с резистором 10 Ком, подключенным последовательно к входу датчика. Существует хорошая прикладная заметка Стивена Се "Практические проблемы проектирования фильтров и соображения для прецизионных АЦП". Я нашел его по адресу: https://www.analog.com/en/analog-dialogue/articles/practical-filter-design-precision-adcs.html Дизайн вашего фильтра будет влиять на то, насколько быстро вы сможете его прочитать., @Gil

Нет проблем со временем, так как процесс длительный. Если у меня есть среднее значение в 1 секунду, никаких проблем. Кроме того, даже если коэффициент усиления изменен, я могу перекалибровать датчик. До сих пор система по-прежнему работает без зависания, когда часть контроллера удалена. Поэтому я думаю, что со временем я также перепроверю память, чтобы узнать, есть ли у меня проблемы со стеком., @Nikito

Вы можете добавить немного кода, который сообщит вам, сколько у вас свободной оперативной памяти, а также может вызвать внешний контакт, если хотите. Если у вас закончилась память, пытаясь это сделать, это было бы хорошим признаком того, что вы правы и вам не хватает памяти. Похоже, часть проблемы решена. Можете ли вы уменьшить объем кода, это поможет. Если вы используете Serial.print("Привет!"); попробуйте использовать макрос "F", Serial.print(F("Привет!")); это может сэкономить место в оперативной памяти., @Gil

Я подтверждаю. Прошло уже более 10 дней без каких-либо проблем. В течение тех дней я сохранял считывание ntc АЦП, считывание pwm, считывание по одному проводу и serialprint всего на raspberry pi. У меня есть кривые от grafana за почти 15 дней записи без каких-либо проблем. Тот факт, что я удалил часть кода, которая обрабатывает автоматический режим (главный конечный автомат), который содержит большую часть таймеров (на основе миллиметров), позволил мне вообще не прерывать работу схемы. Когда atmega вышла из строя, это было не из-за срабатывания моих выходных сигналов (скорость насоса), так что это не может быть связано с выходом, @Nikito

Я подчеркну, что это происходит без каких-либо изменений в схеме. Я еще не добавил низкочастотный конденсатор в линию питания. Я постараюсь поставить функцию FreeRAM(). Пока трудно уменьшить объем кода, и F() используется для всех моих строк... Но у меня в этой большой государственной машине есть ручной и автоматический режимы. Я могу начать понимать, какой из них плохой... Я помещу free ram() в другую позицию в моем коде, чтобы он выводил 1, или 2, или 3 и т. Д. В serialPrint (который отправляется в raspberryy) в зависимости от позиции в коде. Спасибо, Гил, за предложение., @Nikito

Всегда пожалуйста. Для меня самое сложное во многих случаях - определить, является ли это аппаратным или программным обеспечением. Обычно я начинаю с этого: если он последовательный, то, вероятно, это программное обеспечение, если он прерывистый, то это аппаратное обеспечение. Обратите внимание, что это отправная точка и не всегда правильное предположение., @Gil