361

Re: Простой стабилизированный регулятор мощности ТЭНа из китайских модулей

kvic, d.styler,
На основе наработок Виктора, предложу свой вариант.
Поскольку передаём исключительно числовые параметры, есть смысл уйти от передачи в ASCII к бинарному коду. Малость сэкономим ресурсы немощных ардуинок.  :)

=====
Информация от стабилизатора   
Формат посылки (буква=полубайт, всего шесть байт): AB CD DD EE EE GG
A - Заголовок
B - Состав данных
C - Режим + ошибки
D - Измеренное входное напряжение сети    (три полубайта, диапазон значений 0...4095, т.е. до 409,5В)
E - Измеренный выходной параметр или текущая уставка (два байта, диапазон значений 0...65535)
G - Конец посылки (CR) (один байт: $0D)

Полубайт «Состав данных»
младший бит - «уставка и выход» - 0-напряжение, 1-мощность           
второй бит - «измерение выходного параметра» 1-измеряется, 0-нет           
третий бит - «измерение входного напряжения» 1-измеряется, 0-нет           
четвертый бит - (резерв)

Для стаба Виктора полубайт «состав данных» - b0010, т.е.
«уставка и выход» - напряжение,
выходной параметр - измеренный,
входное напряжение сети - НЕ измеряется

Для моего стаба полубайт «состав данных» - b0101, т.е.
«уставка и выход» - мощность,
выходной параметр - НЕ измеряется и передается текущая уставка,
входное напряжение сети - измеряется

Если в качестве заголовка использовать b0011, то вместе с полубайтом «состав данных» в терминале первый символ будет отображаться информативно (0...9 или одним из символов : ; < = > ? )

Полубайт «Режим + ошибки»
два младших бита — режим
b0000 - Стоп (по нулям, значит в стопе, логично же)
b0001 - Рабочий режим (старается поддерживать заданный выходной параметр)
b0010 - Разгон
b0011 - (резерв)
установленный третий бит при нулевом четвертом - ошибка на входе       
b0100 - Сети нет (на выходе ноль, т. е. режим стоп, и два младших бита не врут)   
b0101 - Напряжения сети недостаточно для достижения уставки   
b0110 - (резерв)
b0111 - (резерв)
далее - ошибки на выходе и прочие...

=====
Управление стабилизатором
Формат посылки (буква=полубайт, всего не более четырех байт): AA BB BB GG
A - Заголовок (M,U,P…)
B - Код режима или уставка (один или два байта, диапазон значений 0...65535)
G - Конец посылки (CR) (один байт: $0D)

С уважением, <дата, подпись>, отвечайте нам, а то...
РК 28/1500
Простой стабилизированный регулятор

362

Re: Простой стабилизированный регулятор мощности ТЭНа из китайских модулей

Покритикую?

JohnJohnov ©:

есть смысл уйти от передачи в ASCII к бинарному коду

Очень неудобно будет отлаживать.
ASCII можно смотреть тем же монитором порта и сразу видеть значения, а битовые посылки надо расшифровывать, да не всё он(монитор) сможет отобразить.
С другой стороны принимающая программа должна будет всё это как-то расшифровывать.

JohnJohnov ©:

Малость сэкономим ресурсы немощных ардуинок.

Не факт. Работать с кусками байта в ардуине не особо комфортно.
Придётся формировать некий буфер, кратный байту, потом отсылать его.
Нуегонах, а?
А так взял байт целиком и послал его в порт.
Одна команда.
---
По большому счету ресурсов что на отсылку 4, что 20 байт, много не надо.
Охота тебе была писать упаковщик-распаковщик на стороне ардуины?
Он же ресурсов сожрёт.

РК 35х1600

363

Re: Простой стабилизированный регулятор мощности ТЭНа из китайских модулей

kvic ©:

Покритикую?

Конечно! В спорах родим чегой-то путнее  :D

