Форум самогонщиков Сайт Барахолка Магазин Помощь солдатам

Ненавязчивая автоматизация ректификационной установки

Форум самогонщиков Автоматика
1 ... 51 52 53 54 55 56 57 ... 132 54
gol_avto Доцент Москва - Серпухов - Анапа 1.3K 458
Отв.1060  23 Янв. 18, 19:22
С черной клавишей, это Российский, дороже, но надежней. С желтой - китаец
U-M Магистр MSK 210 39
Отв.1061  23 Янв. 18, 19:23, через 2 мин
поискать электромеханический дифавтоматOldBean, 23 Янв. 18, 17:19
у Шнайдеров вроде есть на 2 места (36 мм). Правда токи 25 и 40 А.
Dmi_D Кандидат наук Минск 393 138
Отв.1062  23 Янв. 18, 19:30, через 7 мин
Так 25 нам в самый раз и будет, 5 кВт на всю установку.
Я вот думаю, отчего у Сергея десятка вспыхнула? Может, слабовато 2,2 кВт на все хотелки?
U-M Магистр MSK 210 39
Отв.1063  23 Янв. 18, 19:36, через 7 мин
25 нам в самый раз и будетDmi_D, 23 Янв. 18, 19:30
Нашелся: https://www.schneider-electric.ru/...25a-30ма-ac-тип
volk ew Магистр ярославль 291 103
Отв.1064  23 Янв. 18, 19:57, через 22 мин
вот нашел на 1 место

https://ru.aliexpress.com/...9999.291.FdXu7l
Dmi_D Кандидат наук Минск 393 138
Отв.1065  23 Янв. 18, 20:32, через 35 мин
Тогда уж лучше вот этот, чтоб не выбивало перегрузкой посреди процесса:
https://ru.aliexpress.com/...35ac1&tpp=1
BogAD Кандидат наук Красногорск - Белово 403 184
Отв.1066  23 Янв. 18, 21:58
...Ну что здесь может быть?...OldBean, 23 Янв. 18, 08:36

Сергей, я с Дифами на 2 DINa дело не имел, а вот аж на 4 DINa, очень даже. Даже получилось как  у тебя...
У меня такой. Было два, стало одЫн...

 Ненавязчивая автоматизация ректификационной установки
Ненавязчивая автоматизация ректификационной установки. Автоматика.


По факту, это двухполюсный автомат + диф.приставка.
Было в наличии 2 шт. Остался жив один. Симптомы те же.
Как получилось:
Исследовал устройство для нужд нашей темы. раскрутил связку. Автоматы не стал разбирать, т.к. на клепках. А вот диф.приставку разобрал, покрутил, что-то похоже как у тебя, Сергей, только чуток помассивней, плата со схемой (сильно не изучал), трансформатор на фер.кольце, через который идут силовые провода в изоляции, соленоид, механизм отсечки на соседний авт.выключатель.
Поизучал, собрал обратно в корпус. Решил проверить как отсекает но с корпусом 2-х полюсного автомата не стал сцепляться.
На провода, что через трансформатор проходят, что после автомата подключены (с низу на фото под крышечкой), запитал от 220 и... нажал кнопку ТЕСТ.
Рычание и дым...
Ненавязчивая автоматизация ректификационной установки
Ненавязчивая автоматизация ректификационной установки. Автоматика.

В итоге внутренности как от тебя.
Посидел, репу почесал.
Ёшкин кот! Так это же элементарно!
Ненавязчивая автоматизация ректификационной установки
Ненавязчивая автоматизация ректификационной установки. Автоматика.

Схема по факту обычный тригер-защелка. По достижению порога его срабатывания, открывается ключ и подается 220 на соленоид. А соленоид, через механизм отсечки должен заставить сработать автомат, и питание на "схему" ДИФа должно пропасть. Произойти это должно быстро и кратковременно, а значит, на соленоиде по времени 220 будет очень мало. А  значит, габарит катушки соленоида можно раза в 4 уменьшить на допустимое длительное напряжение, т.е. вольт до 70.
А что! Главное быстродействие отличное! А до опасного перегрева катуха не успеет нагреться.
А у меня, что получилось. Схема сработала, соленоид "втянулся", а ни чего не отключилось, т.к. на прямую. На соленоид, что не рассчитный на длительный номинальный 220, от тригара-защелки прет 220 и плавимся от перегрева катушки...

Сергей, похоже у тебя случилось похожая ситуация, судя по виду потрохов и описанию случая.
Может ввод на диф.автомат случайно завел снизу ДЭФа, а выход сделал сверху?

Допустим, получилось, что при испытаниях контактора, что-то случилось, что сработал ДЭФ. Тригер-защелка, подал на соленоид полную 220 и вырубился автомат ДЭФа. Автомат то сработал, но питание на схему ДЭФа не прервется, если ввод на ДЭФ заведено снизу... и получилось что имеем.
Для простого автомата это без разницы куда ввод делаем, а вот для ДЭФа и УЗО, увы, очень даже разница...
 
volk ew и Dmi_D спасибо за диф.автомат на 1DIN. Не знал...
ps Вот что-то разонравился контактор. Увы... Пока не сформулировал, но, попробую изложить мысли.
И по фото приложенному. На живой отставший диф.автомат закрепил микрик на обратную связь по положению автомата.  Зачем? Об этом потом, чуть позже, это совсем другая история.....
20180123_172440.jpg
20180123_172440.jpg Ненавязчивая автоматизация ректификационной установки. Автоматика.
OldBean Доцент Красноярск 1K 1.4K
Отв.1067  24 Янв. 18, 04:34
Может ввод на диф.автомат случайно завел снизу ДЭФа, а выход сделал сверху?BogAD, 23 Янв. 18, 21:58
Нет. Подключено все было правильно. Там трудно перепутать. Сверху на чистейшем русском языке написано "Сеть", а снизу "Нагрузка".

