PID controller voor maischen of andere dingen (Arduino)

Gestart door Biertje1985, 04-12-2015 21:16 u

Vorige topic - Volgende topic

0 leden en 1 gast bekijken dit topic.

Biertje1985

Omdat er in mijn andere post, waarin ik een brewcontroller aan het maken ben, er veel interesse is in een PID circuit heb ik deze even opgestart.
Als je een arduino een temperatuursensor en een (SSR)Relais dan kan je met deze sketch gemakkelijk een PID controller opzetten welke zéér precies je temperatuur van
bijvoorbeeld je maisch proces kan regelen.

Voor dat de vraag komt zal ik deze maar vast beantwoorden, ja het is mogelijk om een gasbrander te regelen met een PID, alleen hardwarematig is dit een grotere uitdaging,
omdat ik puur elektrisch werk ga ik hier verder niet op in.

De PID controller bevat :

- Ondersteuning diverse sensoren, K-type analoge NTC, ds18b20 digitale sensoren
- Output naar SSR relais
- Kan op alle Arduino's draaien
- Autotuning om de regeling stabiel en snel te maken zonder veel rekenen.

Optioneel kan je aansluiten, dit zit al in de sketch :

- Een LCD schermpje 16x2 of 20x4 (Je krijgt dan ook een menu om alles in te stellen)
- Knopjes om het programma te regelen (4 Stuks) of een touchpad met knopjes.
- Meerdere sensoren (voor een gemiddelde waarde)


Succes met deze sketch, graag even een reactie wanneer je deze gaat downloaden en gebruiken, ik waardeer het erg wanneer ik feedback krijg.
Bekijk ook mijn post over de Brewcontroller wanneer je meer wilt dan alleen PID.

Wanneer er veel interesse is dan zal ik ook een kleine oplage professionele printplaatjes laten maken voor deze controller, zodat je het allemaal makkelijk in een procesbehuizing kan zetten.
Kosten hiervoor zullen erg laag zijn ik schat zo een 5 euro. Exclusief de Arduino, LCD en sensoren, maar die koop je overal voor een prikkie. Ik hoef er zelf niets op te verdienen uiteraard.




McMelloW

Hoi Jelle,

Bedankt voor het plaatsen van de code.

Drie buttons gebruiken allemaal zelfde pin A0.  Typo neem ik aan

...
#define setupBtn A0     //setupBtn
#define upBtn A0          //upBtn
#define downBtn A0     //downBtn
...

Biertje1985

Citaat van: McMelloW op 04-12-2015  22:26 uHoi Jelle,

Bedankt voor het plaatsen van de code.

Drie buttons gebruiken allemaal zelfde pin A0.  Typo neem ik aan

...
#define setupBtn A0     //setupBtn
#define upBtn A0          //upBtn
#define downBtn A0     //downBtn
...

Nee hoor, deze buttons zijn analoog, zie de weerstandwaarde achter de button zie bijv.
while (analogRead(setupBtn) == 640);
Die 640 is de weerstand. Dit word soms gebruikt om pinnetjes te sparen.
Het is inderdaad beter om om te bouwen naar gewone digitale poortjes, al is dit best wat werk.

Biertje1985

Printplaat, eerste design (niet definitief uiteraard) Feedback altijd welkom.





hansHalberstadt

Wat komt er als info uit het SSR. Is dat aan/uit of is dat PWM met lange periodetijd of kun je dat kiezen? Ik gebruik zelf een Eberle PID regelaar waar je dit kunt kiezen.
Voor mijn eigen situatie wil ik het gas via aan/uit gaan regelen. Op dit moment doe ik dat al via aan oud systeem wat nog onder MSDOS werkt (hardware bitjes van de seriele poort direct aangestuurd, ja dat kon nog met MSDOS), stuurt een gasklep aan van een oude CV en werkt perfect.

koffie

Waarom neem je niet een LCD met knoppen via I2C ? Ben je met 2 draden klaar voor zowel je scherm als je knoppen.

luc b

Bedankt biertje1985. Ik heb nog enorm veel te leren hieromtrent, maar het is een echte uitdaging. Bedankt.

Biertje1985

Citaat van: hansHalberstadt op 05-12-2015  09:26 uWat komt er als info uit het SSR. Is dat aan/uit of is dat PWM met lange periodetijd of kun je dat kiezen? Ik gebruik zelf een Eberle PID regelaar waar je dit kunt kiezen.
Voor mijn eigen situatie wil ik het gas via aan/uit gaan regelen. Op dit moment doe ik dat al via aan oud systeem wat nog onder MSDOS werkt (hardware bitjes van de seriele poort direct aangestuurd, ja dat kon nog met MSDOS), stuurt een gasklep aan van een oude CV en werkt perfect.
Dat kan je instellen op je regelaar, hoe snel deze regelt en aan de hand daarvan krijg je een aan/uit of PWM signaal.

