Регулятор температуры на ардуино

Устройство системы

#include <Wire.h> #include <LiquidCrystal_I2C.h> #include «DHT.h» #include <EEPROM.h> #define DHTPIN 7 // номер пина, к которому подсоединен датчик DHT22 LiquidCrystal_I2C lcd(0x3f,16,2); // Задаем адрес и размерность дисплея. DHT dht(DHTPIN, DHT22); //инциализация датчика DHT22 //служебные переменные int counter=0; //счетчик циклов String strOut=»»; //строка для вывода на дисплей float rh; //для считывания влажности float rt; //для считывания температуры float h=0; //для хранения усредненного значения влажности float t=0; //для хранения усредненного значения температуры String out_h=»—.—«; //строка для вывода влажности String out_t=»—.—«; //строка для вывода темературы //количество необходимых измерений для вычисления среднего значения #define measureCntMax 5 //количество произведенных измерений int measureCnt=0; String tiktak=»»;//для отображения процесса работы в виде мигающей справа на экране точки, чтобы понимать что устройство не зависло и производит измерения ///////////////////////////// //температура включения и выключения отопления по умолчанию float tempHeatOn=23.00; float tempHeatOff=26.00; //состояние обогревателя byte HeatState=0; //0 — обогрев выключен, 1 — обогрев включен //влажность включения и выключения вытяжки по умолчанию float humVentOn=65.00; float humVentOff=45.00; //состояние вентиляции byte VentState=0; //0 — вытяжка выключена, 1 — вытяжка включена int mode=0; //режим экрана и ввода с кнопок //0 — отображает значения температуры и влажности //1 — экран настройки температуры включения обогрева //2 — экран настройки температуры отключения обогрева //3 — экран настройки влажности включения вентиляции //4 — экран настройки влажности отключения вентиляции //5 — служебное значение, по которому сбрасываем режим на 0 и сохраняем настройки!!!!! //6 — отображение текущих температурных параметров //7 — отображение текущих параметров влажности //предыдущее значение кнопок byte RbtnLastState=-1; //для красной byte GbtnLastState=-1; //для зеленой //время удержания кнопок int RHoldTime=0; //для красной int GHoldTime=0; //для зеленой void setup() { pinMode(13,OUTPUT); //гасим штатный светодиод на 13 выводе pinMode(2,OUTPUT); //реле 2, разъем 2 — сюда подключен второй вентилятор вытяжки pinMode(3,OUTPUT); //реле 3, разъем 4 — запасной, в настоящее время не используется pinMode(4,OUTPUT); //вывод 5 вольт на разъем 3 для дистанционного управления розеткой pinMode(9,OUTPUT); //реле 1, разъем 1 — сюда подключен первый вентилятор вытяжки pinMode(14, OUTPUT); //переключаем аналоговый вход A0 в режим цифрового вывода с номером D14 digitalWrite(14, LOW); pinMode(15, OUTPUT); //переключаем аналоговый вход A1 в режим цифрового вывода — D15 (документация ардуино) digitalWrite(15, LOW); pinMode(5,INPUT); //настраиваем цифровой вход 5 на ввод pinMode(8,INPUT); //настраиваем цифровой вход 8 на ввод digitalWrite(5, HIGH); //подтягиваем резистор на вход 5 digitalWrite(8, HIGH); //подтягиваем резистор на вход 8 lcd.begin(); // Инициализация lcd lcd.backlight();// Включаем подсветку delay(100); //выводим приветственный текст на дисплей lcd.setCursor(0, 0); // Устанавливаем курсор в начало 1 строки lcd.print(«<<< Turbo Dj >>>»); // Выводим текст lcd.setCursor(0, 1); // Устанавливаем курсор в начало 2 строки lcd.print(«>>> EANIK.RU <<<«); // Выводим текст delay(1500); //запускаем датчик DHT22 dht.begin(); //объявляем 4 переменные для чтения настроек из памяти EEPROM float e1; float e2; float e3; float e4; //читаем настройки из памяти EEPROM.get(0, e1); EEPROM.get(20, e2); EEPROM.get(40, e3); EEPROM.get(60, e4); //Поочередно покажем считанные настройки (либо их отсутствие) lcd.setCursor(0, 0); lcd.print(MakeString(«Read Temp On»)); if (isnan(e1)){ lcd.setCursor(0, 1); lcd.print(MakeString(«EEPROM EMPTY»)); } else{ lcd.setCursor(0, 1); lcd.print(MakeString(String(e1))); tempHeatOn=e1; } delay(1000); lcd.setCursor(0, 0); lcd.print(MakeString(«Read Temp Off»)); if (isnan(e2)){ lcd.setCursor(0, 1); lcd.print(MakeString(«EEPROM EMPTY»)); } else{ lcd.setCursor(0, 1); lcd.print(MakeString(String(e2))); tempHeatOff=e2; } delay(1000); lcd.setCursor(0, 0); lcd.print(MakeString(«Read Hum On»)); if (isnan(e3)){ lcd.setCursor(0, 1); lcd.print(MakeString(«EEPROM EMPTY»)); } else{ lcd.setCursor(0, 1); lcd.print(MakeString(String(e3))); humVentOn=e3; } delay(1000); lcd.setCursor(0, 0); lcd.print(MakeString(«Read Hum Off»)); if (isnan(e4)){ lcd.setCursor(0, 1); lcd.print(MakeString(«EEPROM EMPTY»)); } else{ lcd.setCursor(0, 1); lcd.print(MakeString(String(e4))); humVentOff=e4; } delay(1000); //отобразим служебное сообщение, пока производится первое измерения данных до вывода на экран lcd.setCursor(0, 0); lcd.print(MakeString(«Starting Sensor»)); lcd.setCursor(0, 1); lcd.print(MakeString(«Please Wait…»)); } void loop() { //измеряем температуру и влажность каждые 2 секунды if (counter==200 && mode==0){ counter=0; ReadData(); //процедура для чтения информации с датчика DHT22 } //читаем кнопки byte btnG=digitalRead(8); byte btnR=digitalRead(5); //1.если удерживаюися обе кнопки if (btnG==0 && btnR==0 && RbtnLastState==0 && GbtnLastState==0){ counter=0; RHoldTime++; GHoldTime++; //если удерживаются обе кнопки более 3 секунд то переходим на следующий экран if (RHoldTime>=300 && GHoldTime>=300){ RHoldTime=0; GHoldTime=0; if (mode>5){mode=0;} mode++; //сохраним настройки if (mode==5){ mode=0; EEPROM.put(0, tempHeatOn); EEPROM.put(20, tempHeatOff); EEPROM.put(40, humVentOn); EEPROM.put(60, humVentOff); //выведем сообщение об успешном сохранении настроек lcd.setCursor(0, 0); lcd.print(MakeString(«Settings»)); lcd.setCursor(0, 1); lcd.print(MakeString(«Saved»)); delay(2000); } DrawLCD(); } } //2.короткое нажатие красной кнопки else if (btnR==0 && RbtnLastState==1 && btnG==1){ counter=0; switch (mode){ case 0: mode=6; DrawLCD(); break; case 1: tempHeatOn+=0.1; DrawLCD(); break; case 2: tempHeatOff+=0.1; DrawLCD(); break; case 3: humVentOn++; DrawLCD(); break; case 4: humVentOff++; DrawLCD(); break; case 6: mode=0; DrawLCD(); break; case 7: mode=6; DrawLCD(); break; } } //3.короткое нажатие зеленой кнопки else if (btnG==0 && GbtnLastState==1 && btnR==1){ counter=0; switch (mode){ case 0: mode=7; DrawLCD(); break; case 1: tempHeatOn-=0.1; DrawLCD(); break; case 2: tempHeatOff-=0.1; DrawLCD(); break; case 3: humVentOn—; DrawLCD(); break; case 4: humVentOff—; DrawLCD(); break; case 6: mode=7; DrawLCD(); break; case 7: mode=0; DrawLCD(); break; } } //4.длинное нажатие зеленой кнопки — отключаем подсветку дисплея else if (btnG==0 && btnR==1 && GbtnLastState==0){ counter=0; GHoldTime++; if (GHoldTime>=300){ GHoldTime=0; lcd.noBacklight(); } } //5.длинное нажатие красной кнопки — включаем подсветку дисплея else if (btnG==1 && btnR==0 && RbtnLastState==0){ counter=0; RHoldTime++; if (RHoldTime>=300){ GHoldTime=0; lcd.backlight(); } } //когда ничего не нажато else{ RHoldTime=0; GHoldTime=0; //если на экране настройки/информации ничего долго (в течение 10 сек) не нажимается то возвращаемся в режим отображения температуры и влажности if (mode!=0 && counter>1000){ //если возврат производится с какого-либо экрана настройки, то сообщим о том, что настройки не были сохранены if (mode<5){ lcd.setCursor(0, 0); lcd.print(MakeString(«Settings»)); lcd.setCursor(0, 1); lcd.print(MakeString(«NOT Saved»)); delay(2000); } counter=0; mode=0; DrawLCD; } } //запоминаем предыдущее значение кнопок RbtnLastState=btnR; GbtnLastState=btnG; counter++; //увеличиваем значение счетчика циклов программы delay(10); //задержка 10 мсек между циклами программы } void ReadData(){ //читаем с датчика rh = dht.readHumidity(); rt = dht.readTemperature()-0.5; //с поправкой на пол градуса, т.к. температура слегка завышается этим датчиком //проверяем считанное значение, если пустое то выдаем ошибку, если не пустое то производим вычисления if (isnan(rh) || isnan(rt)) { //если не удалось считать данные lcd.setCursor(0, 0); strOut=MakeString(«Read Error»); lcd.print(strOut); lcd.setCursor(0, 1); strOut=MakeString(«Check Sensor»); lcd.print(strOut); } else{ measureCnt++; //увеличили количество проведенных измерений h=h+rh; //суммируем показания влажности t=t+rt; //суммируем показания температуры //если набрали нужное количество измерений if (measureCnt==measureCntMax){ //вычисляем средние значения h=h/measureCntMax; t=t/measureCntMax; //запомним последние значения температуры и влажности для вывода на экран out_h=String(h); out_t=String(t); //включаем/отключаем нагрузку if (t!=0 && h!=0){ DoAll(); //процедура, котоаря управляем нагрузкой в соответствии с правилами } //сбрасываем счетчик количества измерений measureCnt=0; h=0; t=0; } DrawLCD(); } } //процедура отрисовки экрана LCD void DrawLCD(){ if (mode==0){ lcd.setCursor(0, 0); strOut=MakeString(«Temp: «+out_t+»*C»); lcd.print(strOut); lcd.setCursor(0, 1); strOut=MakeString(«Hum: «+out_h+»%»); lcd.print(strOut); //рисуем и убираем точку в правом нижнем углу для индикации процесса измерения if (tiktak==»»){ tiktak=».»; } else{ tiktak=»»; } lcd.setCursor(15, 1); lcd.print(tiktak); } if (mode==1){ lcd.setCursor(0, 0); strOut=MakeString(«Temp On: «+String(tempHeatOn)+»*C»); lcd.print(strOut); lcd.setCursor(0, 1); strOut=MakeString(«»); lcd.print(strOut); } if (mode==2){ lcd.setCursor(0, 0); strOut=MakeString(«Temp Off: «+String(tempHeatOff)+»*C»); lcd.print(strOut); lcd.setCursor(0, 1); strOut=MakeString(«»); lcd.print(strOut); } if (mode==3){ lcd.setCursor(0, 0); strOut=MakeString(«Hum On: «+String(humVentOn)+»%»); lcd.print(strOut); lcd.setCursor(0, 1); strOut=MakeString(«»); lcd.print(strOut); } if (mode==4){ lcd.setCursor(0, 0); strOut=MakeString(«Hum Off: «+String(humVentOff)+»%»); lcd.print(strOut); lcd.setCursor(0, 1); strOut=MakeString(«»); lcd.print(strOut); } if (mode==6){ lcd.setCursor(0, 0); strOut=MakeString(«Temp On: «+String(tempHeatOn)+»*C»); lcd.print(strOut); lcd.setCursor(0, 1); strOut=MakeString(«Temp Off: «+String(tempHeatOff)+»*C»); lcd.print(strOut); } if (mode==7){ lcd.setCursor(0, 0); strOut=MakeString(«Hum On: «+String(humVentOn)+»%»); lcd.print(strOut); lcd.setCursor(0, 1); strOut=MakeString(«Hum Off: «+String(humVentOff)+»%»); lcd.print(strOut); } } //правила поведения устройства в зависимости от температуры и влажности void DoAll(){ //включаем обогрев, разъем 3, дистанционная розетка //сделаем чтобы батарея также включалась при повышенной влажности, чтобы подсушивать воздух if (HeatState==0 && (t<=tempHeatOn || h>=humVentOn)){ digitalWrite(4,1); digitalWrite(14,HIGH); HeatState=1; } //отключаем обогрев, когда температура пришла в норму, а также влажность не превышает верхний предел (порог включения вытяжки) if (t>=tempHeatOff && HeatState==1 && h<humVentOn){ digitalWrite(4,0); digitalWrite(14,LOW); HeatState=0; } //включаем вентиляцию, замыкаем разъемы 1 и 2 (реле 1 и 2) //также включаем вытяжку, если температура превышает верхнее значение //(т>температуры отключения обогрева, например если перегрели во время просушки, //то вытяжка продолжит работать когда влажность уже в норме, но температура воздуха еще высокая) if (VentState==0 && (h>=humVentOn || t>tempHeatOff)){ digitalWrite(9,1); digitalWrite(2,1); digitalWrite(15,HIGH); VentState=1; } //отключаем вентиляцию, когда влажность и температура пришли в норму if (h<=humVentOff && VentState==1 && t<=tempHeatOff){ digitalWrite(9,0); digitalWrite(2,0); digitalWrite(15,LOW); VentState=0; } //здесь будет код для открытия приточки //если влажность в помещении высокая, и на улице температура больше 0 и нет дождя и сухая земля, и приточка закрыта, то открываем приточку //если влажность вернулась в норму и приточка открыта, то закрываем приточку //реле 3, разъем 4 //digitalWrite(3,1); //digitalWrite(3,0); } //функция для формирования строки длинною 16 символов для вывода на экран, позволяет не вызывать функцию очистки экрана, ускоряет процесс работы скетча //недостающие символы заполняются пробелами до 16 знака String MakeString(String str){ String res; res=str; while(res.length()<16){ res=res+» «; } return res; }