Конечно, катушечка маленькая и явно рассчитана на кратковременную работу - спуск автомата, который обесточивает как нагрузку, так и, видимо, свою собственную электронику. Это, конечно, умозрительные рассуждения. Из общих соображений. Без схемы. Но почему-то сам автомат дифавтомата не сработал, катушечка осталась подключенной и перегрелась. Почему это произошло - неясно. Но - это явно слабое звено. Поэтому имеет смысл воспользоваться советом коллеги Esc и поставить именно электромеханический дифавтомат, а не электронный. И забыть об этой проблеме. В общем-то, даже просто из общих соображений понятно, что отказов у них будет поменьше. Насколько я понял на маркировке корпуса (на схемке) электронного дифавтомата, кроме реле, изображен еще и усилитель (треугольничек). Значит нужно искать без треугольничка.
Ненавязчивая автоматизация ректификационной установки
Ненавязчивая автоматизация ректификационной установки. Автоматика.
Ну а пока поставил обычный сдвоенный автомат. В крайнем случае, если не найду на 2 DIN-ширины - просто уберу с рейки индикаторы и розетку. Тогда влезет и на 4 ширины. Таких дифавтоматов (электромеханических) в округе полно.

PS
Александр, а вот у Вас на картинке дифавтомат (АД-2), судя по всему, как раз электромеханический. Это так? Вы же его разбирали, насколько можно судить по картинке. У меня совсем рядом с домом как раз такие видел недорого (кажется в районе 450 руб), на распродаже. Распродажа - это у них просто залежавшийся товар. "Неходовой" ампераж 6А и 10А. Но мне-то 10А вполне подойдет для этой задачи (установка только для ректификации, диаметр колонны - 40 мм).

PS2
Кстати, кликабельные превьюшки картинок вставлять в текст можно с помощью такой последовательности тегов:
[url=ссылка на картинку][img width=ширина превьюшки в пикселах]ссылка на эту же картинку[/img][/url]

автомат_вместо_дифа.JPG
автомат_вместо_дифа.JPG Ненавязчивая автоматизация ректификационной установки. Автоматика.
сообщение удалено
OldBean Доцент Красноярск 1K 1.4K
Отв.1068  26 Янв. 18, 12:28
17.2.3. Вариант Lite. Датчик RMS с детектором нуля. Прошивка

В этом топике мы заканчиваем описание датчика RMS с детектором нуля. Последний аспект - программное обеспечение. Это - прошивка (firmware) для самого датчика и тестовые скрипты на питоне для малинки. Тестовые скрипты мы рассмотрим в нескольких вариантах. Обычный вариант в виде "легкого" консольного приложения и - в виде приложений с графическим интерфейсом (GUI). Последнее сделано с тремя целями. Во-первых, это - небольшой тренинг для новичков в программировании на питоне. Во-вторых, просто чтобы "снять" некий "устаток" от вопросов про GUI. Впредь я попробую, по мере возможности, дублировать нормальные (консольные) скрипты, скриптами с несложной GUI-ней. Может быть удастся показать, что автоматизация установок и процессов совсем не сводится к рисованию красивых кнопок и графиков. Это мелочь. В системах с ОС и сверхвысокоуровневыми языками (типа python) GUI разумной usability делаются легко. А часто - просто элементарно. Показать, что суть автоматизации - в автоматическом управлении процессами. В алгоритмике. Она (автоматизация) не зависит от интерфейса с пользователем. Ей вообще на пользователя наплевать... ;)  Ну и, в-третьих, возможно, скрипты с GUI будут более удобными для тех, кто не любит или не привык работать с терминалом.

Но, ближе к теме... Хорошие мысли, увы, часто приходят с запозданием... Вот и с квадратным корнем получилось именно так. Самое смешное заключается в том, что в датчике RMS варианта LITE нам его вычислять совсем не нужно. И сообразил я это уже после того, как "с пристрастием" проанализировал несколько целочисленных алгоритмов извлечения корня. В том числе и sqrt из avr-libc ;)

Почему же в этом датчике RMS нам не нужно вычислять квадратный корень от суммы квадратов отсчетов АЦП? По двум причинам. Во-первых, там, в отличии от старой системы, нет индикатора и поэтому нам просто не нужно показывать RMS. А само по себе оно датчику и не нужно. Ну и во-вторых, еще забавнее. Дело в том, что нам не очень-то нужен этот квадратный корень и в самой малинке. Разве только для того, чтобы показать RMS на дисплее. Причина заключается в том, что в формуле коррекции уровня модуляции контроллера ТЭНа (для стабилизации мощности нагрева куба) используется не само значение RMS, а его средний квадрат (!):
pdm (%) = 100%*(Pуст/Pном)*(220^2/U^2)
где pdm - уровень модуляции в % (т.е. среднее количество пропущенных к нагрузке сетевых полупериодов), Pуст - уставка мощности, Pном - номинальная мощность ТЭНа при 220 В, а U^2 - это и есть измеренный средний квадрат напряжения в сети. Именно его датчик RMS непосредственно и измеряет (если, конечно, его не портить извлечением корня ;).

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

АЦП у нас 10-разрядный. Т.е. код АЦП изменяется в пределах 0 - 1023. Мы делаем 50 отсчетов напряжения в течение каждого полупериода. Время накопления (суммирования) - 1 сек. Это 100 полупериодов, т.е. - 5 тыс. отсчетов. Если АЦП все время измеряет максимально возможное значение (возвращает код 1023), то максимальное значение суммы квадратов за 1 сек будет 1023*1023*5000 = 5232645000. К сожалению, такое большое число не влезает в 32-разрядное беззнаковое слово. В нем мы можем поместить максимум 4294967296. Тем не менее, если учесть несколько обстоятельств, то все не так страшно и нам совсем не придется переходить на 64-разрядную арифметику. Настоящий кошмар для 8-разрядного процессора ;!

Что же это за обстоятельства? Во-первых, у нас есть резистор R4 (см. схему), регулируя который, мы настраиваем делитель так, чтобы максимальное (амплитудное) значение напряжения на входе АЦП не превышало 1.1 В (код - 1023 при опорном напряжении 1.1 В). У нас всегда есть возможность сделать его еще немного поменьше. Так, чтобы сумма квадратов кода "влезала" в 4-байтовое беззнаковое целое. Во-вторых, мы делаем оценку для максимально возможного напряжения в сети (ну, например, 270 В). Но в реальной работе напряжение в сети будет, естественно, меньше такого крайнего предела. Ну и самое важное - это в-третьих. В питающей сети у нас не меандр, а обычно что-то напоминающее синус. Для синуса среднеквадратичное напряжение в сети меньше амплитудного (с коэффициентом 0.707). А это значит, что сумма квадратов в накопителе уменьшится в два раза: суммируем квадраты, поэтому коэффициент тоже возводится в квадрат, т.е. 0.707*0.707 = 0.5. В результате, максимальное значение, которое может получиться в накопителе будет 5232645000*0.5 = 2616322500. А такое число уже спокойно влезает в 32-разрядное слово. С хорошим запасом. Ну, а на худой случай, у нас всегда остается возможность еще немножечко подкрутить R4 ;) В этом (в регулировке R4) и заключается, по сути, вся настройка датчика RMS.