kvic ©:

Очень неудобно будет отлаживать.

Согласен. Думал про это. Дебажим один раз и сами. Опять же всегда можно в дебаге слать в удобоваримом виде.

kvic ©:

Работать с кусками байта в ардуине не особо комфортно.

Ну смотри:
Байт "Заголовок + состав данных" для конкретного стаба - константа.
Уставка/выходной параметр - как два байта переслать.  :D
Остается собрать в два байта "Режим+ошибки" и "Измеренное входное" - присваиваем отформатированное значение измеренного_входного временной переменной типа uint16_t, а далее битовой маской накладываем "режим+ошибки", разбираем на байты, шлём.

С другой стороны, выделить байт под "Режим+ошибки" и два под "Измеренное входное" - будет правильнее.
AB CC DD DD EE EE GG

kvic ©:

По большому счету ресурсов что на отсылку 4, что 20 байт, много не надо

Наверное так.
Я когда свой стаб дебажил по сериалу, были временнЫе баги, какие - не помню, но сериал из стаба выдрал.

С уважением, <дата, подпись>, отвечайте нам, а то...
РК 28/1500
Простой стабилизированный регулятор

364

Re: Простой стабилизированный регулятор мощности ТЭНа из китайских модулей

JohnJohnov ©:

"Измеренное входное"

А зачем оно нам?
Если оно малО для установки нужного значения на выходе, то этим же ошибка №хх заведует.

JohnJohnov ©:

всегда можно в дебаге слать в удобоваримом виде.

Лишний код. Я думаю в этом случае проще сразу слать человекомсъедобные данные.

JohnJohnov ©:

"Заголовок + состав данных" для конкретного стаба - константа.

Думаю вид и модель стабилизатора не должна иметь никакого значения для внешнего устройства.
На мой взгляд стабилизатор должен давать данные, которые он способен измерять и регулировать.
Исходя из них внешнее устройство примет решение, какую величину регулировать можно, а какую нет смысла - отклика не будет.
Т.е., если агрегат выдаст в поле "желаемое напряжение" строку "....", то значит регулировку по напряжению он не поддерживает
и посылать ему команду "установить напряжение 195.5 вольт" не имеет смысла.
Если ещё и в поле "желаемая мощность" такая же "....", то это вообще не регулятор, а просто измеритель,
посылать ему команды нет смысла, мирно курим и показываем на индикаторе измеренные значения.
Так же и с другими полями.
Это я к моему варианту.
Ну а байт под режимы/ошибки тоже лишним не будет.
Мало ли, что в будущем в голову взбредёт, а места в битовом поле уже нет.
Там всего 8 вариантов, а ASCII байтов несколько больше, как минимум 96.
Обидно будет.

РК 35х1600

365 (2021-06-26 17:42:51 отредактировано JohnJohnov)

Re: Простой стабилизированный регулятор мощности ТЭНа из китайских модулей

kvic ©:

А зачем оно нам?

Я ждал этого вопроса!  :)
Мой стаб его измеряет и лично мне было бы интересно видеть график сетевого, особенно, когда сеть просажена.
Но, по-большому счёту, оно нам не нужно.
С другой стороны, в любом стабе/измерителе нам необходим только один параметр: что на выходе. Ограничить протокол одним передаваемым параметром? Можно. Но,блин, мало ли, что в будущем в голову взбредёт, а места уже нет.  :)
Давай оставим два двухбайтовых - основной и ещё один.

kvic ©:

Лишний код. Я думаю в этом случае проще сразу слать человекомсъедобные данные.

У ASCII варианта, на мой взгляд, одно единственное достоинство - удобочитаемость. На них в терминале смотреть будем только мы с тобой и то во время дебага. А жрать процессорное время они будут всегда.
Имхо, третьестепенный резон.
И я не уверен, что передача пары десятков байт ежесекундно не подпортит работу моего стаба. Надо почитать доки. Дай подумать.