Управление котлом с помощью Arduino

В прошлый раз мы разобрались, что можно управлять котлом с помощью сопротивления от 10 кОм до 30 кОм. Ну а сопротивлением мы будем управлять с помощью платформы Arduino.

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

Переключая любое реле мы меняем сопротивление системы. 5 разрядов это 32 возможных состояния.

Контакты In и Out цепляются к 7-9 контакту котла Vaillant. Схема позволяет дискретно, линейно менять сопротивление в заданном диапазоне с шагом 680 Ом, что примерно соответствует 2 градусам контура отопления:

Результаты тестирования платы управления на котле: сопротивление меняется линейно, а вот температура котла – не совсем.

В живую схема управления котлом состоит из двух частей: платы управления с напаянными резисторами и Arduino relay shield – платы с 8 реле, управляемых ардуиной. Релейная плата подключается к пинам 4-9 на ардуино, а сами реле к резисторам. Готовая плата управления выглядит так:

Плата управления котлом. Провода идут к реле. На плате дополнительно напаяны три планки с для подключения +5 В, земли и датчиков температуры. Плата управления котлом. Провода идут к реле. На плате дополнительно напаяны три планки с для подключения +5 В, земли и датчиков температуры.

Еще я закупил Arduino Uno – мозги системы. Питаю ардуину через USB от телефонной зарядки.

