Уроци по Ардуино
Блог за техническа поддръжка на моите разработки
Главно меню
Урок 41 PID температурен регулатор.
Нека продължим разработването на контролера на елемента на Пелтие, започнато в урок 36. Нека добавим температурен контролер към проекта.
Терморегулаторът изпълнява основната функция на хладилника - стабилизиране на температурата в камерата. Именно той до голяма степен определя основните параметри на устройството: точността на поддържане на температурата и скоростта на реагиране на смущаващи влияния. Следователно, ние ще внедрим температурния контролер съгласно закона за регулиране на PID.
Още веднъж ще дам блокова схема на връзката между регулаторите за мощност и температура.
Температурният регулатор получава измерената стойност на температурата в камерата, сравнява я със зададената стойност и генерира зададената стойност на мощността за регулатора на мощността. И така, в температурния контролер:
- регулируем параметър - температура в камерата;
- регулиращ елемент - зададената мощност за регулатора на мощността.
За да се стабилизира температурата, тя трябва да бъде измерена. Затова първото нещо, което добавяме към програмата, е измерването на температурата в камерата. Едновременно с това извършваме измерване на температурата на радиатора на горещата страна на елемента на Пелтие.
Извършване на измерване на температурата в камерата и температурата на радиатора на горещата страна на модула на Пелтие.
Температурата се измерва с вградени сензори DS18B20. Достатъчно подробно за свързването на сензори от този тип към Arduino е описано в урок 26. За тези, които не знаят как да работят с тези термични сензори, трябва внимателно да прочетете урок 26.
Нека свържем сензорите DS18B20 към платката Arduino според стандартната схема. В началото на развитието ниеРешихме, че ще използваме аналогови пинове A2 и A3 в дискретен режим.
Моята сглобена верига изглежда така.
Сега ще усъвършенстваме програмата.
Свържете библиотеката OneWire:
Нека добавим променливи за измерените температури:
плаваща мярка TempRef; // измерена температура в камерата ( MEASURE_MAX_TEMP)) measureTempRef= -300.; // грешка при измерване > иначе измери TempRef= -300.; // грешка при измерване >
if (cycle20mcCount == 46) // --------------------------- интервал 46, отчитане на температурния сензор на радиатора sensTempRad.reset(); // нулиране на 1-Wire шината sensTempRad.write(0xCC, 1); // пропускане на ROM sensTempRad.write(0xBE, 1); // команда за четене на паметта на сензора sensTempRad.read_bytes(bufData, 9); // чете паметта на сензора, 9 байта
if ( OneWire::crc8(bufData, 8) == bufData[8] ) < // проверка на CRC // правилно measureTempRad= (float)((int)bufData[0] (((int)bufData[1]) MEASURE_MAX_TEMP)) measureTempRad= -300.; // грешка при измерване > иначе измери TempRad= -300.; // грешка при измерване >
Получените резултати също се проверяват за горната и долната максимална стойност. Ако температурата в нашата система е повече от 100 или под 40 C°, това е явна грешка.
Остава да изведем измерените температури на компютъра за проверка.
Serial.print("t="); Serial.print(measureTempRef, 2); // температура в камера Serial.print(" t="); Serial.print(measureTempRad, 2); // температура на радиатора
Пълна скица на програмата с измерване на температурата в камерата и радиатора можете да изтеглите от този линк:
Регистрирай се и плати. Само 25 рубли. на месец за достъп до всички ресурси на сайта!
Качете скицата на дъската, отворетесериен монитор. Всичко работи.
Температурата е измерена правилно.
Реализация на PID температурен регулатор.
При проектирането на регулатора на мощността (урок 39) направих малка грешка. За бързо изключване на регулатора използвах условието setPower == 0. при дадена мощност, равна на 0, контролерът моментално се изключва, интегралната връзка се нулира. За внедряване на аварийни режими в бъдеще е необходимо бързо изключване.
Но дадената мощност може да стане равна на 0 за кратко време под действието на диференциращия компонент. Промених условието за аварийно изключване на регулатора на мощността:
Сега регулаторът се изключва при всяка отрицателна стойност на зададената мощност.
Така. Ние създаваме всички променливи и константи, необходими за температурния контролер.
#define koeffRegTmpInt 0.002 // интегрално усилване на температурния регулатор #define koeffRegTmpPr 0.5 // пропорционално усилване на температурния регулатор #define koeffRegTmpDif 50 // производен фактор на температурния регулатор
#define MAX_POWER 5. // максимална изходна мощност на контролера
floatregPwrInt=0; // интегрален регулатор на мощност float maxSetPower=MAX_POWER; // максимална посочена мощност float regTmpInt=0; // интеграл на температурния контролер float regTmpPr; // пропорционален елемент на терморегулатора float regTmpDif; // диференциална верига на температурния контролер float regTmpErr; // грешка при температурно несъответствие float regTmpErrPrev; // грешка при несъответствие на предишна температура float setTempRef; // задаване на температура в камерата
Ще обясня само параметрите за ограничаване на мощността.
MAX_POWER константаопределя максималната мощност, която контролерът може да произведе. Това са хардуерни ограничения на захранването, ключов стабилизатор, модул Пелтие и др.
Променливата maxSetPower се задава от потребителя и може да се променя по всяко време с помощта на бутоните на контролера. Той въвежда допълнително ограничение на изходната мощност. Например, някой иска да ограничи консумацията на енергия, за да пести електроенергия.
Самият контролер ще се задейства в цикъл от 20 ms на интервал от 47, веднага след получаване на резултатите от измерването на температурата.
if (cycle20mcCount == 47) // --------------------------- интервал 47, регулатор на температурата на камерата
setTempRef=20.; // временно зададена температура regTmpErr= measureTempRef - setTempRef; // изчисляване на грешка при несъответствие
При рязко намаляване на сигнала за грешка диференциалният компонент трябва да намали изходния сигнал на контролера. Тези. диференциращият компонент трябва да се извади от другите компоненти. Погледнете внимателно монитора на серийния порт. При доближаване (понижаване) на реалната температура до дадения диференциращ компонент намалява дадената мощност.
Едуард очаква с нетърпение завършването на проекта. Сглобявам същото, но тук е уловката, ще имам няколко елемента за пелтие. Имам нужда от по-силно охлаждане и ще стоят от различни страни на корпуса или по-скоро самият корпус ще е алуминиев радиатор, и е затворен отгоре с термоизолация. И в тази връзка въпросът е дали е възможно да се направи контрол на температурата и контрол на мощността за няколко пелтие елемента от ардуино и пистови товари. Аз самият в програмирането не съм селен. и не е препоръчително да се сглобяват няколко контролера за едно устройство.
Може да е по-лесносвържете няколко елемента на Пелтие паралелно и направете по-мощен регулатор.
Трябва да контролирам пелтиера от прегряване, ако са успоредни, тогава няма контрол и има голяма вероятност единият да се нагрее повече от другия, в резултат на това ефективността е по-ниска, отколкото при контрола, но те работят за мен при максимални натоварвания и има голяма вероятност от повреда на пелтиера.
Контролът на температурата на горещата страна е най-простата задача. Измерете температурата с няколко сензора и ги използвайте, за да практикувате защита. В следващия урок ще направя защита от прегряване. Между другото, можете да отворите тема във форума на сайта. Някой ще сподели опит.
Здравей Едуард. Кажете ми, защо сте свързали сензорите според "бездомното" захранване, а не по стандартния, 3-жилен начин?
Здравейте! Запазени проводници. Но можете лесно да промените.
Здравейте. Въпрос за програмата. Защо да ограничавате първо интегралния компонент до стойността на maxPower, а след това самия изходен сигнал до същата стойност? Не би ли било по-добре да ограничим интегралния компонент до максималната положителна стойност на променливата, така че да няма скок към отрицателни?
Здравейте! Ако ограничите само изходната стойност на регулатора, тогава при отрицателни стойности на пропорционалните или диференциалните компоненти интегралната компонента може да стане по-висока от максимално допустимата.
Здравейте. Прегледах цялата скица, но пак не разбирам: в този ред regTmpDif= (regTmpErr - regTmpErrPrev) * koeffRegTmpDif; regTmpErrPrev се използва, но поне някаква стойност му се присвоява само в следващия ред regTmpErrPrev= regTmpErr; как тогава се изчислява предишният ред, ако regTmpErrPrev няма начална стойност?
Здравейте! Това е смисълът. Текущата грешка при температурно несъответствие се изважда от предишната й стойност. Само при стартиране на програмата в първия момент ще се използва стойността 0. И тогава всичко работи логично.
Когато инициализира променливи, компилаторът ги задава на 0. Диференциалният контролер няма памет за повече от един цикъл.
Още веднъж да подчертая, че началната стойност за тези променливи е важна.