kvic ©:

Думаю вид и модель стабилизатора не должна иметь никакого значения для внешнего устройства.
На мой взгляд стабилизатор должен давать данные, которые он способен измерять и регулировать.

Вот потому и ввёл "состав данных". Там не вид и модель указываются, а как раз что стабилизатор может, как управляется и что шлёт. В нём же указывается что именно собой представляют основной и дополнительный параметры. Вариант более гибкий, мало ли что...

С уважением, <дата, подпись>, отвечайте нам, а то...
РК 28/1500
Простой стабилизированный регулятор

366

Re: Простой стабилизированный регулятор мощности ТЭНа из китайских модулей

JohnJohnov ©:

стаб дебажил по сериалу, были временнЫе баги, какие - не помню, но сериал из стаба выдрал

Может это издержки arduino ide ?
Я то на асме всем этим извращаюсь, так сказать ближе к железу.  :D
Там натолкал данные в буфер в ОЗУ, включил прерывание UART "буфер передачи пуст" в нужный момент времени и всё.
Оно само работает и никому не мешает.
А как в ide, я не знаю, может как по-чудному сделано.

РК 35х1600

367

Re: Простой стабилизированный регулятор мощности ТЭНа из китайских модулей

kvic ©:

Может это издержки arduino ide ?
Я то на асме всем этим извращаюсь, так сказать ближе к железу.

Это, скорее, издержки штатной библиотеки Serial.
Тебе то на асме пофиг, а мне городить своё при наличии готовой библиотеки нехоть.  :D
Я потестирую на железке задержки со штатной библиотекой и чего нибудь скажу.

С уважением, <дата, подпись>, отвечайте нам, а то...
РК 28/1500
Простой стабилизированный регулятор

368 (2021-06-26 18:16:02 отредактировано kvic)

Re: Простой стабилизированный регулятор мощности ТЭНа из китайских модулей

JohnJohnov ©:

У ASCII варианта, на мой взгляд, одно единственное достоинство - удобочитаемость

Не только. Используя его можно легко отделять "мух" от "котлет".
Вот смотри.
Ты предлагаешь использовать для передачи данных весь диапазон значений байта от $00 до $FF.
А также завершать пакет символом $0D.
Следовательно этот символ должен встречаться только в конце передаваемых данных и нигде больше.
Но что делать, если измеренная величина, та же мощности, содержит в своем теле код $0D ?
Например 3341 Вт это $0D0D или 180.5 Вольт это $070D .
Программа приемник посчитает этот $0D концом данных и всё что после началом нового блока данных.
Вот тут и начнутся чудеса.
ASCII, да передаваемый пакет больше, но такого пердимонокля в нем не произойдёт.

JohnJohnov ©:

Ограничить протокол одним передаваемым параметром?

Не, один параметр это не по-нашенски.
Как минимум два. Мощность и напряжение.
Что можем передаём, что не можем - изображаем козью морду.
Кстати, оставив два принудительных, можем отправлять следом кучу дополнительных.
Только приёмник в базовой комплектации их будет игнорить да и всё.

JohnJohnov ©:

не уверен, что передача пары десятков байт ежесекундно не подпортит работу моего стаба

Не должна, я на одно из своих игрушек отправляю по 80 байт ежесекундно на скорости 9600 и всё нормально.

JohnJohnov ©:

Надо почитать доки. Дай подумать.

Ага.

РК 35х1600

369

Re: Простой стабилизированный регулятор мощности ТЭНа из китайских модулей

kvic ©:

Следовательно этот символ должен встречаться только в конце передаваемых данных и нигде больше.

Ну, это если длина пакета неизвестна и его конец определяется по $0D. Я же предлагаю фиксированную длину, в этом случае $0D - просто контрольный символ.

kvic ©:

Не должна...