Тестовая сборка. Вместо платы управления — монтажная плата.

LCD 1602 i2c – простенький двухстрочный экран для вывода текущей информации. Взял экран совмещенный с платой I2C, чтобы не занимать лишние пины.


Схема подключения LCD экрана к ардуине

IR Wireless Remote Control Module Kit – это ИК пультик с приемником, чтобы управлять ардуиной, паять кнопки мне было лень, а тут такое богатство кнопок и всего один занятый пин ) В моем случае ИК висит на 2 пине.


Схема подключения ИК приемника к ардуине.

Waterproof Digital Temperature Sensor DS18b20 – 2 влагозащищенных датчика температуры, вешаются на один пин. Первый датчик выносится на улицу, второй меряет температуру в помещении. У меня датчики висят на 3 пине.


Схема подключения температурных датчиков к ардуине.

Все это щастье с сопутствующей мелочевкой обошлось мне примерно в 1 000 рублей, закупался на AliExpess.

Продолжение.

Продолжение разработки проекта контроллера модуля Пельтье, начатой в уроке 36. Узнаем, что такое ПИД регулятор.

Предыдущий урок Список уроков Следующий урок

Основная задача контроллера холодильника – поддержание в камере заданной температуры. Делать это будет регулятор температуры за счет изменения электрической мощности на модуле Пельтье.