Итак, сумма квадратов сетевого напряжения в течение 1 секунды в 4-байтовое слово у нас будет влезать. Но это значит, что и передавать малинке нам придется 4 байта, а не 2. На самом деле 2 младших байта малоинформативны (это - просуммированные шумы) и их можно было бы не передавать малинке. Но мы не будем ограничивать информацию, передаваемую малинке. Поэтому процедуру обмена по i2c все равно нужно скорректировать. Результирующий код прошивки представлен ниже.

Скрытый текст
#include <avr/io.h>
#include <util/twi.h>
#include <avr/interrupt.h>

#define F_CPU 16000000UL

#define ADDR 0x11      // Адрес устройства на шине I2C
#define ZERO_START 106 // Определяет задержку фронта импульса Zero
#define ZERO_WIDTH 13  // Определяет ширину импульса Zero (100 мкс)
#define T_ADC 49       // Определяет интервал между запусками АЦП (200 мкс)
#define SUM_MAX 5000   // Количество суммируемых отсчетов (5000 - это за 1 сек)
                       
static volatile uint8_t index = 0; // Номер отправляемого байта
static volatile uint8_t buf[4];    // Буфер обмена. Младший байт - в начале (0)
static volatile uint32_t sum;      // Сумматор квадратов отсчетов АЦП
static volatile uint16_t sc = 0;   // Счетчик просуммированных квадратов

static volatile uint8_t zFlag = 0; // Разрешение формирования импульсов Zero
//------------------------------------------------------------------------------
ISR(TWI_vect) { // Обработчик событий модуля TWI
 switch(TW_STATUS) {    // Статус - в 5 старших битах регистра TWSR
   case TW_SR_DATA_ACK: // Данные приняты, ACK отправлен - 0x80
     index = 0; // При любом приеме index сбрасываем на первый байт буфера
     break;
   case TW_ST_SLA_ACK:  // Запрос SLA+R, ACK отправлен - 0xA8
     TWDR = buf[index++]; // Очередной байт - в регистр данных TWI
     if(index == 4) index = 0; // Весь буфер отправлен - вернемся к его началу
     break;
   case TW_BUS_ERROR:   // Неверные условия "старт" или "стоп" - 0x00
     TWCR = _BV(TWIE) | _BV(TWINT) | _BV(TWEA) | _BV(TWEN); // "Сброс" TWI
     break;
 }
 TWCR |= _BV(TWINT);   // Флаг TWINT здесь НЕ очищается автоматически! Очистим.
}
//------------------------------------------------------------------------------
ISR(TIMER0_COMPA_vect) { // Обработчик по совпадению с регистром A
 ADCSRA |= _BV(ADSC); // Запуск преобразования
}
//------------------------------------------------------------------------------
ISR(ADC_vect) { // Преобразование закончено
 register uint32_t val = ADCL; val |= ((uint32_t)ADCH) << 8;
 sei(); // Следующие фрагменты не требуют атомарности; разрешим прерывания
 sum += val*val; // Суммирование квадратов кода АЦП - 6 мкс
 if(++sc == SUM_MAX) { // Насуммировали достаточно
   register uint32_t csum = sum;
   // Занесем полученную сумму квадратов кода АЦП в буфер обмена
   buf[0] = csum & 0xFF; csum >>= 8;
   buf[1] = csum & 0xFF; csum >>= 8;
   buf[2] = csum & 0xFF; csum >>= 8;
   buf[3] = csum & 0xFF;
   sc = 0; sum = 0; // Сбрасываем счетчик и сумматор
 }
}
//------------------------------------------------------------------------------
ISR(INT0_vect) { // Внешнее прерывание на пине PB2/INT0
 GTCCR = _BV(PSRASY); // Сброс предделителя таймера 2
 TCNT2 = 0; // Обнуляем счетчик таймера 2
 zFlag = 1; // Разрешаем формирование импульса Zero
}
//------------------------------------------------------------------------------
ISR(TIMER2_COMPA_vect) { // Обработчик по совпадению с регистром A
 if(!zFlag) return;
 PORTB |= _BV(PB0); // Формируем фронт импульса на шине Zero
}
//------------------------------------------------------------------------------
ISR(TIMER2_COMPB_vect) { // Обработчик по совпадению с регистром B
 if(!zFlag) return;
 PORTB &= ~_BV(PB0); // Формируем спад импульса на шине Zero
 zFlag = 0; // Запрещаем формирование "ложных" импульсов Zero
}
//------------------------------------------------------------------------------
int main(void) {
 DDRB = _BV(PB0); // Пин PB0 - на вывод (сигнал Zero)
 DDRB |= _BV(PB1); // Пин PB1 используется для диагностических целей
 // Инициализация TWI-модуля --------------------------------------------------
 TWAR = ADDR << 1;   // Адрес устройства - в старших 7 битах
 TWCR = _BV(TWIE);   // Разрешаем прерывания от TWI
 TWCR |= _BV(TWEA);  // Разрешаем подачу импульса ACK
 TWCR |= _BV(TWINT); // Очистим флаг TWINT (очищается при установке в 1)
 TWCR |= _BV(TWEN);  // Разрешаем работу TWI и активирует TWI-интерфейс
 // Инициализация таймера 0 для тактирования АЦП ------------------------------
 TCCR0A = _BV(WGM01); // Счетчик работает в режиме CTC (сброс по совпадению)
 TCCR0B = _BV(CS01) | _BV(CS00); // Предделитель на 64 (на счетчик - 250 кГц)
 OCR0A = T_ADC; // Определяет период запуска АЦП
 TIMSK0 |= _BV(OCIE0A); // Разрешаем прерывания по совпадению с OCR0A
 // Инициализация АЦП ---------------------------------------------------------
 ADMUX = 0; // Канал 0 (ADC0), MUX3...0 = 0
 ADMUX = _BV(REFS1) | _BV(REFS0); // Внутр. источник опорного напряжения 1.1V
 ADCSRA = _BV(ADEN); // АЦП включен
 ADCSRA |= _BV(ADIE); // По окончанию преобразования - прерывание
 ADCSRA |= _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0); // Предделитель на 128
 // Инициализация внешнего прерывания INT0
 EICRA = _BV(ISC01); // Прерывания по спаду уровня на пине PD2/INT0
 EIMSK = _BV(INT0); // Разрешаем внешние прерывания на пине PD2/INT0
 // Инициализация таймера 2 для формирования импульса нуля Zero
 // Счетчик работает в обычном режиме (Normal mode)
 TCCR2B |= _BV(CS22) | _BV(CS20); // Предделитель на 128 (сч. - 125 кГц)
 OCR2A = ZERO_START; // Фронт импульса Zero
 OCR2B = ZERO_START + ZERO_WIDTH; // Спад импульcа Zero
 TIMSK2 = _BV(OCIE2A) | _BV(OCIE2B); // Разрешаем прерывания по совпадению
 
 sei(); // Разрешаем глобальные прерывания
 while(1) { // Бесконечный цикл
 }
 return 0;
}