У меня почти вся программа - в прерываниях. Они друг другу на пятки наступают. Ещё одно от USART`а может стать той фатальной стопкой, которую бы не надо после литры выпитой.  :D

kvic ©:

Кстати, оставив два принудительных, можем отправлять следом кучу дополнительных.

Вот это уже интересно, но снова упирается в ASCII.

С уважением, <дата, подпись>, отвечайте нам, а то...
РК 28/1500
Простой стабилизированный регулятор

370

Re: Простой стабилизированный регулятор мощности ТЭНа из китайских модулей

JohnJohnov ©:

если длина пакета неизвестна и его конец определяется по $0D

Так она и неизвестна.
Фиксированная длина ничего не даёт.
У нас отсутствует возможность узнать, что очередной принятый байт принадлежит текущему пакету данных, а не следующему.
Вот, допустим, передаём 4 байта. 0-1-2-3. Следом ещё 4 байта 4-5-6-7. Потом ещё 8-9-10-11.
Байт "2" каким-то образом потерялся.
Помеха в линии, барабашка, сбой передатчика, всё что угодно.
В приемнике, нарезающем принятые данные только по длине, получим:
0-1-3-4
5-6-7-8
9-10-11- и что там дальше...
Всё, синхронизация потеряна, а восстановить нет возможности.
"Строб" отсутствует.
Данные, полученные таким способом, становятся дракхом.

РК 35х1600

371 (2021-06-26 22:52:41 отредактировано )

Re: Простой стабилизированный регулятор мощности ТЭНа из китайских модулей

JohnJohnov ©:

есть смысл уйти от передачи в ASCII к бинарному коду. Малость сэкономим ресурсы немощных ардуинок.

Не - мы же не реалтайм систему реализуем. Обмен данными будет довольно редко происходить, к чему огород городить? ИМХО

kvic ©:

Но что делать, если измеренная величина, та же мощности, содержит в своем теле код $0D ?
Например 3341 Вт это $0D0D или 180.5 Вольт это $070D .

Все просто - каждый пакет начинается с какого то байта или 2-х, за ним идет длина пакета и чексумма (опционально). Тогда там пох че там в самом пакете, тупо принимаем от 0 до указанной длины и транслируем в данные.

372

Re: Простой стабилизированный регулятор мощности ТЭНа из китайских модулей

d.styler ©:

каждый пакет начинается с какого то байта или 2-х, за ним идет длина пакета и чексумма

Можно и так.
Только надо читать всю длину пакета, вычислять сумму, некорректный пакет отбрасывать, снова ждать комбинацию стартовых байт.
Без вычисления суммы рискуем нарваться на старт в середине пакета и обработать что-нибудь не то.
По задумке пакеты планируется посылать раз в секунду.
Так как данные можем посылать любые, имеем шанс получить старт в середине пакета первой секунды,
конец пакета (по длине) в середине второй секунды,
признать пакет кривым и поймать нормальный старт в начале третьей секунды.
А если после признания кривизны пакета в середине второй секунды поймаем старт из конца пакета второй секунды,
то получим ещё секунду плюс до получения корректных данных.
А так строб(начало пакета), строка символов(ограниченный диапазон) и маркер конца пакета.
Но если что, я не настаиваю.

РК 35х1600

373

Re: Простой стабилизированный регулятор мощности ТЭНа из китайских модулей

Потестил, подумал - вы правы, для наших любительских разработок ASCII предпочтительнее. Значит останавливаемся на варианте Виктора.
Передаем в ASCII, значения в шестнадцатиричном виде цифрами в ASCII-коде.

d.styler ©:

...за ним идет длина пакета и чексумма (опционально)

Ну это точно не нужно.
У нас состав данных для конкретного устройства постоянный, меняются только значения.

И сколько тех данных может быть от стабилизатора напряжения/мощности? Два параметра, имхо, достаточно. А сами параметры описывать дополнительно. Посылка будет всегда одной длины.
Заголовок, описание, параметр_основной, параметр_дополнительный, конец.
Я всё-таки против длинных пакетов, где половина полей - пустые.

С уважением, <дата, подпись>, отвечайте нам, а то...
РК 28/1500
Простой стабилизированный регулятор

374

Re: Простой стабилизированный регулятор мощности ТЭНа из китайских модулей

JohnJohnov ©:

Я всё-таки против длинных пакетов, где половина полей - пустые.

Тоже не особо радуют пустые поля.
Можно передавать данные в пакете, разделённые запятыми.
Т.е. пакет со всеми данными будет такой: (например)
Байт синхронизации,значение1,значение2,значение3,значение4, признак конца пакета (запятые тоже передаются).
Если какой-то величины нет, то и не надо ничего передавать, будут две или больше запятых подряд.
Байт синхронизации,значение1,,,значение4,признак конца пакета(значения 2 и 3 не передаются, запятые передаются)
Перед признаком конца пакета запятую можно не ставить.
----
Можно в принципе передавать сколько угодно данных в пакете, но надо однозначно зафиксировать первые несколько мест за конкретными данными.
Между запятых данные по-идее могут быть не фиксированного размера.
Где надо два байта - передаем два, где пять - передаём пять.
А остальное уже по желанию.
----
Тоже избыточно, но у нас и объёмы передаваемой информации мизерные.

РК 35х1600

375

Re: Простой стабилизированный регулятор мощности ТЭНа из китайских модулей

JohnJohnov ©:

этот стабилизатор заработает с минимальными изменениями в скетче.

Перенес из Самовара. По любому приглядывался к вашему стабилизатору. Когда будет возможность дайте знать о каких изменениях идет речь. Электроника и электрика без изменений, как я полагаю? Тогда начну подбирать компоненты.

А обязательно Ардуино Нано? Или есть более шустрые варианты? Я спрашиваю, потому что с Ардуино еще не знаком и вы где-то упомянули, что не тянет по быстродействию.

376

Re: Простой стабилизированный регулятор мощности ТЭНа из китайских модулей

mzen ©:

А обязательно Ардуино Нано?

Поскольку там все реализовано на прерываниях - но при смене контроллера на более быстрый, или просто на другой, нужно тайминги менять. А это сразу ведет к необходимости отладки на этом контроллере (автором). Так вот.

377

Re: Простой стабилизированный регулятор мощности ТЭНа из китайских модулей

d.styler ©:

Поскольку там все реализовано на прерываниях - но при смене контроллера на более быстрый, или просто на другой, нужно тайминги менять.

Сомнительно. А исходники есть?

378 (2021-07-01 07:29:47 отредактировано JohnJohnov)

Re: Простой стабилизированный регулятор мощности ТЭНа из китайских модулей

mzen, компоненты подбирать можно, схемотехника не изменится. В скетче - изменения минимальные. Но выкладывать в паблик пока не буду - отправлю в личку и сперва потестируем. Мне неоткуда взять 60Гц, посему сам оттестировать в железе не смогу. В эмуляторе всё работает.

mzen ©:

А обязательно Ардуино Нано? Или есть более шустрые варианты? Я спрашиваю, потому что с Ардуино еще не знаком и вы где-то упомянули, что не тянет по быстродействию.

Данный конкретный стабилизатор реализован на Arduino NANO, отлажен и оттестирован. По работе нареканий не было от повторивших конструкцию.
На кой "более шустрые варианты"?

kvic ©:

Можно передавать данные в пакете, разделённые запятыми.

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

Я склоняюсь (и других склоняю :) ) к передаче ограниченного (а лучше фиксированного) числа параметров и служебного байта "состав данных".
Сколько параметров может передать стабилизатор мощности/напряжения?
1. Основной - выходная мощность/напряжение/ток, измеренный или уставку.
2. Дополнительный - напряжение/ток на ТЭНе (если основной - измеренная мощность, полезно при нескольких ТЭНах), уставка (если основной - измеренный), напряжение в сети (малополезно, но если измеряется почему не передать?), ...ещё что-то
3. ...не могу придумать
Основной передается всегда, прочие могут не передаваться. Состав данных описывается в соответствующем байте. Возможных вариантов - 95.
Формат посылки получается такой:
AB CC DDDD <EEEE GGGG ...> H
AB - Заголовок посылки+состав данных, для конкретного стаба - константа, парсится управляющей программой.
СС - режим+ошибки
DDDD <EEEE GGGG ...> - данные
H - признак конца


d.styler ©:

при смене контроллера на более быстрый, или просто на другой, нужно тайминги менять

Не только тайминги. Практически всю архитектуру программы.

С уважением, <дата, подпись>, отвечайте нам, а то...
РК 28/1500
Простой стабилизированный регулятор

379

Re: Простой стабилизированный регулятор мощности ТЭНа из китайских модулей

JohnJohnov ©:

Одна запятая - два байта.

Один.

JohnJohnov ©:

склоняюсь (и других склоняю :) ) к передаче ограниченного (а лучше фиксированного) числа параметров

Согласен с предыдущим оратором.

JohnJohnov ©:

и служебного байта "состав данных"

JohnJohnov ©:

Возможных вариантов - 95.

Как-то заморочено это.
Программа должна будет помнить все 95 вариантов.
Хотя может я не догоняю чего.

РК 35х1600

380 (2021-07-01 12:29:44 отредактировано JohnJohnov)

Re: Простой стабилизированный регулятор мощности ТЭНа из китайских модулей

kvic ©:

Один.

Да. Запутался чуток.

kvic ©:

Программа должна будет помнить все 95 вариантов.

Да зачем? Программа должна будет помнить столько вариантов, сколько будет их указано в стандарте протокола на момент её разработки/апдейта.
И с запятыми - примерно те же яйца. Параметров не так много.

Давай конкретизируем.
Основной (выходной) параметр
В стабилизаторе может быть только три варианта:мощность/напряжение/ток на выходе.
Параметр обязательный, передается всегда. Причем не важно измеренный или уставка - исходим из того, что любой стаб удерживает уставку с достаточной точностью
Дополнительный параметр
Уставка, измеренные мощность/напряжение/ток в нагрузке, сопротивление нагрузки, измеренное напряжение сети...что-то ещё.
Типов параметров набралось 4 штуки:
мощность (Ватт)
напряжение (Вольт, с десятичным знаком)
ток (Ампер, с двумя? десятичными)
сопротивление (Ом, с двумя? десятичными).

С запятыми - помним описание 9-и параметров, включая порядковое место. В худшем случае передаём 8 служебных байт (запятые).
С "составом" - помним описание 4 типов + что первым обязательно идет основной выходной + понимаем структуру байта "состав". Всегда передаём два служебных байта ("состав" в ASCII).

Байт "состав" разбиваем побитно:
b000000хх - тип основного параметра (01- напряжение, 10 - ток, 11 - мощность, 00-запрещённая комбинация)
b000хxх00 - описание доп.параметра1 (000 - параметра нет; 0xx - уставка, если тип совпадает с типом основного; 0хх - измеренное в нагрузке, если НЕ совпадает с типом основного; 100 - сопротивление нагрузки; 101 - напряжение сети; 110,111 - ещё что-то)
bхxх00000 - описание доп.параметра2 (000 - параметра нет; прочие коды зависят от параметров)
Как то так. Парсить не сложнее, чем с запятыми и не гоняем пустые байты.

Для моего и твоего стабов байт "состав" соответственно:
b00010111 - $17
b00000101 - $05

Доп.параметр2 нужен ли?

С уважением, <дата, подпись>, отвечайте нам, а то...
РК 28/1500
Простой стабилизированный регулятор