ПИ регулятор отопления
- Войдите на сайт для отправки комментариев
Регулятор был задуман как замена штатного в электроконвектор на дачу, потому что встроенный не обеспечивал необходимой точности поддержания температуры и при перебоях в питании самостоятельно не включался в работу, что могло нехорошо отразится на заполненом водопроводе.
Данный регулятор обеспечивает поддержание заданной температуры. Проект начинался тут.
Проработал зиму на даче, никаких замечаний к работе регулятора нет, температуру держет точно.
В качестве датчика температуры используется терморезистор NTC 10кОм при 20С, выходным устройством являеться реле (в дальнейшем планирую поставить симистор) (организован медленный ШИМ частотой 2Гц).
001 | //кнопки А0, реле 13,12 подсветка 10 |
002 | #include <LiquidCrystal.h> |
003 | #define key_in analogRead(0)//вход аналоговых кнопок |
004 | #define T_Sensor_OFF digitalWrite(16,LOW)//отключить термистор |
005 | #define T_Sensor_ON digitalWrite(16,HIGH)//включить термистор |
006 | #define HI_OFF digitalWrite(13,LOW)//отключить реле HI |
007 | #define HI_ON digitalWrite(13,HIGH)//включить реле HI |
008 | //#define LO_OFF digitalWrite(12,LOW)//отключить реле LO |
009 | //#define LO_ON digitalWrite(12,HIGH)//включить реле LO |
010 | #define n_f 10.0//температура по умолчанию |
011 | #define p_s 50//частота обновления экрана |
012 | #define t_pwm 600//период ШИМ |
013 | #define t_time 1000//период опроса температуры |
014 | //для ПИ регулятора |
015 | float p,i; |
016 | LiquidCrystal lcd(7,6,5,4,3,2); |
017 | long time; //интервал замера температуры |
018 | long lcd_time; //интервал отрисовки экрана |
019 | long on_time; //для периода ШИМ |
020 | int zad=0; |
021 | int k_b[]={ |
022 | 512,683,768}; //аналоговые кнопки SET + - |
023 | float temp=0.0; //текущее значение температуры |
024 | float pre_temp=0.0; //предыдущее значение температуры |
025 | int w=0; |
026 | float ust=n_f; //termostate |
027 | int c=0; //пройденые циклы мощности |
028 | float addr[25][2] = { |
029 | { |
030 | 0,32.0 |
031 | } |
032 | , |
033 | { |
034 | 5,25.5 |
035 | } |
036 | , |
037 | { |
038 | 10,20.0 |
039 | } |
040 | , |
041 | { |
042 | 15,15.7 |
043 | } |
044 | , |
045 | { |
046 | 20,12.62 |
047 | } |
048 | , |
049 | { |
050 | 25,10.0 |
051 | } |
052 | , |
053 | { |
054 | 30,8.24 |
055 | } |
056 | , |
057 | { |
058 | 35,6.63 |
059 | } |
060 | , |
061 | { |
062 | 40,5.41 |
063 | } |
064 | , |
065 | { |
066 | 45,4.41 |
067 | } |
068 | , |
069 | { |
070 | 50,3.62 |
071 | } |
072 | , |
073 | { |
074 | 55,2.99 |
075 | } |
076 | , |
077 | { |
078 | 60,2.48 |
079 | } |
080 | , |
081 | { |
082 | 65,2.08 |
083 | } |
084 | , |
085 | { |
086 | 70,1.75 |
087 | } |
088 | , |
089 | { |
090 | 75,1.47 |
091 | } |
092 | , |
093 | { |
094 | 80,1.258 |
095 | } |
096 | , |
097 | { |
098 | 85,1.063 |
099 | } |
100 | , |
101 | { |
102 | 90,0.905 |
103 | } |
104 | , |
105 | { |
106 | 95,0.776 |
107 | } |
108 | , |
109 | { |
110 | 100,0.669 |
111 | } |
112 | , |
113 | { |
114 | 105,0.581 |
115 | } |
116 | , |
117 | { |
118 | 110,0.505 |
119 | } |
120 | , |
121 | { |
122 | 115,0.442 |
123 | } |
124 | , |
125 | { |
126 | 120,0.387 |
127 | } |
128 | , |
129 | }; |
130 |
131 | byte cel[] = |
132 | { |
133 | 0b01000, |
134 | 0b10100, |
135 | 0b01000, |
136 | 0b00111, |
137 | 0b01000, |
138 | 0b01000, |
139 | 0b00111 |
140 | }; |
141 | void setup (){ |
142 | // Serial.begin(9600); |
143 | pinMode(13,OUTPUT); //реле HI |
144 | // pinMode(12,OUTPUT);//реле LO |
145 | pinMode(16,OUTPUT); //питание термистора |
146 | T_Sensor_OFF; |
147 | HI_OFF; //отключить реле HI |
148 | // LO_OFF;//отключить реле LO |
149 | lcd.begin(16, 2); |
150 | analogWrite(10,250); //подсветка |
151 | time = millis(); |
152 | lcd_time = time; |
153 | on_time = time; |
154 | lcd.createChar(1, cel); |
155 | } |
156 | void loop (){ |
157 |
158 | key(); //опрос кнопок |
159 | if (time>millis()){ //защита от переполнения |
160 | time=millis(); |
161 | lcd_time=time; |
162 | on_time=time; |
163 | } |
164 | //---------------чтение температуры--------------- |
165 | if ((millis()-time)>=t_time){ |
166 | time=millis(); |
167 | temp=getTemp(); |
168 | temp=(pre_temp*0.2)+(temp*0.8); //фильтр |
169 | // w=abs((ust-temp)*(pre_temp-temp));//время выхода на уставку |
170 | pre_temp=temp; |
171 | PIctl(); //расчет мощности |
172 | } |
173 | //-------------------вывод на экран---------------- |
174 | if ((millis()-lcd_time)>=p_s){ //вывод на экран |
175 | lcd_time=millis(); |
176 | Screen_print(); |
177 | } |
178 |
179 | //---------------------управление мощностью-------------------------- |
180 | //выдаем мощность |
181 | if (millis()>3000){ |
182 | if ((millis()-on_time)>=t_pwm){ //период ШИМ |
183 | on_time=millis(); |
184 |
185 | if (c<zad){ |
186 | HI_ON; |
187 | } |
188 | else { |
189 | if (zad != 100){ |
190 | HI_OFF; |
191 | } |
192 | } |
193 | c=c+1; |
194 | if (c==100){ |
195 | c=0; |
196 | //PIctl(); |
197 | } |
198 | } |
199 | } |
200 | } |
201 | void PIctl() |
202 | { |
203 | if (temp>(ust-0.5)&&temp<(ust+0.5)) //зона нечувствительности +-0,5C |
204 | { |
205 | zad=i; |
206 | } |
207 | else |
208 | { |
209 | float e; |
210 | e=(ust-temp); |
211 | // расчет выходной мощности: |
212 | p=130.0*e; //130 коффициент пропорциональности |
213 | if (p<0.0) |
214 | { |
215 | p=0.0; //ограничение P |
216 | } |
217 | i=(i+(e*0.014)); //0.7 |
218 | if (i>100.0) |
219 | { |
220 | i=100.0; //ограничение I |
221 | } |
222 | if (i<-100.0) |
223 | { |
224 | i=-100.0; //ограничение I |
225 | } |
226 | //расчет выходной мощности |
227 | zad=p+i; |
228 | } |
229 | //ограничение управляющего сигнала |
230 | //для исключения частого переключения реле |
231 | //если твердотельное реле, можно не ограничивать |
232 | if (zad<4){ |
233 | zad=0; |
234 | } |
235 | if (zad>96){ |
236 | zad=100; |
237 | } |
238 | //корректировка при отклонении температуры более чем на +-2С |
239 | //для быстрого выхода на уставку |
240 | if (temp<(ust-2.0)) //если темп < уст на 2С |
241 | { |
242 | zad=100; //то мощность 100% |
243 | i=0; |
244 | } |
245 | if (temp>(ust+2.0)) //если темп > уст на 2С |
246 | { |
247 | zad=0; //то мощность 0% |
248 | i=0; |
249 | } |
250 | } |
251 | //----------------опрос клавиш------------------------------- |
252 | void key(){ |
253 | int x; |
254 | x = key_in; |
255 | if (x>k_b[0]-5 && x<k_b[0]+5){ //МЕНЮ |
256 | UP_butt(); |
257 | key_m(0); |
258 | } |
259 | if (x>k_b[1]-5 && x<k_b[1]+5){ // + |
260 | UP_butt(); |
261 | key_m(1); |
262 | } |
263 | if (x>k_b[2]-5 && x<k_b[2]+5){ // - |
264 | UP_butt(); |
265 | key_m(2); |
266 | } |
267 | } |
268 | //---------------проверка отпускания кнопки----------------- |
269 | void UP_butt(){ |
270 | while (key_in<1010){ //ждем отпускания кнопки |
271 | } |
272 | } |
273 | //------------------замер температуры---------------------- |
274 | double getTemp() |
275 | { |
276 | T_Sensor_ON; |
277 | delay(10); //задержка при подаче питания терморезистора |
278 | int t; |
279 | t=0; |
280 | for ( int i=0; i <= 15; i++){ |
281 | //for (int i=0; i <= 4; i++){ |
282 | t = t + analogRead(1); |
283 | } |
284 | // T_Sensor_OFF; |
285 | t=t/4; |
286 | //t=t/5; |
287 | |
288 | |
289 | float R; |
290 | R=getR(t); |
291 | int i=0; |
292 | while (addr[i][1] >R) |
293 | { |
294 | i++; |
295 | } |
296 | double result; |
297 | result=(R-addr[i][1])*(addr[i-1][0]-addr[i][0])/(addr[i-1][1]-addr[i][1])+addr[i][0]; |
298 | return result; |
299 | } |
300 | float getR( float V) |
301 | { |
302 | float result; |
303 | result=-10*V/(V-4096); |
304 | //result=-10*V/(V-1024); |
305 | T_Sensor_OFF; |
306 | return result; |
307 | } |
308 | //-----------------обработка кнопок------------------------- |
309 | void key_m( int x){ |
310 | // lcd.clear(); |
311 | switch (x){ |
312 | case 0: //menu |
313 | ust=10; |
314 | break ; |
315 | case 1: //кнопка + |
316 | ust++; |
317 | if (ust>35){ |
318 | ust=35; |
319 | } |
320 | break ; |
321 | case 2: //кнопка - |
322 | ust--; |
323 | if (ust<5){ |
324 | ust=5; |
325 | } |
326 | break ; |
327 | } |
328 | } |
329 | int oversempling(){ |
330 | T_Sensor_ON; |
331 | delay(10); //задержка при подаче питания терморезистора |
332 | int o; |
333 | o=0; |
334 | for ( int i=0; i <= 15; i++){ //оверсемплинг до 4096 |
335 | //for (int i=0; i <= 4; i++){ |
336 | o = o + analogRead(1); |
337 | } |
338 | T_Sensor_OFF; |
339 | o=o/4; |
340 | //t=t/5; |
341 | return o; |
342 | } |
343 | void Screen_print() |
344 | { |
345 | byte a=0; |
346 | byte b=0; |
347 |
348 | tempPrint(temp,0,0); |
349 | tempPrint(ust,0,1); |
350 |
351 | lcd.setCursor(6, 0); |
352 | lcd.print(zad); |
353 | lcd.print( "% " ); |
354 |
355 | varPrint(i, "I " ,6,1); |
356 | // lcd.print("I "); |
357 |
358 | lcd.setCursor(12, 0); |
359 | lcd.print(c); |
360 | lcd.print( "m " ); |
361 |
362 | a=digitalRead(13); |
363 | b=digitalRead(12); |
364 | if (a==1 && b==0){ |
365 | lcd.setCursor(12, 1); |
366 | lcd.print( "HI " ); |
367 | } |
368 | if (a==0 && b==1){ |
369 | lcd.setCursor(12, 1); |
370 | lcd.print( "LO " ); |
371 | } |
372 | if (a==0 && b==0){ |
373 | lcd.setCursor(12, 1); |
374 | lcd.print( "OFF" ); |
375 | } |
376 | } |
377 | //-------------вывод температуры---------------------------- |
378 | void tempPrint( double t, int x, int y){ |
379 | lcd.setCursor(x, y); |
380 | lcd.print(t); |
381 | lcd.setCursor(x+4, y); |
382 | lcd.print( char (1)); //вывод градусов |
383 | } |
384 | //---------------вывод переменной------------------------- |
385 | void varPrint ( double v, char * t, int x, int y){ |
386 | lcd.setCursor(x, y); |
387 | lcd.print(v); |
388 | lcd.print(t); |
389 | } |
Схема включения терморезистора стандартная, кнопки (аналоговые). Изскетча должно быть понятно что куда цеплять. У меня девайс выполнен на своей плате, использован микроконтроллер ATMega8, тактирование от встроенного генератора 8МГц. Собрано всё в монтажной коробке 100х100х40.
Схема устройства, LCD экран не показан.
2 герца на реле...
2*60*60*24*365 = 63 ляма в год... реле столько не ходят, обычно от 200 до 500 тыс, я когда печку делал себе посчитал 1 переклюяение в 20 секунд и то вышло всего на 5 лет 8 часовой работы...
2 герца на реле...
Вместо реле ставим SSR на нужную мощность и все.
2 герца на реле...
Вместо реле ставим SSR на нужную мощность и все.
Согласен, я выше написал что планируется замена на симистор и подача напряжения по алгоритму Брезенхема. Опыт уже есть - видео.
Такую же задачу решал недавно. Реализовал алгоритм "мячик на двух резинках" с поиском равновесной мощности под заданную температуру итеративным перебором. Регулирование мощности на моем преобразователе ШИМ в ФИМ
зима показала очень высокую точность поддержания температуры. Разве что помех много от симистора но у меня это никак не проявляется, знаю, что должны быть)
Такую же задачу решал недавно. Реализовал алгоритм "мячик на двух резинках" с поиском равновесной мощности под заданную температуру итеративным перебором.
Ссылочку не дадите для ознакомления
Не публиковал, но если что конкретно интересует поделюсь
Интересуемся.
Согласен, я выше написал что планируется замена на симистор и подача напряжения по алгоритму Брезенхема. Опыт уже есть - видео.
спасибо за информацию, не знал, что такая простая вещь как пропуски полупериодов так круто называются)
логика програмная пропусков почти ничем не отличается от ФИМ.
По мне управление мощностью дело совсем не сложное. Алгорит расчета %необходимой мощности вот это куда более сложная и интересная задача. ПИД ориентирован на релейное управление. А здесь как? Я использовал алгоритм резинки. В стабильных условиях это отлично работает, а вот при резко меняющихся условий резинка входит в колебательный процесс
Интересуемся.
что именно? Схема, алгоритм?
2 герца на реле...
2*60*60*24*365 = 63 ляма в год... реле столько не ходят, обычно от 200 до 500 тыс, я когда печку делал себе посчитал 1 переклюяение в 20 секунд и то вышло всего на 5 лет 8 часовой работы...
Я прикидывал 600000-800000 переключений за отопительный сезон 210 дней.
Интересуемся.
что именно? Схема, алгоритм?
Алгоритм.
2 герца на реле...
Вместо реле ставим SSR на нужную мощность и все.
Если точно то 1% - 0,6с. (100% за 60с.). Если нужна мощность 15% то реле включаеться на 9с. а остальные 51с. отключено. И так каждые 60с.
Алгоритм.
хорошо. С компа пришлю примеры кода, а на словах примерно так:
- по таймеру беру равные интервалы времени, это шаг итерации
- на каждой итерации считаю три дельты - 1. Дельта между текущей и целевой температурой 2. Дельта между целевой температурой как прогноз на следующий период 3. Дельта как ошибка прогноза на текущий период на предыдущем цикле
- все три цифры суммирую с коэффициентами и получаю корректировку на этой итеррации для мощности в плюс или минус. Коэффициенты подбираются при отладке
- кроме того есть крайние условия 1. Если разница между текущей тем и целевой больше заданной константы (кажется у меня там 10 градусов) включаю полную мощность 2. Если разница меньше (у меня 0.5 градуса) то в эту итерацию мощность не меняется
- кроме того задается жесткость резинки. Запрещается слишком большое изменение мощности за несколько итерраций, это исключает автоколебания с большой амплитудой
а целом алгоритм показал очень хороший результат для меня. Его минус в необходимости подбора параметров под конкретную задачу
может кому интересено управление мощностью, оставлю тут http://arduino.ru/forum/proekty/kontroller-mufelnoi-pechi для меня нормальным было попадание в плюс минус 5 градусов на высоких температурах, алгоритм вполне рабочий... по ссылке реальный график работы, виден колебательный процесс, обусловлен он изменением температуры теплоизоляции (и следовательно изменением характеристик теплообмена), на испытаниях характеристики требуемой мощности менялись примерно на 30% за 1 час, что равнозначно резким калебаниям температуры на улице для плохоутепленого домика, тем не менее алгоритм оказался вполне рабочим.
По моим прикидкам имея датчик с точностью 0.25с (тот-же даллас) вполне можно попадать в диапазон воздуха плюс минус 1.5...2 градуса...
может кому интересено управление мощностью, оставлю тут http://arduino.ru/forum/proekty/kontroller-mufelnoi-pechi для меня нормальным было попадание в плюс минус 5 градусов на высоких температурах, алгоритм вполне рабочий... по ссылке реальный график работы, виден колебательный процесс, обусловлен он изменением температуры теплоизоляции (и следовательно изменением характеристик теплообмена), на испытаниях характеристики требуемой мощности менялись примерно на 30% за 1 час, что равнозначно резким калебаниям температуры на улице для плохоутепленого домика, тем не менее алгоритм оказался вполне рабочим.
По моим прикидкам имея датчик с точностью 0.25с (тот-же даллас) вполне можно попадать в диапазон воздуха плюс минус 1.5...2 градуса...
Читал вашу тему, даже комент оставил.
Переписал функцию управления реле. Написал библиотеку для терморезистора и преминил её в этом проекте.
Теперь код выглядит так.
001
#include <TermoRes3950.h>//библиотека терморезистора
002
//кнопки А0, реле 13,12 подсветка 10
003
#include <LiquidCrystal.h>
004
#define key_in analogRead(0)//вход аналоговых кнопок
005
#define HI_OFF digitalWrite(13,LOW)//отключить реле HI
006
#define HI_ON digitalWrite(13,HIGH)//включить реле HI
007
#define n_f 10.0//температура по умолчанию
008
#define p_s 50//частота обновления экрана
009
#define t_pwm 60000//период 100% мощности
010
#define t_time 1000//период опроса температуры
011
TermoRes3950 termo(1);
//терморезистор на АЦП 1
012
//для ПИ регулятора
013
float
p,i;
014
LiquidCrystal lcd(7,6,5,4,3,2);
015
long
time;
//интервал замера температуры
016
long
lcd_time;
//интервал отрисовки экрана
017
long
on_time=0;
//для периода ШИМ
018
int
zad=0;
019
int
k_b[]={
020
512,683,768};
//аналоговые кнопки SET + -
021
float
temp=0.0;
//текущее значение температуры
022
float
pre_temp=0.0;
//предыдущее значение температуры
023
int
w=0;
024
float
ust=n_f;
//termostate
025
026
byte
cel[] =
027
{
028
0b01000,
029
0b10100,
030
0b01000,
031
0b00111,
032
0b01000,
033
0b01000,
034
0b00111
035
};
036
void
setup
(){
037
// Serial.begin(9600);
038
pinMode(13,OUTPUT);
//реле HI
039
HI_OFF;
//отключить реле HI
040
lcd.begin(16, 2);
041
analogWrite(10,250);
//подсветка
042
time = millis();
043
lcd_time = time;
044
on_time = time;
045
lcd.createChar(1, cel);
046
}
047
void
loop
(){
048
byte
k;
049
k=key();
//получить код нажатой кнопки
050
key_m(k);
//выполнить действие согласно нажатой кнопке
051
if
(time>millis()){
//защита от переполнения
052
time=millis();
053
lcd_time=time;
054
on_time=time;
055
}
056
//---------------чтение температуры---------------
057
if
((millis()-time)>=t_time){
058
time=millis();
059
temp=termo.getTemp();
//получаем температуру
060
temp=(pre_temp*0.2)+(temp*0.8);
//фильтр
061
// w=abs((ust-temp)*(pre_temp-temp));//время выхода на уставку
062
pre_temp=temp;
063
PIctl();
//расчет мощности
064
}
065
//-------------------вывод на экран----------------
066
if
((millis()-lcd_time)>=p_s){
//вывод на экран
067
lcd_time=millis();
068
Screen_print();
069
}
070
071
//---------------------управление мощностью--------------------------
072
//выдаем мощность
073
if
(millis()>3000){
074
if
(millis()-on_time >= t_pwm){
//период ШИМ
075
on_time=millis();
076
}
077
if
(millis()<((zad*(t_pwm/100))+on_time)){
078
HI_ON;
079
}
080
else
081
{
082
HI_OFF;
083
}
084
}
085
}
086
087
void
PIctl()
088
{
089
if
(temp>(ust-0.5)&&temp<(ust+0.5))
//зона нечувствительности +-0,5C
090
{
091
zad=i;
092
}
093
else
094
{
095
float
e;
096
e=(ust-temp);
097
// расчет выходной мощности:
098
p=65.0*e;
//130 коффициент пропорциональности 130.0
099
if
(p<0.0)
100
{
101
p=0.0;
//ограничение P
102
}
103
i=(i+(e*0.014));
//0.7
104
if
(i>100.0)
105
{
106
i=100.0;
//ограничение I
107
}
108
if
(i<-100.0)
109
{
110
i=-50.0;
//ограничение I
111
}
112
//расчет выходной мощности
113
zad=p+i;
114
}
115
//ограничение управляющего сигнала
116
//для исключения частого переключения реле
117
//если твердотельное реле, можно не ограничивать
118
if
(zad<4){
119
zad=0;
120
}
121
if
(zad>96){
122
zad=100;
123
}
124
//корректировка при отклонении температуры более чем на +-2С
125
//для быстрого выхода на уставку
126
if
(temp<(ust-2.0))
//если темп < уст на 2С
127
{
128
zad=100;
//то мощность 100%
129
i=0;
130
}
131
if
(temp>(ust+2.0))
//если темп > уст на 2С
132
{
133
zad=0;
//то мощность 0%
134
i=0;
135
}
136
}
137
138
//----------------опрос клавиш-------------------------------
139
byte
key(){
140
int
x;
141
x = key_in;
142
if
(x>k_b[0]-5 && x<k_b[0]+5){
//МЕНЮ
143
UP_butt();
144
return
0;
145
// key_m(0);
146
}
147
if
(x>k_b[1]-5 && x<k_b[1]+5){
// +
148
UP_butt();
149
return
1;
150
// key_m(1);
151
}
152
if
(x>k_b[2]-5 && x<k_b[2]+5){
// -
153
UP_butt();
154
return
2;
155
// key_m(2);
156
}
157
}
158
//---------------проверка отпускания кнопки-----------------
159
void
UP_butt(){
160
while
(key_in<1010){
//ждем отпускания кнопки
161
}
162
}
163
164
//-----------------обработка кнопок-------------------------
165
void
key_m(
int
x){
166
switch
(x){
167
case
0:
//menu
168
ust=10;
169
break
;
170
case
1:
//кнопка +
171
ust++;
172
if
(ust>35){
173
ust=35;
174
}
175
break
;
176
case
2:
//кнопка -
177
ust--;
178
if
(ust<5){
179
ust=5;
180
}
181
break
;
182
}
183
}
184
185
void
Screen_print()
186
{
187
byte
a=0;
188
189
tempPrint(temp,0,0);
190
tempPrint(ust,0,1);
191
192
lcd.setCursor(6, 0);
193
lcd.print(zad);
194
lcd.print(
"% "
);
195
196
varPrint(i,
"I "
,6,1);
197
198
lcd.setCursor(10, 0);
199
lcd.print(on_time);
200
201
a=digitalRead(13);
202
if
(a==1){
203
lcd.setCursor(12, 1);
204
lcd.print(
"HI "
);
205
}
206
if
(a==0){
207
lcd.setCursor(12, 1);
208
lcd.print(
"OFF"
);
209
}
210
}
211
//-------------вывод температуры----------------------------
212
void
tempPrint(
double
t,
int
x,
int
y){
213
lcd.setCursor(x, y);
214
lcd.print(t);
215
lcd.setCursor(x+4, y);
216
lcd.print(
char
(1));
//вывод градусов
217
}
218
//---------------вывод переменной-------------------------
219
void
varPrint (
double
v,
char
* t,
int
x,
int
y){
220
lcd.setCursor(x, y);
221
lcd.print(v);
222
lcd.print(t);
223
}
Приветствую можешь помоч у меня датчик температуры дс 18б20 на основе его построить код и lcd икран с кнобками
зима показала очень высокую точность поддержания температуры. Разве что помех много от симистора но у меня это никак не проявляется, знаю, что должны быть)
Озадачили как ФИМ можно мощность регулировать... ФИМ - это же фазо-импульсная?
А для инерционных систем с активной нагрузкой, чтобы не шуметь симистором в сеть, лучше полупериоды вырезать с коммутацией в нуле - этакая АМ синхронизированная с пропаданием несущей. :)
Добрый день. Не могли бы вы повторно выложить библиотеку для терморезистора? Ссылка больше не работает :-(
http://dobrofile.ru/?s=7860a8d1f