В предыдущем уроке мы разработали регулятор мощности. Связь регуляторов мощности и температуры выглядит так.

  • Регулятор температуры получает измеренную температуру, сравнивает ее с заданной температурой и вычисляет значение заданной мощности для регулятора мощности.
  • Регулятор мощности формирует ШИМ, соответствующий заданной мощности.

Регулятор мощности мы построили по интегральному закону регулирования. Для стабилизации температуры будем использовать более сложный алгоритм управления – пропорционально-интегрально-дифференцирующий (ПИД) регулятор.

ПИД регулятор.

В предыдущем уроке я подробно рассказал об интегральном регуляторе. Подчеркнул его достоинства и недостатки.

Регулятор, работающий по такому принципу, обладает высокой точностью. Остальные критерии качества регулирования – быстродействие и устойчивость — у него не на высоте.

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

Именно таким устройством является пропорционально-интегрально-дифференцирующий (ПИД) регулятор. Он формирует выходной сигнал, являющийся суммой трех составляющих с разными передаточными характеристиками. Благодаря этому ПИД регулятор обеспечивает высокое качество регулирования и позволяет оптимизировать управление по отдельным критериям.

В формировании выходного сигнала ПИД регулятора участвуют:

  • Пропорциональная составляющая – значение пропорционально ошибке рассогласования (разности заданного и реального значений регулируемого параметра).
  • Интегрирующая составляющая – интеграл ошибки рассогласования.
  • Дифференцирующая составляющая – производная ошибки рассогласования.