Прошивка не сильно отличается от той, которую мы рассматривали при описании макета датчика RMS. Убран фрагмент с корнем и обмен с малинкой производится четырьмя байтами, а не двумя. Текст кода подробно прокомментирован. Разобраться, если появится желание, будет несложно. Текст прошивки (main.c) и готовый hex-файл для ATMega328p - в архиве в приложении к данному топику.

Следующий шаг после прошивки - регулировка и калибровка датчика RMS. Физическая конфигурация этого действия зависит от компоновки системы. У меня к резистору R4, если плата датчика RMS вставлена в крейт, так просто не подобраться. Поэтому я подключил ее на "проводках". Как показано на рисунке ниже:
 Ненавязчивая автоматизация ректификационной установки
Ненавязчивая автоматизация ректификационной установки. Автоматика.

Для этой опереации достаточно подключить только сеть и часть цифровой части общей шины: линии SDA, SCL, GND и +5V. Все подключения желательно проводить при выключенной малинке, т.к. линии крейта непосредственно подключены малинкиному к разъему GPIO. Дальше последовательно выполняем следующие шаги:

1. Включаем малинку и подаем высокое на сетевые шины крейта.
2. Резистор R4 крутим против часовой стрелки "до упора". На входе АЦП в этом случае будет нулевое напряжение.
3. На малинке запускаем тестовый скрипт test_08.py. Текст скрипта ниже.

Скрытый текст
# _*_ coding: utf8 _*_
import time # В этом модуле - задержки
import smbus # В этом модуле - средства для работы с шиной i2c
import math # В этом модуле математические функции
#-------------------------------------------------------------------------------
# Тестирование и калибровка датчика RMS.
# OldBean, 26.01.2018
#-------------------------------------------------------------------------------
addrR = 0x11 # Адрес датчика RMS
a = 0.3838 # Калибровочный коэффициент для перевода кода в вольты
cntr = 0 # Счетчик измерений RMS напряжения сети
#-------------------------------------------------------------------------------
def meas(): # Получение кода и вычисление RMS
 global cntr; cntr += 1 # Модифицируем счетчик измерений
 bus.write_byte(addrR, 0); # Установка индекса байтов в датчике RMS на 0
 crms = bus.read_byte(addrR)        # Читаем 4 байта с датчика RMS (начиная с
 crms |= bus.read_byte(addrR) << 8  # младшего и собираем 32-разрядное слово
 crms |= bus.read_byte(addrR) << 16 # В этом слове - сумма квадратов кода АЦП
 crms |= bus.read_byte(addrR) << 24 # за 1 сек (5000 отсчетов)
 v = a*math.sqrt(crms*0.0002)  # Вычисляем RMS (0.0002 это 1/5000)
 print "%d\t%d\t%.1f" % (cntr, crms, v)
#-------------------------------------------------------------------------------
bus = smbus.SMBus(1) # Создаем объект "шина"
cntr = 0 # Счетчик отсчетов RMS напряжения сети
while True:
 meas() # Получаем код от датчика RMS, вычисляем RMS и выводим из на терминал
 time.sleep(1) # Секундочку подремлем

При выполнении этого скрипта, малинка, с периодичностью раз в секунду, просит датчик RMS прислать ей сумму квадратов кодов АЦП за прошедшую секунду и выводит этот код во второй колонке цифр на терминале (в первой - номер запроса). Третья колонка - это приблизительная оценка RMS по моей калибровке, которая заложена в скрипт. Убеждаемся, что получаемый малинкой код - нулевой.
4. Теперь начинаем крутить R4 по часовой стрелке. Значение кода на терминале должно начать увеличиваться. Продолжаем крутить R4, пока код не выйдет на уровень 2000000000 (9 нулей). На самом деле важны лишь три-четыре старших цифры. Остальные все равно будут связаны с шумами. На них не обращаем внимание - они будут "болтаться".
5. Теперь измеряем текущее среднеквадратичное напряжение сети (Urms) вольтметром, умеющим измерять среднеквадратичное напряжение сети.
6. Вычисляем значение нормировочного коэффициента по формуле
a = Urms/sqrt(код*0.0002)
, где код - это текущее значение из средней колонки, выдаваемой скриптом. Главное - первые (старшие) цифры.
7. Теперь можно скорректировать значение калибровочного коэффициента a в данном скрипте и по новой его запустить, чтобы в третьей колонки наблюдать правильное значение RMS вашей сети.

Все. Настройка и калибровка датчика RMS закончена. Если есть подходящий осциллограф (позволяющий смотреть сеть 220В), можно проверить работу детектора нуля. Фронт импульса на линии Zero должен опережать нуль сети не менее, чем на 100 мкс. Скорее всего так и будет. Но если нет - откорректируйте константу ZERO_START в прошивке (ее определение почти в самом начале текста кода прошивки).

Ну а теперь давайте "приладим" простенький GUI к нашему тестовому скрипту, который мы только что использовали. Здесь я предполагаю, что к малинке подключен монитор, клавиатура и мышка. Т.е. она у нас работает как обычный компьютер (рабочая станция). Для создания GUI будем использовать библиотеку Tkinter. Она входит в базовую инсталляцию питона для малинки. Про эту библиотеку очень много написано в сети. Поэтому не имеет смысла здесь на ней подробно останавливаться. Текст модифицированного скрипта, реализующего GUI, приведен ниже (файл test_08_gui.py тоже есть в приложении к топику):