Biertje1985

Citaat van: koffie op 05-12-2015  10:02 uWaarom neem je niet een LCD met knoppen via I2C ? Ben je met 2 draden klaar voor zowel je scherm als je knoppen.
Klopt dat is helemaal waar, dat is wel wat ik wou gaan doen, maar I2C library neemt veel recources in, dit vertraagt de boel behoorlijk.

pipsie

Citaat van: Biertje1985 op 04-12-2015  21:16 u- Autotuning om de regeling stabiel en snel te maken zonder veel rekenen.
Ik vraag me af hoe je dit voor elkaar krijgt? Laat je de controller zelf temperatuurstappen (puls, ramp,X²) genereren en opmeten om zo de gain te bepalen voor de P,I,D acties?

Biertje1985

Citaat van: pipsie op 05-12-2015  13:39 uIk vraag me af hoe je dit voor elkaar krijgt? Laat je de controller zelf temperatuurstappen (puls, ramp,X²) genereren en opmeten om zo de gain te bepalen voor de P,I,D acties?
Bekijk de PID sketch maar even, maar het zal daarop gebaseerd zijn, autotune is ook een aparte library, werk goed moet ik zeggen, alleen kan je soms je actie wat sneller instellen
dit vertraagt wat door de autotune. Nadeel is dat je aan het begin wat meer overshoot heb.

pipsie

Ik heb dit inderdaad even bekeken en ik wil je wijzen op deze opmerking van de ontwikkelaar van de PIDAutotune functie:
CiteerYou should also know...
The number of cycles performed will vary between 3 and 10.
The algorithm waits until the last 3 maxima have been within 5% of each other.
This is trying to ensure that we've reached a stable oscillation and there's no external strangeness happening. This leads me to...

I'm not the biggest fan of Autotune. I've often said, and still believe, that a moderately trained person will beat an Autotuner every day of the week.
There's just so much that can go wrong without the algorithm knowing about it.
That being said, Autotune is a valuable tool to help the novice get into the ballpark.

Bron: http://brettbeauregard.com/blog/2012/01/arduino-pid-autotune-library/
De kans is groot dat de autotune functie dus niet praktisch zal blijken voor een proces dat zeer langzaam verloopt (opwarmen van grotere hoeveelheden water).
Want de tijd om een aantal keer (tussen 3en10) een groote 'zwaai' aan de uitgang te produceren (bv +- 10°C) zal vrij lang zijn.
En ik vrees dat je voor een goede PID regeling ook rekening zal moeten houden met de hoeveelheid water, 10 L tov 30 L zou wel eens andere gain parameters kunnen opleveren (maar dit ben ik niet zeker).

Ik hou dit topic zeker in het oog want ik ben benieuwd hoe moeilijk/makkelijk het tunen van de PID in praktijk zal zijn  :)

Henielma

Voor mijn brouwinstallatie met een proportionele gasklep die door een PC aangestuurd wordt ben ik toentertijd begonnen met een PID regeling maar deze blijken voor dergelijke toepassingen in de praktijk toch niet zo handig. Na veel ge-experimenteer ben ik uitgekomen op een proportionele functie gecombineerd met een stukje feed forward sturing. Deze sturing gebruik ik nu al jaren en bevalt goed. De proportionele regeling verhoogt het PWM percentage wanneer je nog ver van je doeltemperatuur bent en wordt lager wanneer je in de buurt komt. De feed forward sturing verlaagt het PWM percentage nog extra wanneer je in de buurt komt van je doeltemperatuur maar is hierbij afhankelijk van de toegevoerde warmte in de laatste paar minuten. Dit beperkt de overshoot flink.

Later ben ik een aan/uit regeling gaan maken voor de vergisting (Tcontrol met Tcontrol-IO) en hier is het ook goed mogelijk om mee te maischen. Het hoeft allemaal niet zo spannend om gecontroleerd en reproduceerbaar te maischen. De beschrijving van deze aan/uit regeling is te vinden in de handleiding van Tcontrol.

Het is overigens voor veel mensen leuk om zelf een sturing te maken en laat je daar zeker niet van weerhouden door mij.

koffie

