Электронный терморегулятор на батарею своими руками ардуино. Еще один термостат на Arduino, но с OpenTherm. Составляющие ПИД регулятора

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

Принципиальная схема самодельного четырехканального термостата с отображением температур, построен на основе Arduino UNO, LM325 и с дисплеем 1602А, позволяет управлять четырьмя раздельными нагрузками.

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

Работа четырехканального термометра и его программы очень подробно описана в предыдущей статье (Л.1), поэтому здесь речь будет только об изменениях для реализации работы четырехканального термостата.

Принципиальная схема

Принципиальная схема показана на рис.1.

Рис. 1.Принципиальная схема термостата на Arduino UNO, LM325 с дисплеем 1602А.

В отличие от первой схемы (Л.1) здесь присутствуют четыре транзисторных ключа, нагруженных на обмотки реле К1-К4, управляющие четырьмя различными нагревательными устройствами (Н1-Н4). Управляющие команды на эти ключи поступают от четырех цифровых портов D9-D12 платы ARDUINO UNO.

Программа

Программа приведена в таблице 1.

Таблица 1.

Первое отличие в том, что заданы порты для управления нагревателями. Это порты D9-D12, заданы они здесь:

pinMode(12, OUTPUT);

pinMode(11, OUTPUT);

pinMode(10, OUTPUT);

pinMode(9, OUTPUT);

Можно выбрать другие свободные цифровые порты, после подключения индикатора остались еще D8 и D13. Но автор выбрал именно эти: D9, D10, D11, D12. Второе отличие в том, что для управления нагревателями используется компараторная функция if. В строках:

if(temp < -15)digitalWrite(12, HIGH);

if(temp > -15)digitalWrite(12, LOW);

if(tempi < 1)digitalWrite(11, HIGH);

if(tempi > 1)digitalWrite(11, LOW);

if(temp2 < 20)digitalWrite(10, HIGH);

if(temp2 > 20)digitalWrite(10, LOW);

if(temp3 < 10)digitalWrite(9, HIGH);

if(temp3 > 10)digitalWrite(9, LOW);

В этих строках указывается при какой температуре, какой логический уровень должен быть на соответствующем порту. Например, при температуре первого датчика (Т1) ниже -15°С на порту D12 будет логическая единица. При температуре второго датчика (Т2) ниже 1°С на порту D11 будет логическая единица.

При температуре третьего датчика (ТЗ) ниже 20°С на порту D10 будет логическая единица. При температуре четвертого датчика (Т4) ниже 10°С на порту D9 будет логическая единица. Конечно, температуры можно задать и совсем другие, - любые, которые нужны для конкретного применения данного прибора.

Более того, уже в готовом устройстве, при необходимости их легко изменить. Для этого нужно подключить персональный компьютер к USB-порту платы ARDUINO UNO и загрузить программу с другими данными по температурным порогам. В принципе, для этого можно предусмотреть на корпусе готового прибора разъем USB.

Обычно, в «типовом» терморегуляторе есть петля гистерезиса, то есть, цепь, которая создает разницу между тепера-турой включения нагревателя и температурой его выключения. Это нужно для того чтобы нагреватель включался / выключался не очень часто. Особенно это важно, если нагревателем управляет электромагнитное реле.

Потому что контакты реле не рассчитаны на такой режим работы, и могут быстро выйти из строя от подгорания из-за искрения. Но гистерезис вносит погрешность в работу термостата. Здесь было решено не создавать гистерезис, а для того чтобы контакты реле переключались не слишком часто просто замедлить работу прибора. Для этого в строке:

время индикации увеличено до трех секунд. В результате, измерения повторяются с периодом в три секунды, и в любом случае, реле не может переключаться чаще, чем один раз в три секунды.

Детали

Электромагнитные реле К1-К4 можно применить любые с обмотками на 12V и контактами, достаточно мощными для управления конкретными нагревателями.

Выходные каскады можно сделать и по другим схемам, например, на оптоси-мисторах. В этом случае, к соответствующим портам платы ARDUINO UNO подключаются, через токоограничительные резисторы, светодиоды оптосимис-торов или, так называемых, «твердотельных реле».

Каравкин В. РК-08-17.

Литература: 1. Каравкин В. - Четырехканальный термометр на ARDUINO UNO, РК-06-17.