Математическая форма записи закона ПИД регулятора имеет вид:

o(t) = P + I + D = Kp e(t) + Ki ∫e(t)dt + Kd de(t)/dt

  • o(t) – выходной сигнал;
  • P – пропорциональная составляющая;
  • I – интегрирующая составляющая;
  • D – дифференцирующая составляющая;
  • Kp, Ki, Kd – коэффициенты пропорционального, интегрирующего, дифференцирующего звеньев;
  • e(t) – ошибка рассогласования.

В схематичном виде ПИД регулятор можно представить так.

Структурная схема ПИД регулятора напряжения U выглядит так.

  • Измеренное напряжение Ureal(t) вычитается из заданного Uset.
  • Полученная ошибка рассогласования e(t) поступает на пропорциональное, интегрирующее и дифференцирующее звенья.
  • В результате суммы составляющих получается управляющее воздействие o(t), которое подается на регулирующий элемент.

При программной реализации ПИД регулятора вычисления выходного сигнала происходят через равные промежутки времени. Т.е. регулятор является дискретным по времени. Поэтому, далее я буду употреблять выражения: предыдущее состояние сигнала, предыдущее значение и т.п. Речь идет о состоянии системы в предыдущей точке временной дискретизации.

Составляющие ПИД регулятора.

Еще раз. Выходной сигнал ПИД регулятора это сумма трех составляющих:

  • пропорциональной;
  • интегрирующей;
  • дифференцирующей.

