Re: Регуляторы мощности для ТЭНов
условный ноль(3.7...v).
Форум самогонщиков, винокуров, виноделов, пивоваров, бондарей и очень хороших людей |
Назад 1 … 68 69 70 71 72 … 87 Следующая
Чтобы отправить ответ, вы должны войти или зарегистрироваться
с 1 381 по 1 400 из 1 726
условный ноль(3.7...v).
с одной ардуинки подать на вторую сигналы управления...сделаю оптическую развязку.
Между ардуинами? Универсальные развязки дорогие. А вот какую нибудь по-проще... для не очень торопливого обмена... Было-бы здОрово. Тогда и трансформаторы не нужны. Делитель - ардуино - развязка - ардуино. Или не так?
ни какого обмена не планируется.увеличение уменьшение выходного напряжения режим разгон стоп и все.просто лень сразу опто пары ставить на развязку.где то читал на опто парах делают обмен данными между ардуинками неспешный обмен как раз и идет.помоему там откуда схема и скеч.
Его заказал позавчера в виде полного модуля-датчика для переменного напряжения, выпаяю транс оттуда,
наверное можно и модуль целиком использовать,только скеч надо отредактировать,и библиотеку под этот модуль поставить.я в скечах в c++ не силен вообще ни как,поэтому в этом вопросе помочь ни чем не смогу.
Так у нас принято, если начал - завершай...
Что бы завершить, решил представить регулятор мощности (целые полупериоды), переделанный (переписанный) в максимально простой, учебный. Вообще без прерываний в коде, без настроек АЦП, без детекторов нуля, в общем, для таких как .... я.
Скетч прилагаю со слезами… Это образец - как делать не надо, но можно…
Вот схема.
Сетевое напряжение (с запасом) – 400 … +400 преобразуем с помощью трансформатора, диодного моста и делителя в 0 … +5 . Измеряем мгновенные значения ардуиной, просто тупо analogread(). На картинке более 70 точек, которые успевает АЦП без настроек и прерываний отработать за полуцикл.
Эффективное напряжение пропорционально амплитудному – ищем максимум за устанавливаемое время. В прилагаемом скетче – за 2 секунды ( 200 полупериодов).
Вот тест стабильности (нестабильности) измерений в комфортных условиях. Виден «шум», примерно+- 0,5 В.
Алгоритм регулировки простой. Как только обнаруживаем, что напряжение падает, спрашиваем Брезенхема и включаем/выключаем управляющий импульс, далее ждем пока не обнаружим, что напряжение растет, далее ждем, пока не обнаруживаем, что напряжение падает … и т.д. Оптопара, с контролем нуля, сама разберется, когда импульс на симистор давать. А тот на нуле сам закроется. В общем, промахнуться очень трудно.
Эффективное напряжение пропорционально количеству не вырезанных импульсов, которое пропорционально переменной алгоритма Брезенхема, которую задаем, вращая потенциометр. Потенциометр – исключительно для уменьшения кода и наглядности. Дабы не тратить ресурсы на опрос потенциометра и не бороться с дребезгом, установлен тумблер: в одном положении работает регулятор мощности, в другом – только установка желаемого напряжения, от 0 до текущего сетевого. Установленная переменная алгоритма Брезенхема и напряжение, относительно которого будет стабилизация, записываются в энергонезависимую память.
Стабилизация. Если амплитудное напряжение отличается от установленного во время последней стабилизации более чем на заданную величину, переменная алгоритма Брезенхема изменяется пропорционально амплитудному напряжению. Вроде, всё.
Эта штука работает ( в другой реализации несколько месяцев), или мне кажется, что работает… В нашей деревенской сети напряжение скачет раз в секунду, на картинке видно. Падение напряжение организовывал, подключая рядом с входом регулятора электрочайник. На мой взгляд, вполне удовлетворительная стабилизация.
Кнопки, дисплеи, индикаторы, переключатели режимов специально выкинул, что бы «не замусоривать» скетч.
#include <EEPROM.h>
#define PinGnd 13 // будем использвать как GND, так было удобно припаять потенциометр
#define PinPlus 12 // будем использвать как VCC, так было удобно припаять потенциометр
#define PinPoten 14 // аналоговый вход для опроса потенциометра
#define PinImpuls 10 // для подачи управляющего импульса на оптопару
#define PinSignal 15 // аналоговый вход для измерения напряжения в сети
#define PinReg 9 // для опроса тумблера перехода в режим установки
#define PinGnd1 8 // будем использвать как GND, так было удобно припаять тумблер
const int regInterval = 100; // интервал регулирования Берзенхема от 0 с шагом 1 (в нашем случае 0 - 100 это период 1 секунда)
int regValue = 0; // количество включенных преиодов в интервале, в нашем случае это напряжение,% задается опреторм
int regError;// служебная переменная алгоритма Берзенхема, при изменении количества включений (regValue) устанавливается как 1/2 интервала regInterval
int startRegValue; // количество включенных преиодов в интервале, которое храниться в памяти, записывается при каждом изменении
bool flagBresenham = false; // решение алгоритма Берзенхема о включении/не выключении имульса
bool flagAskBresenham = false; // флаг момента необходимости принимать решение по алгоритму Берзенхема
bool flagCycle = false; // флаг, указывает, что напряжение в рамках полуцикла падает (максимум пройден)
int volt; // мгновенное значение измеренного напряжения
int volt_0; // три измеренных подряд мгновенных значений напряжения
int volt_1;
int volt_2;
int currentMaxVolt;// текущее амплитудное напряжение
int oldMaxVolt; // амплитудное напряжение, в соответствии с которым проводилась последняя стабилизация
int startMaxVolt; // амплитудное напряжение, для которого был выставлен параметр regValue, записывается в память после каждой переустановки
int maxVolt; // текущее амплитудное значение измеренного за заданный период напряжения
int const periodVoltMax =2000;// задаем период, мС определения максимума (амплитуда) напряжения
int const devMaxVolt = 5; // допустимое отклонение амплитудного напряжения (условные единицы), при котором не нужна стабилизация
int adress = 0; // условный адрес энергонезависимой паммяти в который записывается первый байт первого значения
const int resistLoad = 15; // сопротивление ТЭНа, Ом
float power = 0.; // мощность на выходе в Вт
float powerPercent = 0.; // мощность на выходе в %
float const kfVoltage = 0.24 ;// константа для пересчета напряжения в Вольты, подбирается опытным путем
float voltage; // напряжение пересчитанное в в Вольты
unsigned long int oldTime; // служебная переменная для осчета времени периода измерений амплитуды
void setup() {
Serial.begin(9600);
pinMode(PinGnd, OUTPUT);
pinMode(PinGnd1, OUTPUT);
pinMode(PinPlus, OUTPUT);
pinMode(PinImpuls, OUTPUT);
pinMode(PinReg, INPUT_PULLUP);// включаем подтягивающий резистор
// "допролнительные" GND и VCC
digitalWrite(PinGnd ,LOW);
digitalWrite(PinGnd1 ,LOW);
digitalWrite(PinPlus ,HIGH);
digitalWrite(PinImpuls,LOW); // выключаем управляющий импульс
readMem(); // читаем из памяти startRegValue и startMaxVolt
regValue = startRegValue;
regError = regValue/2;
// оределяем амплитудное напряжение - максимуи за период periodVoltMax, заполняем значение переменных
oldTime = millis();
while ( (millis () - oldTime) < periodVoltMax) {
volt = analogRead (PinSignal);
volt_0 = volt_1;
volt_1 = volt_2;
volt_2 = volt;
if (volt > maxVolt) maxVolt = volt;
}
currentMaxVolt = maxVolt;
oldMaxVolt = startMaxVolt;
maxVolt = 0;
oldTime = millis();
// отладка
Serial.println(startRegValue);
Serial.println(startMaxVolt);
powerPercent = 100.* ( (float)regValue/(float)regInterval) * ( (float)regValue/(float)regInterval);
power = ((float)currentMaxVolt * (float)regValue/(float) regInterval * kfVoltage) * ((float)currentMaxVolt * (float)regValue/(float)regInterval * kfVoltage) / resistLoad;
voltage = currentMaxVolt * kfVoltage;
// отладка
Serial.print( "Voltage = "); Serial.println(voltage);
Serial.print( "regValue = "); Serial.println(regValue);
Serial.print( "powerPercent = "); Serial.println(powerPercent);
Serial.print( "power = "); Serial.println(power);
}
void loop() {
//опрашиваем тумблер режима установки,если тумблер включен, все бросаем и "крутимся" внутри функции askPotentiometer()
// пока тумблер не будет выключен
askPotentiometer();
// если тумблер не включен
//постоянно измеряем напряжение и храним в переменных три последних величины
//будем использовать для определения: растет или падает напряжение в рамках полуцикла синусоиды
volt = analogRead (PinSignal);
volt_0 = volt_1;
volt_1 = volt_2;
volt_2 = volt;
//
if (volt > maxVolt) maxVolt = volt; //определяем максимум = амплитудное значение
// фиксируем максимум = амплитудное значение за periodVoltMax
if ( (millis () - oldTime) > periodVoltMax) {
oldTime = millis();
currentMaxVolt = maxVolt;
maxVolt = 0;
stub(); // функция стабилизации
if ( currentMaxVolt < 100) Serial.println( "ERR 01 "); // отладка
}
if ( flagCycle & (volt_0 > volt_1) & (volt_1 > volt_2)) {// если напряжение падает и это впервые за полцикла (flagCycle == true) нужно спрашивать Брезенхема
flagAskBresenham = true;
flagCycle = false; // потом изменим флаг, когда напряжение будет расти
}
if ( (!flagCycle) & ((volt_0 < volt_1) & (volt_1 < volt_2) )) {// если напряжение растет и это впервые за полцикла, нужно объявить начало нового цикла - flagCycle = true;
flagCycle = true; // потом изменим флаг, когда напряжение будет падать
}
if (flagAskBresenham) {
Bresenham();
if (!flagBresenham){
digitalWrite(PinImpuls,LOW);
}
else {
digitalWrite(PinImpuls,HIGH);
}
flagAskBresenham = false; // флаг будет изменен когда напряжение будет падать первый раз за полуцикл
}
// отладка digitalWrite(PinImpuls,HIGH);
}
void Bresenham(){
// Serial.println(imp);
regError = regError - regValue;
if (regError < 0) {
regError = regError + regInterval;
flagBresenham = true; // импульс включаетcя
}
else {
flagBresenham = false; // импульс выключается
}
}
void askPotentiometer(){
// крайние точки показаний конкретного плохого потенциометра (у правильного должноо быть 0 - 1023)
int const minPoten = 2 ;
int const maxPoten = 1020;
if ( digitalRead(PinReg)) return; // если тумблер установки не включен, возврашаемся
else { //если тумблер установки включен:
digitalWrite(PinImpuls,LOW); // во-первых выключаем управляющий импульс
Serial.println("Poten!"); // отладка
while ( !digitalRead(PinReg)) { // если тумблер включен крутимся здесь пока тумблер не будет выключен
int potValue = analogRead (PinPoten);
regValue = map(potValue, minPoten, maxPoten, 0, regInterval);
// на всякий случай ограничиваем возможные значения regValue
if (regValue > regInterval) regValue = regInterval;
if (regValue < 0) regValue = 0;
regError = regValue/2;
Serial.print("regValue= "); Serial.println(regValue); // отладка
//Serial.println(potValue); // отладка
powerPercent = 100.* ( (float)regValue/(float)regInterval) * ( (float)regValue/(float)regInterval);
power = ((float)currentMaxVolt * (float)regValue/(float) regInterval * kfVoltage) * ((float)currentMaxVolt * (float)regValue/(float)regInterval * kfVoltage) / resistLoad;
voltage = currentMaxVolt * kfVoltage;
Serial.print("powerPercent = "); Serial.print(powerPercent); Serial.println(" %");
Serial.print("Voltage Stub = "); Serial.print(roundf (220. *(float)regValue/(float)regInterval )); Serial.println(" V");
Serial.print("Power = "); Serial.print(roundf (power)); Serial.println(" W");
delay (500);
}
}
// тумблер выключили - пишем в память новые параметры.
startRegValue = regValue;
startMaxVolt = currentMaxVolt;
writeMem();
Serial.println("WRITE !!!!!!!!!!"); // отладка
Serial.println(startRegValue); // отладка
Serial.println(startMaxVolt); // отладка
}
void writeMem(){ // пишем в память два целочисленных параметра
Serial.println("write to ROM");
byte lowByte = ((startRegValue >> 0) & 0xFF);
byte highByte = ((startRegValue >> 8) & 0xFF);
EEPROM.write(adress, lowByte);
EEPROM.write(adress + 1, highByte);
lowByte = ((startMaxVolt >> 0) & 0xFF);
highByte = ((startMaxVolt >> 8) & 0xFF);
EEPROM.write(adress + 2, lowByte);
EEPROM.write(adress + 3, highByte);
}
void readMem(){ // читаем из памяти два целочисленных параметра
byte lowByte = EEPROM.read(adress);
byte highByte = EEPROM.read(adress + 1);
startRegValue = ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);
lowByte = EEPROM.read(adress +2);
highByte = EEPROM.read(adress + 3);
startMaxVolt = ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);
}
void stub(){
// функция сравнивает текущее амплитудное напряжение currentMaxVolt с предыдущим текущим амплитудным oldMaxVolt,
//которое запомнили в момент последней стабилизации
//если разница меньше заданной ранее константы devMaxVolt, ничего не делаем
//если разница больше заданной ранее константы devMaxVolt, нужно пересчитать параметр алгоритма Брезенхема regValue
// изменение параметра приведет к пропорциональному изменению мощности, например напряжение упало в два раза,
// значит мощность упала в 4 раза - увеличиваем параметр regValue в два раза и мощность увеличивается в 4 раза.
if ( ( (currentMaxVolt > (oldMaxVolt + devMaxVolt))|(currentMaxVolt < (oldMaxVolt - devMaxVolt))) ){
regValue = roundf ( ((float) startRegValue * ( (float) startMaxVolt/ (float) currentMaxVolt)));
//если нет достаточного запаса - просто включаем на максимум
if ( regValue > regInterval) regValue = regInterval;
regError = regValue/2;
oldMaxVolt = currentMaxVolt;
}
power = ((float)currentMaxVolt * (float)regValue/(float) regInterval * kfVoltage) * ((float)currentMaxVolt * (float)regValue/(float)regInterval * kfVoltage) / resistLoad;
voltage = currentMaxVolt * kfVoltage;
//Serial.print(roundf (voltage)); Serial.print(" "); Serial.print( roundf( regValue*voltage / regInterval ));
//Serial.print(" "); Serial.println(power);
}
добавил позже по просьбе коллег
https://yadi.sk/i/_XrHemDe3TvQTb
Kusnezov Oleg, Выложи пожалуйста скетч или текст, на яндекс диск, или еще куда. При копировании все в кучу пишет, задолбаешься его править.
Эффективное напряжение пропорционально амплитудному
Как-то это утверждение меня смущает.
ТОЭ и ЭРИ я изучал, конечно, уже давно, но растет внутренний подсознательный протест цитируемому утверждению.
Выложи пожалуйста на яндекс диск
Пока не умею. разберусь чуть позже. Могу по почте переслать, если адрес скинешь в "приват". (Действительно "все в кучу" при копировании ).
Как-то это утверждение меня смущает.
Ну я университетов не кончал... Вам виднее. Может так лучше?
Эффективное напряжение, при известных допущениях, пропорционально амплитудному.
Я просто смиренно предположил, что определенный интеграл от 0 до пи от константы, умноженной на синус х, равен константе, умноженной на интеграл... (Т.е. константе, деленной на корень из двух ) .
kvic, спасибо за Ваш регулятор. Внушает!
Здравия Всем!нашел в на просторах регулятор мощности на ардуино нано пробовал и УНО со стабилизацией мощности на нагрузке.проверял на обогревателе 2 кВт.сеть скакала 8-10 вольт.выставленное напряжение стабилизировалось примерно 3 сек но скачки не более 1 вольта.можно использовать как отдельный блок,можно соединить в систему и управлять с монитора порта.к нагрузке подключен обычный понижающий трансформатор от 6 до как пишут 20 вольт.управление 2 кнопки плюс и минус.LCD1602 I2C но можно подключить напрямую силовая часть детектор ноля PC814,опто симистор без детектора ноля MOC3023,диодный мост DB157.подстроечным резистором выставляется выходное напряжение которое отображается на дисплее(контролируется настройкаTRUE RMS мультиметром).нелинейность показания дисплея и эталонного мультиметра по краям 3-5 вольт от 90 до 180 более менее точно.но это не принципиально если выход стабилен.забыл написать регулировка от 35 вольт до того что выдает сеть.
вот скеч
Греется у меня трансформатор, у тебя как с этим было.
...при известных допущениях...
Блин, меня всё на фазовом методе клинит.
Брезенхем - он другой.
Извини.
kvic, спасибо за Ваш регулятор. Внушает!
Не мой, там ссылка на изначального автора есть.
Я только "разместил объяву".
Греется у меня трансформатор, у тебя как с этим было.
градусов до 45-50 нагревался за 3 часа при маленьком напряжении на выходе,а гдето от 90 вольт и далее переставал грется.
вчера попробовал собрал стабилизатор с zmpt трансформатором и второе ардуино,которое управляет процессом ректификации.ардуинки соеденины напрямую без опто развязки.все работает нормально.соберу все в кучу выложу фотки.
Греется у меня трансформатор
градусов до 45-50 нагревался
Да, видимо так и должно быть. Трансформатор нужен специальный. Вот с сайта одного из производителей трансформаторов:
"Трансформаторы серии Т02-Т11 имеют … высокую точность, что позволяет их применять в большинстве малобюджетных приложений.
Трансформаторы серии Т02-Т11 с индексом АС … применять практически в любых приложениях для работы с симметричными сигналами, включая … прецизионное лабораторное оборудование.
Трансформаторы серии Т02-Т11 с индексом ДС … могут работать в условиях однополярного сигнала, т.е. с высоким подмагничиванием, что позволяет их применять практически в любых приложениях, включая преобразовательную технику…"
Наш случай - второй тип тр-ра.
Брезенхем - третий тип тр-ра.
А применяем первый тип тр-ра.
Вот и греется (не всегда).
Благодарствую.
регулятор мощности (целые полупериоды)
Подскажите какой трансформатор у вас применен? И если можно скетч. Копировать что то не получается.
Вот здесь текст скетча в текстовом формате https://yadi.sk/d/6FGw7VnT3Tu23q
какой трансформатор
Подойдет любой силовой трансформатор, преобразующий 220 вольт в 3...40 вольт. У меня. конкретно в тестируемой схеме, трансформатор 220 - 6. Формула расчета резистора делителя R1 - непосредственно на схеме дана. Не забудьте, что напряжение, которое показывает вольтметр на выходе трансформатора (если в сети 220), необходимо умножить на корень из двух и коэффициент запаса, минимум 1,1. Да, и R2 лучше взять менее 10 к, например 4,7 к.
А если я неправильно понял вопрос, то вот другой вариант ответа: трансформатор на входе - обычный; обсуждение выше - про трансформатор на выходе.
Kusnezov Oleg, может на вашей схеме для защиты поставить на вход A1 стабилотрон на 5 вольт.что бы случайно не убить вход.
geha69, да, согласен, 5,6.
ато мало ли что люди начнут ардуинки убивать.а мы крайние будем.
geha69, посоветуйте, какой, конкретно, стабилитрон на схеме указать.
с 1 381 по 1 400 из 1 726