Скрытый текст
# _*_ coding: utf8 _*_
import time # В этом модуле - задержки
import smbus # В этом модуле - средства для работы с шиной i2c
import math # В этом модуле математические функции (sqrt, в частности)
from Tkinter import * # В этом модуле виджеты для GUI
#-------------------------------------------------------------------------------
# Тестирование и калибровка датчика RMS.
# OldBean, 26.01.2018
#-------------------------------------------------------------------------------
addrR = 0x11 # Адрес датчика RMS
a = 0.3838 # Калибровочный коэффициент для перевода кода в вольты
cntr = 0 # Счетчик измерений RMS напряжения сети
#-------------------------------------------------------------------------------
def meas(): # Получение кода и вычисление RMS
 global cntr; cntr += 1 # Модифицируем счетчик измерений
 bus.write_byte(addrR, 0); # Установка индекса байтов в датчике RMS на 0
 crms = bus.read_byte(addrR)        # Читаем 4 байта с датчика RMS (начиная с
 crms |= bus.read_byte(addrR) << 8  # младшего и собираем 32-разрядное слово
 crms |= bus.read_byte(addrR) << 16 # В этом слове - сумма квадратов кода АЦП
 crms |= bus.read_byte(addrR) << 24 # за 1 сек (5000 отсчетов)
 v = a*math.sqrt(crms*0.0002)  # Вычисляем RMS (0.0002 это 1/5000)
 txtCntr.configure(text = "%d " % (cntr)) # Выводим значение счетчика
 txtCode.configure(text = "%d " % (crms)) # Выводим значение кода
 txtRMS.configure(text = "%.1f " % (v)) # Выводим значение RMS
 txtCode.after(1000, meas) # Через 1 сек (1000 мс) опять вызовем meas
#-------------------------------------------------------------------------------
bus = smbus.SMBus(1) # Создаем объект "шина"
# Создаем объекты GUI
root = Tk(); root.geometry('134x60'); root.title('RMS') # Главное окно
labCntr = Label(text = 'Измерений = ', width = 12) # Метка окна счетчика
txtCntr = Label(width = 5, anchor = 'e') # Окно вывода счетчика
labCode = Label(text = 'Код = ', width = 6) # Метка окна кода
txtCode = Label(width = 10, anchor = 'e') # Окно вывода кода
labRMS = Label(text = 'RMS = ', width = 6) # Метка окна RMS
txtRMS = Label(width = 5, anchor = 'e') # Окно вывода RMS
# Размещаем виджеты в главном окне
labCntr.place(x = 0, y = 0); txtCntr.place(x = 90, y = 0)
labCode.place(x = 0, y = 20); txtCode.place(x = 50, y = 20)
labRMS.place(x = 0, y = 40); txtRMS.place(x = 90, y = 40)

txtCode.after(1000, meas) # Через 1 сек (1000 мс) будет вызов функции meas
root.mainloop() # Главный цикл приложения

Как видим, скрипт не сильно "раздулся". Соответствующие комментарии я вставил. Запускаем скрипт также из консоли:
python test_08_gui.py
На дисплее малинки мы должны увидеть крохотное окошечко, на котором представлены: количество запросов к малинке, последнее значения кода и последнее значение RMS.
Ненавязчивая автоматизация ректификационной установки
Ненавязчивая автоматизация ректификационной установки. Автоматика.

Понятно, что для получения корректных значений RMS в скрипте нужно поправить значение переменной a в соответствии с калибровкой, которую мы рассмотрели выше. Пока там стоит мое значение. Ну а если калибровкой и расчетом этого коэффициента было заниматься лень, то можно воспользоваться следующим примером скрипта с GUI, который максимально упрощает эту процедуру. Текст скрипта представлен ниже. Соответствующий файл test_08_gui_calibr.py тоже есть в приложении к топику.

Скрытый текст
# _*_ coding: utf8 _*_
import time # В этом модуле - задержки
import smbus # В этом модуле - средства для работы с шиной i2c
import math # В этом модуле математические функции (sqrt, в частности)
from Tkinter import * # В этом модуле виджеты для GUI
import tkMessageBox as mbox # Чтобы ругаться
#-------------------------------------------------------------------------------
# Тестирование и калибровка датчика RMS.
# OldBean, 26.01.2018
#-------------------------------------------------------------------------------
addrR = 0x11 # Адрес датчика RMS
a = 0.3838 # Калибровочный коэффициент для перевода кода в вольты
cntr = 0 # Счетчик измерений RMS напряжения сети
crms = 0 # Код, получаемый от датчика RMS
#-------------------------------------------------------------------------------
def meas(): # Получение кода и вычисление RMS
 global crms, cntr; cntr += 1 # Модифицируем счетчик измерений
 bus.write_byte(addrR, 0); # Установка индекса байтов в датчике RMS на 0
 crms = bus.read_byte(addrR)        # Читаем 4 байта с датчика RMS (начиная с
 crms |= bus.read_byte(addrR) << 8  # младшего и собираем 32-разрядное слово
 crms |= bus.read_byte(addrR) << 16 # В этом слове - сумма квадратов кода АЦП
 crms |= bus.read_byte(addrR) << 24 # за 1 сек (5000 отсчетов)
 v = a*math.sqrt(crms*0.0002)  # Вычисляем RMS (0.0002 это 1/5000)
 txtCntr.configure(text = "%d " % (cntr)) # Выводим значение счетчика
 txtCode.configure(text = "%d " % (crms)) # Выводим значение кода
 txtRMS.configure(text = "%.1f " % (v)) # Выводим значение RMS
 txtA.configure(text = "%.4f " % (a)) # Выводим калибровочный коэффициент
 txtCode.after(1000, meas) # Через 1 сек (1000 мс) опять вызовем meas
#-------------------------------------------------------------------------------
def calc(): # Вычисление калибровочного коэффициента a
 global a, crms
 try: # Попытаемся считать введенное образцовое напряжение
   v = float(sa.get()) # Преобразуем строку в число (успешно)
   if v > 100 and v < 300: # Если оно в разумном диапазоне - работаем дальше
     a = v/math.sqrt(crms*0.0002) # Вычисляем калибровочный коэффициент
   else: # Выход за границы допустимого диапазона
     mbox.showerror('Ошибка', 'Заданное напряжение выходит за границы диапазона (100-300 В)')
 except ValueError: # Обработка исключения (введено не число)
   mbox.showerror('Ошибка', 'Введите число - среднеквадратичное напряжение сети в вольтах')