Читая первую часть заголовка многие из вас, наверняка, подумали – еще один термостат на многострадальной Arduino. И… Это правда – да, это очередной термостат для очередного котла, очередного дома, но правда это только отчасти – в статье я не хочу концентрироваться на самом устройстве – их (статей) действительно предостаточно. Несомненно, я опишу термостат, но больше хотел бы рассказать о том, как я связывал сам микроконтроллер с котлом. Итак, кому интересно – прошу…

Как все начиналось

Прежде всего хочу сказать, что я нисколько не программист и с настоящим микроконтроллером дела до этого не имел. Мое первое знакомство с МК AVR (да и вообще с МК) было еще в старшей школе, когда мне захотелось узнать, как же все-таки работает эта загадочная штука. Я прочел несколько статей и с тех пор в памяти у меня остались лишь отрывки, которые можно было описать всего двумя словами – DDR и PORT – на этом мои познания и обрывались. Потом был универ, 5-й курс – «Программирование микроконтроллеров» где мы все познакомились с MSC51 в виртуальной среде. Тут уже были и прерывания, и таймеры, и все остальное. Ну, вот с таким багажом знаний я и пришел к проблеме. Закончим на этой автобиографической ноте и перейдем к более интересной части.

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

Решалась эта проблема очень просто – датчиком OTC (Outside Temperature Compensation), который подключается к котлу и позволяет ему автоматически подстраивать температуру теплоносителя в зависимости от уличной температуры. Проблема, казалось бы, решена, но чтение сервис-мануала на котел (Ferolli Domiproject C24D) быстро растоптало мою надежду – подключение датчика внешней температуры в данной модели не предусмотрено. Все? Все. И вот, наверное, можно было бы закончить, но летом в котле в грозу до сих пор непонятным мне способом сгорает плата управления, и разговаривая с сервис-мэном (плату в последствии отремонтировали) я спросил, возможно ли подключение OTC на мой котел? Он ответил, что подключают, используя внешние термостаты. Это отложилось у меня в памяти, но я не особо на этом концентрировался до наступления холодов, а дальше всё таже проблема.

Листая все ту же сервисную инструкцию, но уже с целью посмотреть, как же подключается термостат, я заметил, что на те же клеммы подключается «OpenTherm регулятор». Тут-же я понял – вот ОНО! Поиск в Google «OpenTherm Arduino» же меня опять огорчил – ничего особо толкового. Был монитор сообщений, но это не то – мне и слушать, то нечего – нужен именно термостат.

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

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

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

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

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

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

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

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

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

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

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

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

o(t) = P + I + D = K p e(t) + K i ∫e(t)dt + K d de(t)/dt

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

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

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

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

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

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

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

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

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

P(t) = K p * e(t)

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

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

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

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

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

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

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

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

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

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

I(t) = K i ∫e(t)dt

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

I(t) = I(t -1) + K i * e(t)

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

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

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

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

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

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

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

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

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

D(t) = K d de(t)/dt

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

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

D(t) = K d * (e(t) - e(t -1))

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

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

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

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

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

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

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

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

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

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

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

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

В следующем уроке будем разрабатывать ПИД регулятор температуры.

Поделится с вами опытом создания умного регулятора вращения вентиляторов, с участием термодатчика, LCD-дисплея и, конечно же, Arduino.

Несколько месяцев назад я прочел ряд статей об Arduino и весьма заинтересовался данным девайсом, а вскоре решил приобрести. Надо отметить, что я далек от микроэлектроники, поэтому плата расположила к себе прежде всего относительной простотой в освоении. Набаловавшись с LED-ами и «Hello world»-ами, захотелось сделать что-нибудь практичное, заодно более детально ознакомиться с возможностями Arduino . Памятуя об аномально жарком лете 2010 года, возникла идея собрать регулятор оборотов кулера в зависимости от температуры с выводом всех сопутствующих характеристик на LCD. Надеюсь, что кому-нибудь данная схема или ее вариации смогут пригодиться, поэтому решил выложить свои наброски.

Для данной схемы нам понадобится:

  • Собственно сама плата Arduino или аналог ;
  • Макетная плата для сборки компонентов схемы;
  • Дисплей WH1601A-NGG-CT с подстроечным резистором на 20 кОм или аналогичный;
  • Резисторы – 220 Ом , 10 кОм , 4.7 кОм ;
  • Биполярный транзистор SS8050D или аналогичный ему;
  • Цифровой температурный датчик DS18B20 ;
  • Диод 1N4148 или аналог;
  • Вентилятор осевой трехпроводной (на 12В), например - компьютерный;
  • Разъем гнезда питания 2,1/5,5 мм.