Citaat van: pipsie op 06-12-2015  10:02 uIk heb dit inderdaad even bekeken en ik wil je wijzen op deze opmerking van de ontwikkelaar van de PIDAutotune functie:De kans is groot dat de autotune functie dus niet praktisch zal blijken voor een proces dat zeer langzaam verloopt (opwarmen van grotere hoeveelheden water).
Want de tijd om een aantal keer (tussen 3en10) een groote 'zwaai' aan de uitgang te produceren (bv +- 10°C) zal vrij lang zijn.
En ik vrees dat je voor een goede PID regeling ook rekening zal moeten houden met de hoeveelheid water, 10L tov 30L zou wel eens andere gain parameters kunnen opleveren (maar dit ben ik niet zeker).

Ik hou dit topic zeker in het oog want ik ben benieuwd hoe moeilijk/makkelijk het tunen van de PID in praktijk zal zijn  :)
Dat is mijn ervaring met de PID voor arduino ook. Schitterend goed op 1 temp te blijven, maar veel te terughoudend om even gas op de plank te geven tussen 2 maischstappen.
Ik overweg om de PID uit te sluiten bij alles wat meer dan x graden verschil is - sowieso al gedaan voor het koken.

hansHalberstadt

Citaat van: Henielma op 06-12-2015  10:18 uLater ben ik een aan/uit regeling gaan maken voor de vergisting (Tcontrol met Tcontrol-IO) en hier is het ook goed mogelijk om mee te maischen. Het hoeft allemaal niet zo spannend om gecontroleerd en reproduceerbaar te maischen.

Ik gebruik voor het maischen ook een aan /uit regeling met een kleine verfijning. Als input voor de aan/uit vergelijker gebruik ik niet direct de temperatuur, maar de temperatuur + een constante x de afgeleide van de temperatuur. De afgeleide (gedifferentieerde) is dan een maat voor hoever te gemeten temperatuur feitelijk naijlt op de werkelijke temperatuur. Als je die constante goed afstemt op je maischketel dan is de overshoot vrijwel 0 omdat gat gas al uitgaat terwijl de temperatuur nog aan het stijgen is en nog onder de gewenste temperatuur zit. Deze besturing werkt al meer dan 25 jaar naar behoren. Zie hieronder een essentieel stukje code in pascal.

a1,a2 zijn calibratiewaardes voor de sensor, waarde is de digitale AD waarde. temp is de temperatuur, dtempdt is de afgeleide temperatuur (moving average filtert de storing uit)
met daarbij een clamp op +3 en -0.2 ºC 

const K =60;

 temp:=temperatuur(a1,b1,waarde);
 dtempdt:=0.99*dtempdt+0.01*((temp-oudetemp)/(tijd(dag,intern)-oudetijd));
 if dtempdt*60 > 3 then dtempdt:=3/60;
 if dtempdt*60 < -0.2 then dtempdt:=-0.2/60;

procedure tempregelen(var regeltijdstip :real);
begin
if (temp+K*dtempdt)<setpoint then
if totaaltijd-regeltijdstip>10 then
begin gasaan(aan);regeltijdstip:=tijd(dag,intern)-starttijd; end;

if (temp+K*dtempdt)>setpoint then
if totaaltijd-regeltijdstip>10 then
begin gasuit(aan);regeltijdstip:=tijd(dag,intern)-starttijd; end;
end;

pipsie

Zoals bovenstaande reacties aantonen en ik zelf al vermoedde is het afregelen van de PID vaak iets moeilijker dan een autotune-functie laten lopen (maar ik wil je zeker niet weerhouden om zelf te experimenteren en proberen).
Als je graag met een PID controller wil werken en interesse hebt in de/het techniek/afregelproces zou ik de controller zelf afregelen.
Het kan je een goed inzicht geven in de PID controller zelf, en volgens mij een grote voldoening geven als je het geheel afgeregeld krijgt :)

Je hebt een vrij eenvoudig proces dat niet kan oscilleren en vrij traag verloopt en dit zorgt ervoor dat de berekeningen zeer eenvoudige worden.
Via een stapresponsie zal je zelf relatief makkelijk de parameters kunnen bepalen.
Onderstaande link legt (volgens mij) zeer goed uit hoe je dit doet, en het is dan ook nog eens geschreven voor de toepassing die je zelf voor ogen hebt (bier brouwen).
http://www.vandelogt.nl/nl_regelen_pid.php#PID3

Biertje1985

Ook een PID kan je snel maken, dat de load pas minder wordt wanneer setpoint bijna bereikt is. Het is een kwestie van afstellen. Je kan bij een langzaam proces als verwarmen de PID agressief afstellen om een zo hoog mogelijke snelheid te krijgen.

Tags:

Zoeken met Google op deze site.
Brouwspullen zijn ook te koop via Bol.com.
Als je iets bestelt bij Bol.com (ook andere zaken dan brouwspullen) via deze link steun je het forum.


Het boek van de beheerder van deze site.