#-------------------------------------------------------------------------------
bus = smbus.SMBus(1) # Создаем объект "шина"

# Создаем объекты GUI
root = Tk(); root.geometry('136x132'); root.title('RMS') # Главное окно
labCntr = Label(text = 'Измерений = ', width = 12) # Метка окна счетчика
txtCntr = Label(width = 5, anchor = 'e') # Окно вывода счетчика
labCode = Label(text = 'Код = ', width = 6) # Метка окна кода
txtCode = Label(width = 11, anchor = 'e') # Окно вывода кода
labRMS = Label(text = 'RMS = ', width = 6) # Метка окна RMS
txtRMS = Label(width = 5, anchor = 'e') # Окно вывода RMS
fr = Frame(width = 134, height = 1, bg = 'red')
labRMSm = Label(text = 'Изм RMS = ', width = 10) # Метка окна измеренного RMS
# entRMSm - это окошечко для ввода RMS, измеренного образцовым вольтметром,
# а sa - это переменная, непосредственно связанная с содержимым этого окна
sa = StringVar(); sa.set('0')
entRMSm = Entry(width = 5, justify = RIGHT, textvariable = sa)
labA = Label(text = 'Коэф. = ', width = 8) # Метка окна измеренного RMS
txtA = Label(width = 6, anchor = 'e') # Окно вывода RMS
but = Button(text = 'Вычисл. коэф.', command = calc)

# Размещаем виджеты в главном окне
labCntr.place(x = 0, y = 0); txtCntr.place(x = 90, y = 0)
labCode.place(x = 0, y = 20); txtCode.place(x = 42, y = 20)
labRMS.place(x = 0, y = 40); txtRMS.place(x = 90, y = 40)
fr.place(x = 0, y = 60)
labRMSm.place(x = 0, y = 62); entRMSm.place(x = 88, y = 62)
labA.place(x = 0, y = 82); txtA.place(x = 80, y = 82)
but.place(x = 8, y = 102)

txtCode.after(1000, meas) # Через 1 сек (1000 мс) будет вызов функции meas
root.mainloop() # Главный цикл приложения

При запуске этого скрипта на экране малинки появится окно, вид которого приведен ниже:
Ненавязчивая автоматизация ректификационной установки
Ненавязчивая автоматизация ректификационной установки. Автоматика.

По сути, этот скрипт делает все то же самое, что и предыдущий, плюс - добавлен небольшой сервис для калибровки. После того, как измерено среднеквадратичного напряжения сети образцовым вольтметром, мы можем ввести это значение в поле "Изм RMS" и нажать кнопку "Вычисл.коэф.". Скрипт рассчитает значение калибровочного коэффициента по текущему коду, полученному от малинки, выведет его в соответствующее поле ("Коэф") и впредь (в данном процессе) будет использовать новое значение при вычислении RMS.

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

Пока все работает нормально. Без сбоев. В разных сочетаниях ;) Подробное описание силовых модулей и их прошивок я подготовлю. Но немного позже - сейчас пока нет возможности этим плотно заняться.

Предыдущий топик  Вернуться к оглавлению  Следующий топик

PS
Если кто-нибудь захочет поплотнее заняться GUI на питоне при помощи Tkinter, то самая лучшая книжка на эту тему доступна в сети: J.E.Grayson. Python and Tkinter Programming. 2000. Она на импортном языке, но очень много картинок и примеров кода. Думаю, многие вещи будут ясны и тем коллегам, кто не очень уверен в своем английском.
027_rms_calibration.JPG
027_rms_calibration.JPG Ненавязчивая автоматизация ректификационной установки. Автоматика.
028_gui.png
028_gui.png Ненавязчивая автоматизация ректификационной установки. Автоматика.
029_pms_and_rms_test.JPG
029_pms_and_rms_test.JPG Ненавязчивая автоматизация ректификационной установки. Автоматика.
030_pms_and_rms_gen_view.JPG
030_pms_and_rms_gen_view.JPG Ненавязчивая автоматизация ректификационной установки. Автоматика.
028_gui_2.png
028_gui_2.png Ненавязчивая автоматизация ректификационной установки. Автоматика.

firmware.zip 8.3 Кб
U-M Магистр MSK 210 39
Отв.1069  26 Янв. 18, 13:58
Спасибо!

Вот... Вопросы полезли:

1. Насчет приведения напряжения на входе АЦП к 1.1 В. Сейчас наверное криво скажу мысль, но если напряжение в диапазоне 0-1.1В, не окажется, что мы с нашей разрядность в 1024 отсчета загрубим измерения, по отношению к диапазону 0-5В ?
2. Вот насчет импульса Zero - почему так критично, чтобы он опрежал переход через ноль на 100 мкс ? Что будет если он ноль-в-ноль будет формироваться или запаздывать? Ну конкретнее, к триаку, который будет мощность на ТЭНе регулировать?
3. А еще постоянная составляющая в сети 220В. Как понял, ее возможное присутствие сейчас не учитывается?
OldBean Доцент Красноярск 1K 1.4K
Отв.1070  26 Янв. 18, 18:27
1. Честно говоря, не совсем понял суть первого вопроса. АЦП МК датчика RMS измеряет только RMS напряжения сети, которое нормируется на диапазон 0-1.1 В при помощи понижающего трансформатора и делителя R3-R4. Причем тут диапазон 0-5В? Сигнал не зашумлен. Так что 1-вольтового диапазона вполне достаточно.

2. В силовых модулях моська с нулем. В контроллере ТЭНа мощность регулируется при помощи алгоритма Брезенхема. Решение о том, пропускать следующий полупериод сетевого напряжения к нагрузке или не пропускать (соотвественно, - подать или не подать управляющий импульс на затвор триака) должно быть принято до прихода нуля сети, т.к. моська позволит открыться триаку только в нуле (на затворе уже должен быть сигнал). Если же МК начнет соображать точно в момент нуля тока, то импульс он подаст чуть позже нуля и триак в этом полупериоде уже не откроется. Как показывает опыт 100 мкс форы вполне достаточно для AVR-ки, чтобы подумать, принять решение и открыть (или не открыть) триак.