Компьютерный кулер имеет три провода , два из которых - красный (+12V) и черный (GND) используются для питания, а третий (желтый) связан с таходатчиком, построенном на элементе Холла. К сожалению, 5V с платы нам явно недостаточно, но 6 цифровых выходов Arduino могут работать в режиме ШИМ (они отмечены на самой плате белыми квадратиками, либо буквами PWM), поэтому мы можем регулировать подачу сигнала с платы на реле, которое будет отвечать за изменение напряжения, подаваемого на вентилятор.

Получать информацию об оборотах мы будем с третьего провода от таходатчика, воспользовавшись модифицированным способом , основанным на реализации прерываний , которые у большинства Arduino могут приходить на цифровые pin 2 (прерывание 0) и 3 (прерывание 1). Кстати, у Arduino Mega наличествует еще 4 дополнительных пина с возможностью получения прерываний.

Теперь необходимо расположить цифровой датчик температуры , данные которого мы будем использовать для регулирования напряжения, подаваемого на цифровой выход с ШИМ, а следовательно для «открытия» канала напряжения вентилятора. Для датчиков фирмы Dallas существует собственная библиотека Arduino – DallasTemperature , которую впоследствии мы и будем подключать в скетче. Библиотеку необходимо распаковать в каталог arduino-0018/libraries /.

Осталось последнее – подключить LCD , где у нас будет отображаться вся текущая информация о температуре и скорости вентилятора. Поскольку я использовал для сборки экран WH1601A, могут иметь место известные проблемы с отображением строк. Для их устранения мы воспользуемся библиотекой LiquidCrystalRus , которую необходимо также распаковать в каталог arduino-0018/libraries/ .

//Подключаем библиотеку для термодатчика #include //Подключаем библиотеку для LCD #include #define PowerPin 9 // pin для контроля питания вентилятора #define HallSensor 2 // pin для датчика оборотов вентилятора (прерывание) #define TempPin 7 // pin для датчика температуры LiquidCrystalRus lcd(12, 11, 10, 6, 5, 4, 3); //Подключение LCD DallasTemperature tempSensor; int NbTopsFan, Calc, fadeValue; //целочисленные переменные для расчетов float temper; //вещественная переменная для хранения температуры typedef struct{ // Вводим новый тип переменных для вентиляторов char fantype; unsigned int fandiv; }fanspec; //Массив переменных нового типа fanspec fanspace={{0,1},{1,2},{2,8}}; //Переменная, отвечающая за выбор типа датчика вентилятора (1 – униполярный датчик Холла, 2 –биполярный датчик Холла) char fan = 2; //Эта функция у нас будет вызываться при каждом прерывании void rpm () { NbTopsFan++; } // Функция расчета подаваемого напряжения на цифровой pin с ШИМ void temp () { fadeValue = min (int (temper*7),255); // Умножаем температуру на коэффициент, // берем от произведения целое число } // Т.к. максимальное значение ШИМ составляет 255, то подавать больше не имеет смысла – берем минимум из двух void setup () { tempSensor.begin (TempPin); //Запускаем температурный датчик lcd.begin (16, 2); //Задаем характеристики LCD lcd.setDRAMModel (LCD_DRAM_WH1601); //И тип дисплея pinMode (HallSensor, INPUT ); // Настраиваем pin на получение прерываний attachInterrupt (0, rpm, RISING ); //Привязываем прерывание по номеру 0 к нашей функции, причем высчитываться она будет каждый раз при смене сигнала } void loop () { temper = tempSensor.getTemperature(); // Получаем температуру temp(); // Высчитываем подаваемое напряжение на ШИМ analogWrite (PowerPin, fadeValue); // Подаем его NbTopsFan = 0; // Обнуляем переменную, содержащую обороты delay (1000); //Ждем 1 секунду Calc = ((NbTopsFan * 60)/fanspace.fandiv); //Рассчитываем величину оборотов за 60 секунд, поделенную на множитель вентилятора lcd.print (Calc, DEC ); //Выводим рассчитанную величину в десятичном виде lcd.print (" rpm - " ); lcd.print (temper); //Выводим температуру lcd.home (); }

Поддержите проект — поделитесь ссылкой, спасибо!
Читайте также
Маринованный перец болгарский на зиму: рецепты без стерилизации Маринованный перец болгарский на зиму: рецепты без стерилизации Образ жизни людей в японии Образ жизни людей в японии Как приготовить творожный десерт с желатином Как приготовить творожный десерт с желатином