Управление ТЭНами пропуском периодов ШИМ
- Войдите на сайт для отправки комментариев
Есть два ТЭНа по 370Вт, 220В, есть бак который греют эти два ТЭНа с двух сторон, есть аналоговый датчик LM35(максимум 155градусов), ТЭНы нужно разогреть в начале до 125градусов и так прогревать 1минуту, потом будет рабочий диапазон всё время 100градусов. Сейчас делаю так в рабочем режиме: если температура допустим больше 100 градусов выключаем ТЭН на 3с., если температура меньше 100градусов то включаем ТЭН на 2с, не плохо конечно но как то во-первых получается удерживать температуру в пределах 10градусов, во - вторых как то то бывает перегрев то не догрев и какой - то отклик системы не очень. Опорное напряжение 2,56В, управление: ардуино мега+МОС3061+ВТ139-800.
Думаю делать через пропуск периодов с помощью функции ШИМ на 64Гц(так как сеть 50Гц), хотелось бы что бы ШИМ зависил от напряжения с датчика LM35, то есть чем больше температура, тем соотвественно больше напряжение на выходе LM35, и следовательно меньше ШИМ, для большей точности делаю 10 измерений температурыю Набросал пока рабочий режим, вот так:
int ten=4; int term1 = A0; int t21 = 0; int t22= 0; int t23= 0; int t24= 0; int t25= 0; int t26= 0; int t27= 0; int t28= 0; int t29= 0; int t30= 0; void setup() {TCCR0B = TCCR0B & B11111000 | B00000101; //64Гц analogReference(INTERNAL2V56); pinMode(term1,INPUT); } void loop() { t21 = analogRead(term1); delay(40); t22 = analogRead(term1); delay(40); t23 = analogRead(term1); delay(40); t24 = analogRead(term1); delay(40); t25 = analogRead(term1); delay(40); t26= analogRead(term1); delay(40); t27= analogRead(term1); delay(40); t28= analogRead(term1); delay(40); t29= analogRead(term1); delay(40); t30= analogRead(term1); delay(40); t1=((t21+t22+t23+t24+t25+t26+t27+t28+t29+t30)/10); analogWrite(ten,255-t1/1.57);//t1=400-это 100градусов=1000мВ датчика LM35, соответсвенно при опорном 2,56В это равно 400 }
Кто что думает по этому поводу, лучше будет чем я сейчас делаю? Соответсвенно так же и режим разогрева буду делать только так как там будет 125градусов то:
analogWrite(ten,255-t1/1.96);//t1=500-это 125градусов=1250мВ датчика LM35, соответсвенно при опорном 2,56В это равно 500
Вот мой опыт
http://arduino.ru/forum/proekty/pi-regulyator-otopleniya - для инерционного объекта
http://arduino.ru/forum/programmirovanie/trebuetsya-perenesti-znachenie-... - ПИ регулятор с пропуском полупериодов
http://arduino.ru/forum/programmirovanie/algoritm-ravnomernogo-raspredel... - алгоритм пропуска полупериодов
Есть вопросы по вашему ПИ - регулятору, ноль мы не отслеживаем, правильно?
Далее интересует #define n_f 10.0//температура по умолчанию
Вот набросал код, только не пойму где задать нужную мне температуру
Есть вопросы по вашему ПИ - регулятору, ноль мы не отслеживаем, правильно?
Далее интересует #define n_f 10.0//температура по умолчанию
n_f 10.0 - обозвал от no frost (защита от заморозки), при включении девайса выставляется температура 10С.
t_pwm 60000 - это 1 минута в милисекундах (взята за 100% т.е. цикл длится 1 мин, если весь цикл реле замкнуто то выдали 100%, если замкнуто 30 сек. то выдали 50% и т.д.
Получаеться период PWM - 1мин, а скважность пропорциональна мощности.
t_time 1000 - период опроса датчика температуры каждую секунду.
zad - это задание мощности
Эта часть кода ограничивает управляющее воздействие и не зависит от исполнительного устройства
Эта часть кода ограничивает управляющее воздействие для реле, т.к. 60000мс / 100% = 600мс/% = 0.6сек/%.
Чтобы реле при крайних значениях расчитанной мощности не щелкало чаще чем 4*600мс = 2.4сек. (для симистора этоу часть можно выкинуть)
Спасибо, буду разбираться, а какая переменная для задания уставки температуры?
t_pwm 60000 - это 1 минута в милисекундах (взята за 100% т.е. цикл длится 1 мин, если весь цикл реле замкнуто то выдали 100%, если замкнуто 30 сек. то выдали 50% и т.д.
А не сильно много аж 1минута? Ведь для инерционной системы, если я ТЭН включу на 1минуту, то он у меня градусов на 40 вверх уползёт, а или это 1минута типа как разогрев, когда ТЭН или обогреватель холодный то 100% мощности 1минуту даётся, а потом регулируется ШИМом в зависимости от температуры меняется скважность?
p=65.0*e;//130 коэффициент пропорциональности 130.0 Откуда взялось 65, и чему равно е? И как я понял этим коэффициентом (числом 65 или другим)подбираем нужную нам пропорцию в зависимости от инерционности нашего ТЭНа?
И для чего это:
t_pwm 60000 - это 1 минута в милисекундах (взята за 100% т.е. цикл длится 1 мин, если весь цикл реле замкнуто то выдали 100%, если замкнуто 30 сек. то выдали 50% и т.д.
А не сильно много аж 1минута? Ведь для инерционной системы, если я ТЭН включу на 1минуту, то он у меня градусов на 60 вверх уползёт, а или это 1минута типа как разогрев, когда ТЭН или обогреватель холодный то 100% мощности 1минуту даётся, а потом регулируется ШИМом в зависимости от температуры меняется скважность?
p=65.0*e;//130 коэффициент пропорциональности 130.0 Откуда взялось 65, и чему равно е? И как я понял этим коэффициентом (числом 65 или другим)подбираем нужную нам пропорцию в зависимости от инерционности нашего ТЭНа?
И для чего это:
В моём случае нет, т.к. у меня этот девайс управляет 1.5кВт нагревателем на 30м2 помещения, и управление теном по средствам реле. С симистором можно гораздо меньше (например 1 сек).
В коде есть корректировка быстрого выхода на уставку. Если разница между текущей температурой и заданой большая то управление в зависимости от знака или 100% или 0%.
В процесе работы регулятор в интегральной составляющей накапливает такую мощность которой хватает на поддержание тепловых потерь, а пропорциональная составляющая добавляет тем больше мощности чем болше отклонение от задания.
р-коэффициент пропорциональности (влияет на скорость реакции), на 130 необращайте внимания, это пока подбирал как памятку написал.
е-это ошибка регулирования (разница между заданием и уставкой)
Почитайте тут
Спасибо, буду разбираться, а какая переменная для задания уставки температуры?
ust - уставка
В моём случае нет, т.к. у меня этот девайс управляет 1.5кВт нагревателем на 30м2 помещения, и управление теном по средствам реле. С симистором можно гораздо меньше (например 1 сек).
Я же и смотрю то у вас время это 60с., то на другом сайте 6с.
В коде есть корректировка быстрого выхода на уставку. Если разница между текущей температурой и заданой большая то управление в зависимости от знака или 100% или 0%.
То есть t_pwm если и будет 1минуту, то даже если время 1минута не прошла но как только превысит уставку температуры то мощность на 0 упадёт? р-коэффициент пропорциональности (влияет на скорость реакции), на 130 необращайте внимания, это пока подбирал как памятку написал. Ну он же подбирается под каждую систему, или он приблизительно для всех одинаковый будет?
ust - уставка
А почему она у вас в градусах задаётся, а не числом, ну допустим у меня 100градусов = 400, так как опорное напряжение меги 2,56В, АЦП 10битный(1023) 1023/2,56=0,4, а с датчика 1градус=10мВ, получается 100градусов =1000мВ=400, просто вопрос такой мне задавать эту уставку моим числом, или 100градусов писать?
Я в посте #4 картинку вставил. Так вот растояние между импульсами это период = 100%, а продолжительность импульса это часть выдаваемой мощности от 100% соответственно.
Коэффициенты подбираються индивидуально.
Почитайте всётаки о законах регулирования.
В чем получаете температуру (ваша цель - ust) в том и задавайте.
У Вас какой датчик температуры? Вы показания в каких еденицах получаете?
Необходимо для начала с датчика получить температуру в понятном виде (С)
затем сравнивать получиную температуру с уставкой.
Спасибо огромное
Последний пока вопрос насчёт того к чему это
У Вас какой датчик температуры? Вы показания в каких еденицах получаете?
Необходимо для начала с датчика получить температуру в понятном виде (С)
затем сравнивать получиную температуру с уставкой.
Датчик аналоговый, естественно для СИ я задаю с учётоми опорного напржения и разрядности АЦП
Спасибо огромное
Последний пока вопрос насчёт того к чему это
У Вас какой датчик температуры? Вы показания в каких еденицах получаете?
Необходимо для начала с датчика получить температуру в понятном виде (С)
затем сравнивать получиную температуру с уставкой.
Датчик аналоговый, естественно для СИ я задаю с учётоми опорного напржения и разрядности АЦП
Это таблица соответствия темпратура С / сопротивление кОм
Ясно, спасибо, значить удалю так как мне она не нужна.
Ясно, спасибо, значить удалю так как мне она не нужна.
Удачи.
Код расчета мощности
Если интересно последняя версия
И на последок ШИМ`ом можно регулировать постоянный ток, а печременный или пропуском полупериодов (т.к. в 1сек. проходит 100 полупериодов, то точность 1% или 10сек. точность 0.1%) или продолжительностью полупериода (отсчетом времени от начала прохождения переменного напряжения через 0 в течении одного полупериода)
Это вроде как понятно, я не пойму почему тогда у вас 60с., это вроде как обычно же ШИМ берётся за секунду мощность от того открыт или закрыт ключ в этой 1с., а вы берёте это время не 1с., а аж 60с.? Через ноль не вариант так как не хочу детектор нуля лепить. И пин для управления ТЭНом, нужно брать те которые поддерживают ШИМ, или любой, всё таки здесь же не применяется функция ШИМ, а она сделана по функциям времени?
Я выбрал большой интервал потому что я использую реле. Если интервал выбрать 1с то реле будет безполезно т.к. очень скоро выйдет из строя, если вообще будет успевать работать с такой частотой.
Если вы используете симистр, то если его открыть во время полупериода, то он закроется только когда напряжение питающее нагрузку упадет до 0.
ШИМ на пине ардуино не получится применить для управления симистором, т.к. его частота выше в разы частоты питающей сети.
Надо делать следующее. Без детектора 0, взять период 1с-100полупериодов=100%. Если каждую секунду подавать управление на симитр в течении аремени пропорциональном необходимой мощности 1%-100мс.
Вобщем как у меня только масштаб времени меньше.
Ознакомтесь с https://geektimes.ru/company/unwds/blog/271090/
Ознакомтесь с https://geektimes.ru/company/unwds/blog/271090/
Традиционная дилемма здесь — чем, собственно, коммутировать. Как убедились многие на своём печальном опыте, китайские реле не обладают должной надёжностью — при коммутации мощной индуктивной нагрузки контакты сильно искрят, и в один прекрасный момент могут попросту залипнуть. Приходится ставить два реле — второе для подстраховки на размыкание.
У человека ТЭН, а это не индуктивная нагрузка. И залипание контактов это проблемма не только китайских реле.
Вот этой простой схемы для управления ТЭНом достаточно и она контролирует включение нагрузки в момент прохождения нуля. Я её использовал, работает отлично.
Всё работает спасибо огромное yul-i-an стабильность порядка +-3градуса.
1
Всё работает спасибо огромное yul-i-an стабильность порядка +-3градуса.
Ну и хорошо. Помница Вы про выполнение части кода в течении промежутка времени хотели спросить, или сами разобрались.
Ну и конечно хочется фото или видео девайса посмотреть если есть.
Разброс температуры можно уменьшить подбором коэффициентов.
Да в течении промежутка времени, то как всегда скобку не там поставил, вот и работало не так). ну а разброс в +-3градуса, как по мне лучше не придумаешь. Фото или видео, подумаю, как в корпус оформлю.
Может кто подскажет есть два бака и 4 ТЭНа каждый по 370Вт, 220В, два ТЭНа греют один бак, соответственно 2 другие ТЭНа второй бак, температура ТЭНов в режиме разогрева одинакова(ТЭНЫ подключены были по два на симистор, сейчас даже 4 повесил на один симистор, а разница в температуре ТЭНов первого бака и второго бака составляет 8градусов, соответственно и баки имеют разницу около 8 градусов, зато разница в сопротивлении ТЭНов всего лишь 2Ома, а это около 6Вт ) датчик температуры один стоит на ТЭНе который больше греется, как уровнять разницу, но что бы один датчик температурный был, можно как - то на вторые ТЭНы больше мощности выдавать?
Сейчас приблизительно такое:
Я тут класс писал для управления цифровым выходом, так вот в нем есть функция MyOut.blink(interval, long).
Спасибо, подумаю как это всё связать, ведь я использую то что мы здесь обсуждали, теперь прийдётся корректировки вносить в код причём я смотрю не малые).
Выложте весь код посмотрим.
Сейчас вот играю с этим куском, так как код большой
Может кто подскажет есть два бака и 4 ТЭНа каждый по 370Вт, 220В, два ТЭНа греют один бак, соответственно 2 другие ТЭНа второй бак, температура ТЭНов в режиме разогрева одинакова(ТЭНЫ подключены были по два на симистор, сейчас даже 4 повесил на один симистор, а разница в температуре ТЭНов первого бака и второго бака составляет 8градусов, соответственно и баки имеют разницу около 8 градусов, зато разница в сопротивлении ТЭНов всего лишь 2Ома, а это около 6Вт ) датчик температуры один стоит на ТЭНе который больше греется, как уровнять разницу, но что бы один датчик температурный был, можно как - то на вторые ТЭНы больше мощности выдавать?
Читал, читал, читал, ПОСТ "0" и этот пост и так ничего и немогу понять, что Вы греете воду (125 Гр. ?????) или нефть ( нужно ~ 250 Гр.) или воздух ? . А что Вам мешает поставить второй датчик температуры на второй бак, и соответственно контролировать и регулировать температуру в баках. Какой об"ём бака, при мощьности тенов 370Вт. я, думаю литров 20. По моему опыту могу сказать бак 40л. термоизолирован 2 Тена по 1.5 Квт. подерживают температуру впределах +-0.5Гр. от заданной (жидкость), (ордуино(кристал ATMEL mega328p) + LM 335 + программа управления).
Грею спиртосодержащую смесь, обьём каждого бака литра 2, использую ардуино мега + ТФТ дисплей 4дюйма, датчиков не хочу ставить несколько, так как возможно в дальнейшем будет 3, а может и 4 бака, что ж на каждый датчик ставить, у меня в коде ещё защита если с датчиком что не так, а это на каждый датчик такое делать, долго, это всё, в дальнейшем буду общий бак делать, и два ТЭНа на этот бак
Вот набросал так, как думаете нормально будет?
Вот эта часть кода повторяеться. Её нужно преобразовать в функцию которая будет возвращать мощность
Вынести за loop
Грею спиртосодержащую смесь, обьём каждого бака литра 2, использую ардуино мега + ТФТ дисплей 4дюйма, датчиков не хочу ставить несколько, так как возможно в дальнейшем будет 3, а может и 4 бака, что ж на каждый датчик ставить, у меня в коде ещё защита если с датчиком что не так, а это на каждый датчик такое делать, долго, это всё, в дальнейшем буду общий бак делать, и два ТЭНа на этот бак
А как Вы нагревали спитросодержащую смесь больще 100Гр. ( это возможно только под давлением),( Вы пишете----- у меня в коде защита если с датчиком что не так, а это на каждый датчик такое делать, долго, ----------- )это пара строк кода - функция и её вызов. А как происходит проверка если с датчиком что не так ???. Если это самагоноварение то могу сказать что у меня в системе для получения качественного продукта (бак 40л.) установленно 3 датчика тепрературы и 2 датчика давления. На этом форуме есть тема - ГОНЬЩИК САМОГОНЬЩИК- правда сейчас там много флуда.
Предлогаю Вам с 0 написать код коректней, но для этого изложите тз.
Допустим, греем бак двумя тенами на выходах №№
при нажатии кнопки на входе №, изменяеться уставка (100, 125, 80, 150) примерно
...
Ну и в таком духе.
Вот, по крайней мере скомпилировалось, нужно конечно осцил прилепить или светодиоды посмотреть по разным выводам по разному или нет
И вопрос такой работая с библиотекой DigOut.h, нужно в сетапе
pinMode(outten, OUTPUT);
Сейчас подправлю
Поработал над кодом, только не вижу часть которая за получение температуры отвечает.
И вопрос такой работая с библиотекой DigOut.h, нужно в сетапе
pinMode(outten, OUTPUT);
НЕТ
Спасибо огромное, с меня причитается, если вы с Украины, давайте хотя бы сотку на тел. скину, или переведу на карту.
Вот, добавил функцию измерения, думаю поставил в нужное место
Нашел некоторые ошибки подправил
Тестируйте.
Спасибо, проверю всё и отпишусь.
Прикрутил еще класс DigIn для "защиты" цифровых входов от дребезга, но кнопки придется подключать по схеме ниже
И убрал лишние переменные оставшиеся от начального кода.
Спасибо, я уже в свой скетч всё подобавлял, всё скомпилировалось, завтра проверю, а я от дребезга пользую в обработчике прерываний
static unsigned long millis_prev1;
if(millis()-100 > millis_prev1)
millis_prev1 = millis();
+ кондёры 0,1мкФ, хоть и функция милис говорят и не работает в обработчике прерываний, но все почему - то её там используют.
Вгрузил ничего не работает, сейчас даже такой кусок пробую ничего вообще, буду наверно осцилом глядеть
И вроде в коде всё правильно, или что - то я не вижу.
Попробуйте в строках 36-39 жостко задать zad1, zad2 и t_pwm задать побольше - 10000 например. Доберусь до компьютера в симуляторе попробую.
Вот проверочный код для проверки части отвечающей за выдоваемую мощность
В симуляторе работает. Попробуйте на железе.
Вот немного подшаманил, в симуляторе заработал (это код из поста #46)
Пробуйте. Добавил вывод в монитор порта текущюю температуру и мощность чтобы отлаживать не в слепую.
Как испытаете отпишитесь. Напомню что в этом коде кнопки не задействованы.