Для ШИМ-регулирования (например, в клапане отбора) это не так критично. Но, при малых уровнях модуляции, ошибка 10 мс (это 1 полупериод) становится уже заметной. Поэтому синхронизация ШИМ с сетью тоже становится желательной.

3. Да. Поскольку измерения ведутся через трансформатор, то постоянная составляющая здесь никак не учитывается.
U-M Магистр MSK 210 39
Отв.1071  29 Янв. 18, 00:01
Эммм... С другой стороны подойду к вопросу:

Трансформатор понижает 220В, которые потом выпрямляются и гасятся на резисторах. В итоге имеем, что напряжение изменится в диапазоне от 0 до 1.1 В при изменении входного напряжения от 100 до 300 В. А если диапазон будет 2.5 или 5 В при тех же 100-300 В?

То есть сможем-ли мы увидеть колебания сетевого напряжения и отреагировать на них, если диапазон АЦП 1.1 В? Или такие колебания в сети не оказывают существенного влияния на "процесс"?
OldBean Доцент Красноярск 1K 1.4K
Отв.1072  29 Янв. 18, 02:55
Эммм... С другой стороны подойду к вопросу:U-M, 29 Янв. 18, 00:01
Да с любой стороны... ;)
Принцип работы этого кусочка кремния очень прост (см. схему в разделе 24.2 в datasheet-е на ATMega328): опорное напряжение (любое в допустимых пределах) подается на вход ЦАП (цифро-аналоговый преобразователь). Напряжение с выхода ЦАП сравнивается с измеряемым напряжением при помощи компаратора. "Думатель" АЦП быстренько-быстренько подбирает цифровой код ЦАП таким, чтобы напряжение на выходе ЦАП было как можно ближе к измеряемому. Именно этот код мы и получим от модуля АЦП в качестве конечного результата.

Поэтому диапазон АЦП в вольтах зависит от опорного напряжения. Если опорное напряжение равно 1.1В, то код 1023 будет при напряжении на входе 1.1В и более. Если же опорное напряжение будет 5В, то код 1023 Вы получите когда напряжение на входе АЦП будет 5 В и более. Собственно говоря, АЦП измеряет отношение входного напряжения к опорному (см. формулу в разделе 24.7 в datasheet-е на ATMega328).

Ну а сетевое напряжение в датчике RMS нужно просто поделить делителем R3-R4 так, чтобы максимальное амплитудное значение не превышало используемого опорного напряжения.

PavelSaratov Доктор наук Саратов 622 80
Отв.1073  29 Янв. 18, 06:58
 Можно вмешаться в дискуссию?
Вопрос у человека, как я понял (если я вообще правильно понял): "Берем больно маленький диапазон напряжения. Всего 0-1.1В. Хватит ли нам "чуткости"?
Ответ: "Получим ту же самую "чуткость" как на любом диапазоне хоть 0-5, хоть 0-2.5, хоть 0-1.1 В. А именно в 1024 возможных уровня напряжения. Можно было бы приводить и к диапазону 0 - 0.001 Вольта , но шумы на таким маленьких напряжениях испортят все дело.
Сам диапазон никак не может скакнуть до 2,5 или до 5 В , если подстроен резисторами в 0-1.1 В. Если он по каким то магическим причинам (или халатности) туда скакнет - АЦП просто будет в зашкале 1024 для любого напряжения более 1,1 вольта). Или сгорит как только выйдет за допустимые пределы для ножки. Там где 5В из ниоткуда , там и 10В."
OldBean Доцент Красноярск 1K 1.4K
Отв.1074  30 Янв. 18, 05:33
Вчера пришли из поднебесной парочка вот таких мини-упсиков:
 Ненавязчивая автоматизация ректификационной установки
Ненавязчивая автоматизация ректификационной установки. Автоматика.

Этот упсик может работать в двух режимах. Режим B - просто как обычный 5-вольтовый блок питания на 2 А и режим A, в котором все то же самое и плюс: если пропадает питание, подключается батарейка 18650. Для переключения между режимами - есть микропереключатель. Естественно, в режиме A переход на питание от батарейки происходит автоматически. Маленькие разноцветные светодиодики всякое показывают (режим, состояние батарейки и т.п.).

Естественно, сразу же захотелось проверить, потянут они малинку с периферией или нет. Периферия - это крейт с воткнутыми датчиком RMS и тремя контроллерами (силовыми модулями). Тест простой. Малинка (а крейт с модулями питается через малинку) подключена через упсик, остальное к сети напрямую. Тестовый скрипт на малинке измеряет напряжение в сети, выводит его на терминал. Если напряжение пропало - сообщает об этом и увеличивает паузу между опросами сети (симулякр перехода в экономичный режим и перевода в такой же режим модулей крейта ;). При появлении напряжения в сети малинка переходит в обычный режим работы. Текст скрипта ниже. Он подробно прокомментирован, поэтому тоже может послужить новичкам в питоне для тренировки.
Скрытый текст
# _*_ coding: utf8 _*_
import time # В этом модуле - задержки
import smbus # В этом модуле - средства для работы с шиной i2c
import math # В этом модуле математические функции
#-------------------------------------------------------------------------------
# Тестирование и калибровка датчика RMS
# OldBean, 26.01.2018
#-------------------------------------------------------------------------------
addrR = 0x11 # Адрес датчика RMS
a = 0.3838 # Калибровочный коэффициент для перевода кода в вольты
cntr = 0 # Счетчик измерений RMS напряжения сети
stime = 1.0 # Длительность паузы
#-------------------------------------------------------------------------------
def meas(): # Возвращает код, полученный от датчика RMS
 bus.write_byte(addrR, 0); # Установка индекса байтов в датчике RMS на 0
 crms = bus.read_byte(addrR)        # Читаем 4 байта с датчика RMS (начиная с
 crms |= bus.read_byte(addrR) << 8  # младшего и собираем 32-разрядное слово
 crms |= bus.read_byte(addrR) << 16 # В этом слове - сумма квадратов кода АЦП
 crms |= bus.read_byte(addrR) << 24 # за 1 сек (5000 отсчетов)
 return crms
