Главная › Форумы › Конструкторское бюро › Автоматизация › D18B20, Arduino, MODBUS, Master SCADA
- В этой теме 260 ответов, 24 участника, последнее обновление 2 месяца сделано
Алексей Юрьевич Пащенко.
-
АвторСообщения
-
13.03.2018 в 17:07 #18682
Есть реле на 5В с опторазвязкой для ардуино
Ну, реле само по себе гальваническая развязка. И все, что мне встречалось, с одной нормально разомкнутой группой контактов.
14.03.2018 в 10:42 #18736Коллеги, собрал действующий макет.
Управляю ШИМ нагрузки через прерывания при помощи библиотеки ticker.h.
Все на аппаратном уровне работает. Т.е. лампа (аналог нагрузки для тестов) послушно загорается и гаснет.
Не очень нравится мне мой алгоритм. Покритикуйте пожалуйста.
Реализовано: на входе параметр – мощность ТЭН, целое число от 0 до 100 (проценты мощности). Прерывание стучит каждые 100 мс. Если мощность, например 1%, то ТЭН включается на 0.1 секунду, а затем пауза 9.9 секунд. Если мощность, например 60%, то ТЭН работает 6 секунд, затем пауза 4 секунды.
Не слишком это долгие паузы? Не могу придумать алгоритм как это изящнее реализовать. Может идеи есть какие, или почитать что?
Вложения:
Вы должны войти для просмотра вложений.Хорошо живет на свете Винни-Пух...
14.03.2018 в 11:03 #18738Буду собирать по этой схеме http://forum.homedistiller.ru/msg.php?id=13179698 . В той теме можно много чего почитать. Пауза конечно большая, взять секунду(к примеру) за 100% и внутри неё уже… Мне проще повторить и дополнить, чем с нуля начинать.
14.03.2018 в 11:06 #18739По прерываниям рекомендуется использовать для выставления флагов, а выполнять непосредственные действия в основном цикле. Веб и прерывания очень не дружат.
Придумывать алгоритм не нужно, есть простой и удобный Брезенхем, который размазывает например в вашем случае 6 секунд равномерно по всему интервалу.
В ЛС кину ссылку на наглядную модель.
14.03.2018 в 11:30 #18741Тут реализован алгоритм за 1секунду со стабилизацией мощности при изменении сетевого напряжения. Управление идет каждую полуволну. Для реализации нужен детектор нуля и замеры амплитудного значения напряжения, чтобы знать напряжение сети. Также нужно ввести сопротивление ТЭН.
14.03.2018 в 11:33 #18742Спасибо, изучу.
В основном цикле ничего в идеале быть не должно. Иначе вся система превратится в сплошную кашу, неразрывно связанную и нечитаемую. Я модульно делаю.
Связи между прерываниями и вебом нет никакой. Прерывания бегут на чипе, веб обрабатывается по мере запросов на обновление данных на странице и т.д.
Хорошо живет на свете Винни-Пух...
14.03.2018 в 11:42 #18746Из основного цикла можно разбить на подмодули, но все задачи сделать асинхронно нельзя.
По прерываниям в самой библиотеке указаны рекомендации использовать по флагам.
Работать оно конечно итак будет, но возможны исключительные события. От что произойдет в процессе передачи http при прерывании, тут не всегда корректно все может отработать с китайским sdk полным закрытых багов.
14.03.2018 в 11:56 #18750Тут реализован алгоритм
Спасибо, посмотрю
Из основного цикла можно разбить на подмодули
Это понятно. Блин, хочу уже хоть как-то промежуточно финализировать и выпустить уже в шаловливые ручонки сообщества))
Хорошо живет на свете Винни-Пух...
14.03.2018 в 12:30 #18753Это понятно. Блин, хочу уже хоть как-то промежуточно финализировать и выпустить уже в шаловливые ручонки сообщества))
Начни с аппаратной части. а программеров набежит, не переживай. Попросим помочь людей, благо (или нет) их в стране больше чем токарей да сварщиков.
Йо-хо-хо.
14.03.2018 в 13:13 #18758Покритикуйте пожалуйста.
3. По Брезенхему. При этом способе в нагрузку всегда подаются [полу]периоды сетевого напряжения целиком, но не все, а только часть. Например, если из каждых 100 [полу]периодов подать в нагрузку только 20, то мощность, поданная в нагрузку, будет 20% от максимальной. Причём эта часть [полу]периодов как бы “размазывается” по времени, чтобы достичь более равномерного распределения “рабочих” и “нерабочих” [полу]периодов. Такой метод позволяет регулировать мощность лишь источников тепла (ТЭНов), так как при подключении в качестве нагрузки лампы она будет мигать. Помех по сети такой метод создаёт мало, так как включение и отключение тока нагрузки всегда происходит в момент перехода сетевого напряжения через ноль.
Дальше там обсуждение, почитай. Два варианта реализации в Экселе было. Алгоритм сводится к десятку строк целочисленной арифметики.
14.03.2018 в 13:18 #18759Начни с аппаратной части
Да она готова почти, надо паука из проводов уместить в коробке, и все
Хорошо живет на свете Винни-Пух...
14.03.2018 в 13:58 #18765По прерываниям рекомендуется использовать для выставления флагов
Беда в том, что http не единственный критичный к задержкам процесс в системе. Та же программная реализация 1-Wire для DS18x20 тоже на временных интервалах построена.
Еще одна беда – прерываний, как правило, бывает больше одного, и чтобы они не прерывали друг друга, на время обработки одного остальные запрещаются. Со всеми вытекающими.
Поэтому стараются в обработке прерываний выполнять минимум простых действий (установка/сброс флагов, старт/рестарт/стоп таймеров и т.п.), а “тяжелый” код выполнять в порядке, тыскыть, очереди.
Вот, кстати, Брезенхем:
dy = !(2*z > xm) ; // управление на триак; xm=100 – максимально возможная уставка в %; если двойная ошибка z больше xm, триак не открывается на следующей полуволне
z = z – ym; // текущая ошибка, вначале =0; ym – текущая уставка в %
If (dy) {z = z + xm}; // Коррекция ошибки для следующего шага
И все!!!
14.03.2018 в 14:00 #18766Не знаю, вовремя ли влезу в тему, но на всякий случай…
Есть такой стиль программирования, когда прерывания идут довольно часто, и есть счётчик их (прерываний), считающий до некоторого значения, а потом обнуляющийся, и так постоянно. В каждом прерывании с определённым номером обрабатывается определённая задача. Для быстродействующих микроконтроллеров, коим является ESP8266, это очень удобно, так как количество задач обычно меньше, чем можно насчитать прерываний в цикле. Поэтому остаются незадействованные прерывания, куда впоследствии можно будет поместить новые задачи.
14.03.2018 в 14:09 #18767Есть такой стиль программирования, когда прерывания идут довольно часто, и есть счётчик их (прерываний), считающий до некоторого значения, а потом обнуляющийся, и так постоянно.
Вариант – одно прерывание (генератор “тиков”), и программные счетчики-таймеры для каждой задачи. Как таймер сработал – задача выполняется. Грубо говоря, прежде чем что-то делать, задача проверяет состояние таймера.
По-моему, это как раз и называется CASE-программированием 🙂
“Задачи” либо встраиваются в основной цикл, либо делаются функциями. С функциями оно, конечно, читабельнее, но – накладные расходы времени на вызов-возврат, бывает критично.
14.03.2018 в 18:53 #18789Ох, пока голова опухла))
К выходным соберу макет в изделие, подчищу все другие вещи в коде, что остались в списке “To Do”, и надо на вас вываливать. Может еще немного времени возьмет доделать что-то по мелочам. В любом случае пока видится, что до первого апреля должен уложиться.
Хорошо живет на свете Винни-Пух...
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.