Пропорциональная составляющая.

P(t) = Kp * e(t)

Не имеет памяти, т.е. значение выходного сигнала не зависит от предыдущего состояния системы. Просто ошибка рассогласования, умноженная на коэффициент, передается на выход. Выходной сигнал компенсирует отклонение регулируемого параметра. Сигнал тем больше, чем больше ошибка рассогласования. При ошибке равной 0, сигнал на выходе тоже равен 0.

Пропорциональная составляющая не способна компенсировать ошибку полностью. Это видно из формулы. Выходной сигнал в Kp раз больше ошибки. Если ошибка рассогласования равна 0, то и выходной сигнал регулятора равен 0. А тогда и компенсировать нечем.

Поэтому в пропорциональных регуляторах всегда существует так называемая статическая ошибка. Уменьшить ее можно за счет увеличения коэффициента Kp, но это может привести к снижению устойчивости системы и даже к автоколебаниям.

К недостаткам пропорциональных регуляторов следует отнести:

  • наличие статической ошибки регулирования;
  • невысокая устойчивость при увеличении коэффициента.

Есть весомое преимущество:

  • Высокая скорость регулирования. Реакция пропорционального регулятора на ошибку рассогласования ограничена только временем дискретизации системы.

Регуляторы, работающие только по пропорциональному закону, применяют редко.

Главная задача пропорциональной составляющей в ПИД регуляторе – повысить быстродействие.

Интегрирующая составляющая.

I(t) = Ki ∫e(t)dt

Пропорциональна интегралу ошибки рассогласования. С учетом временной дискретности регулятора можно написать так:

I(t) = I(t-1) + Ki * e(t)

  • I(t-1) – значение I в предыдущей точке временной дискретизации.

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

К недостаткам интегрального регулятора следует отнести:

  • низкое быстродействие;
  • посредственная устойчивость.

Достоинство:

  • Способность полностью компенсировать ошибку рассогласования при любом коэффициенте усиления.

На практике часто используют интегрирующие регуляторы (только интегрирующая составляющая) и пропорционально-интегрирующие (интегрирующая и пропорциональная составляющие).

Главная задача интегрирующего звена в ПИД регуляторе – компенсация статической ошибки, обеспечение высокой точности регулирования.

Дифференцирующая составляющая.

D(t) = Kd de(t)/dt

Пропорциональна скорости изменения ошибки рассогласования. Своеобразный показатель ускорения ошибки рассогласования. Дифференцирующая составляющая предсказывает отклонения регулируемого параметра в будущем и противодействует этому отклонению. Как правило, она компенсирует запаздывания воздействия регулятора на объект и повышает устойчивость системы.

С учетом временной дискретности регулятора дифференцирующую составляющую можно вычислить так:

D(t) = Kd * ( e(t) — e(t-1) )

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

Регуляторов, состоящих из единственного дифференцирующего звена, не бывает.

Главная задача дифференцирующего звена в ПИД регуляторе – повышение устойчивости.

Настройка ПИД регулятора.

Качество регулирования ПИД регуляторов в значительной мере зависит от того, насколько оптимально выбраны коэффициенты. Коэффициенты ПИД регулятора определяются на практике в системе с реальным объектом путем подбора. Существуют разные методики настройки. Я расскажу только об общих принципах.

О качестве регулирования судят по переходной характеристике регулятора. Т.е. по графику изменения регулируемого параметра во времени.

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

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

Составляющие ПИД регулятора настраиваются отдельно.

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

Настройка ПИД регулятора носит итерационный характер. Т.е. пункты подбора коэффициентов могут многократно повторяться до тех пор, пока не будет достигнут приемлемый результат.

Благодаря высоким характеристикам и универсальности ПИД регуляторы широко применяются в системах автоматизации производства.