#-------------------------------------------------------------------------------
bus = smbus.SMBus(1) # Создаем объект "шина"
cntr = 0 # Счетчик отсчетов RMS напряжения сети
while True:
 crms = meas() # Получаем код от датчика RMS, вычисляем RMS и выводим из на терминал
 cntr += 1
 v = a*math.sqrt(crms*0.0002)  # Вычисляем RMS (0.0002 это 1/5000)
 print "%d\t%d\t%.1f" % (cntr, crms, v)
 if v > 100.0: # Сеть есть
   if stime > 1.0: # А точнее - появилась
     print 'Сеть появилась - работаем...'
     stime = 1.0 # Уменьшим паузы
 else: # Сети нет
   if stime < 10.0: # А точнее - пропала
     print 'Сеть пропала - отдыхаем...'
     stime = 10.0 # Увеличим паузы
 time.sleep(stime) # Подремлем...
Связь с малинкой по ssh с рабочей станции под Ubuntu. Запуск теста, естественно, тоже.

Итак, запускаем тест. Смотрим как работает малинка. Затем отключаем сеть (от и от малинки и от крейта). Малинка все правильно говорит нам о пропаже сети и продолжает работать как ни в чем ни бывало. Так что упсик спокойно все цифровое хозяйство тянет. Потом опять подключаем сеть - малинка на это тоже реагирует правильно.

Сеанс - на скриншоте ниже:
 Ненавязчивая автоматизация ректификационной установки
Ненавязчивая автоматизация ректификационной установки. Автоматика.


031_miniUPS.JPG
031_miniUPS.JPG Ненавязчивая автоматизация ректификационной установки. Автоматика.
032_screenshot.png
032_screenshot.png Ненавязчивая автоматизация ректификационной установки. Автоматика.
PavelSaratov Доктор наук Саратов 622 80
Отв.1075  30 Янв. 18, 07:58
OldBean - проверь этот UPS и его самый переход из нормального состояния в состоянии от батареи - при эмм "дребезге котактов". Т.е. быстрая череда подключений отключений. Ну и вообще быстро его туда сюда повтыкай - повынимай.
Alex_64 Профессор ТЛТ 2.4K 1.2K
Отв.1076  30 Янв. 18, 09:09
Шнайдеров вроде есть на 2 места (36 мм). Правда токи 25 и 40 А.U-M, 23 Янв. 18, 19:23
Свежий опыт по Шнайдерам: В прошлом году купил УЗО Шнайдер 40А, поставил на простейшую автоматику (РМ-2, 3 шт W1209, ШИМ), год отработал без проблем, недавно по подсказке проверил УЗО магнитом - сработало как электромеханическое. Сейчас собираю новую автоматику, купил Шнайдер на 25А - он в другом корпусе и на магнит не реагирует - электронное. 
gol_avto Доцент Москва - Серпухов - Анапа 1.3K 458
Отв.1077  30 Янв. 18, 10:32
OldBean
Сергей. А про датчик атмосферного давления мы не забыли? Его бы разместить на несущей плате (bus) или он будет в составе темп. сервера?
m16 Модератор Тамбов 1.9K 1K
Отв.1078  30 Янв. 18, 11:02, через 30 мин
придется переходить на 64-разрядную арифметику. Настоящий кошмар для 8-разрядного процессораOldBean, 26 Янв. 18, 12:28
   ерунда. 5232645000 есть 0х 0001 37E3 D388.  пользую 48-миразрядную целочисленку, авр рвёт её как тузик грелку . деление 48/16 занимает максимум 1321 такт , sqrt32 - 544 такта. на меге вполне реализуется автономный стабилизатор напряжения, которому только посылай по и2ц значение напряжения  и по ней же опрашивай состояние модуля. чем это ещё хорошо - лёгкая расширяемость для регулировки  мощности  3-х фазного тэна.
OldBean Доцент Красноярск 1K 1.4K
Отв.1079  30 Янв. 18, 11:44, через 43 мин
проверь этот UPS и его самый переход из нормального состояния в состоянии от батареи - при эмм "дребезге котактов". Т.е. быстрая череда подключений отключений. Ну и вообще быстро его туда сюда повтыкай - повынимай.PavelSaratov, 30 Янв. 18, 07:58
Ну а цель-то какова? Просто руками втыкать-вытыкать - слишком медленно. Ничего не происходит. Каких-то провалов, чтобы малинка отрубилась не наблюдается. На 5-вольтовой шине крейта при включенной сети - 4.93V, без сети - 4.63V. Но если посмотреть "однократным вооруженным глазом", то при включении сети есть высокочастотный дребезг. Характерные частоты - от единиц МГц и выше. При выключении - никакого дребезга поймать не удается. На длительных (секудных) развертках - очень чистые маленькие ступеньки (4.93V <-> 4.63V). Без провалов и всплесков. Так что для безаварийного питания цифровой части системы - очень даже неплохое, готовое решение.

Щупы осциллографа "соплями" подключены, поэтому ВЧ-дребезг вполне может быть и от них, а не от упсика. Но сильно углубляться в эти вопросы сейчас просто физически нет возможности. Да и смысла особого в таком исследовании пока вроде бы не видно. А краш-тесты устраивать (не только для упсика, но для малинки с модулями) по понятным причинам не хотелось бы... ;)

А про датчик атмосферного давления мы не забыли? Его бы разместить на несущей плате (bus) или он будет в составе темп. сервера?gol_avto, 30 Янв. 18, 10:32
Не забыли. Я планировал сделать для него переходник и вставить в какое-нибудь свободное гнездо на крейте. Просто руки еще не дошли.

ерунда. 5232645000 есть 0х 0001 37E3 D388.  пользую 48-миразрядную целочисленку, авр рвёт её как тузик грелку . деление 48/16 занимает максимум 1321 такт , sqrt32 - 544 такта. на меге вполне реализуется автономный стабилизатор напряжения, которому только посылай по и2ц значение напряжения  и по ней же опрашивай состояние модуля. чем это ещё хорошо - лёгкая расширяемость для регулировки  мощности  3-х фазного тэна.m16, 30 Янв. 18, 11:02
Вы упустили в начале цитаты частицу "НЕ". В результате - довольно "изящно" поменяли смысл цитаты на противоположный ;) Там было - "не придется". Не нужно ни 64-разрядной арифметики, ни 48 разрядной, ни деления, ни корня. И, тем более, - 3-х фазного ТЭНа. Я очень рад за Тузика ;,) но, самое смешное, что даже точной (и тем более, автономной) стабилизации мощности/напряжения в этой системе (с автоматическим регулированием скорости отбора) не нужно. Вполне достаточно - приблизительной. От грубых колебаний и трендов питающей сети. Проверено на практике. Многократно.