Hallo, ich suche Programmcode für einen PID Regler in C für Relaisansteuerung. Vielleicht hat ja jemand was passendes? Ich habe einen DS 1820B zur Tempearatur messung und steuere ein Relais an mit einer Heizspirale. Im Moment halt einfaches Ein-Aus schalten wenn die Temperatur erreicht ist. Solltemperatur gebe ich von außen über serrielle Schnittstelle vor. Jetzt ist allerdings beim "Hochfahren" auf die Solltemperatur ein riesiger Überschwinger dabei und die Temperatur schwankt gewaltig. Darum würd ich gerne einen PID Regler einsetzen. Grüße Anfänger
Lies das: http://brettbeauregard.com/blog/2011/04/improving-the-beginners-pid-introduction/ und zwar komplett. Dann weißt Du auch, was Du da machst. fchk
Für Relais ist der Unterschied nur das das stetige Signal in eine PWM mit niedriger Frequenz umgewandelt wird. Bei der Frequenz musst du den Spagat zwischen Lebebsdauer des Relais und Regelgüte finden. Oder du nutz das Relaus zum sicheren Trennen und regelst mit einem SSR. Gruß JackFrost
Bastian W. schrieb: > Für Relais ist der Unterschied nur das das stetige Signal in eine > PWM > mit niedriger Frequenz umgewandelt wird. Bei der Frequenz musst du den > Spagat zwischen Lebebsdauer des Relais und Regelgüte finden. Ja, oder man machts etwas schlauer und rechnet den PID Ausgangswert wieder in nen binären Schwellwert um. Das ist dann wieder ein Zweipunktregler, aber einer der Kenntnis der Regelstrecke hat.
Servus, erstelle in den Arbeitspunkt deine Streckenparameter. Dann sollte es mittels einer Simulation möglich sein einen passenden Regler zu bestimmen. Bei deinen jetztigen Regler hast du ein deutliches Überschwingen. PS: Ein Graph ohne korrekte Achsenbeschriftung ist fürn Arsch.
Hi Je nachdem, wofür Das ist und wo's verbaut ist/werden soll - auf eBay gibt's PID-Regler für kleines Geld, teilweise nebst SSR (aka für Härte Ofen o.Ä.). Bis 400°C quasi nachgeschmissen, über 1000°C etwas teurer (wobei die Regler identisch aussehen). MfG
Guten Morgen, danke schön für die vielen Anregungen, war aber bisher leider nocht nicht so das richtige für mich, da ich da so manche Sachen nicht verstanden habe. Es ist halt so, ich bin a weng älter und will mich da rein arbeiten, deswegen stelle ich halt Fragen die für andere keine sind. Es handelt sich auch nicht um ein "Industrie" Projekt ich mach das für mich zum lernen. Grüße
Anfänger schrieb: > Es handelt sich auch nicht um ein "Industrie" Projekt ich mach das für > mich zum lernen. Sage uns doch mal, mit welcher Leistung deine Heizung arbeitet. Ab etwa 400-500 W solltest du auf jeden Fall auf ein SSR mit Nulldurchgangsdetektor umsteigen, denn ein Relais schaltet 'irgendwann' und muss dadurch u.U. auch bei höchster Amplitude der Wechselspannung einschalten, was für den Kontaktsatz nicht besonders gut ist. Mit einem SSR hingegen hast du die Möglichkeit der Wellenpaketsteuerung und vermeidest auch noch Störungen auf dem Netz, weil das immer sauber im Nulldurchgang ein- und auch wieder ausschaltet. Das kann z.B. mit einer langsamen PWM geschehen, die mit den 50Hz des Netzes getaktet wird. Wenn das gelöst ist, implementierst du in deinen Steuerrechner einen PID Regler (z.B. AVR221) und exponierst die Parameter so, das du sie im Betrieb einstellen kannst. Da du allerdings nicht schreibst, was für ein Rechnerchen deine Heizung steuert, sind die AVR Sachen nur Vorschläge.
Hallo, ich glaube Ihr überschätzt meinen bisherigen Programmcode und meinen Aufbau. Code: if (temperature >= temperatureSoll) { PORTC.OUT = 0; } else { PORTC.OUT =0xFF; } Das ganze ist nur für mich als Wiedereinstieg gedacht. Hardware Conrad Relais und http://www.chip45.com/products/crumbx128a1_avr_xmega_modul_board_atxmega128a1_usb_rs485_sd-karte.php Grüße
Anfänger schrieb: > Das ganze ist nur für mich als Wiedereinstieg gedacht. > > Hardware Conrad Relais und > > http://www.chip45.com/products/crumbx128a1_avr_xmega_modul_board_atxmega128a1_usb_rs485_sd-karte.php Ist doch gar nicht schlecht. Der kleine XMega ist doch prima, um da ein SSR anzuschliessen und dann mit ADC und PWM zu experimentieren - darum gehts dir doch. Bastel doch erst mal eine Routine, die dir die Heizung mit PWM steuert. Also mit z.B. 255 als Eingang die Heizung durchgehend anschaltet, mit einem Wert von 128 ein 1:1 Taktverhältnis von Ein und Aus macht und bei Input 0 die Heizung ganz ausschaltet. Das kann eine gaaanz langsame PWM sein mit z.B. 0,2 Hz Wiederholrate (da 256 / 50 Hz ~ 0,2Hz). Dafür taktest du einen Timer einfach mit etwa 50Hz, programmierst ihn auf PWM und setzt das entsprechende CCx Register.
:
Bearbeitet durch User
Schön daß du den Verlauf der Temperatur gemessen hast. Du solltest in diesem Diagramm aber auch anzeigen, wann die Heizung ein- und ausgeschaltet war. Worauf ich hinaus will: Wenn die Heizung abschaltet, strahlen die Heizkörper noch weiter Wärme ab. Das könnte bereits die Ursache für die Überschwinger sein. Abhilfe schafft in diesem Fall, die Heizleistung (Vorlauftemperatur) zu reduzieren. Bedenke auch, daß die Luft im Raum sehr schnell erwärmt werden kann, aber die kalten Wände und Einrichtungsgegenstände brauchen viel länger, um auf Wunschtemperatur gebracht zu werden. Dies provoziert auch Schwingungen. Ich hatte mal (als ich noch Ahnungslos war) ein Raumthermostat gebaut, daß möglichst schnell die Luft-temperatur erfassen sollte. Der Fühler befand sich "nackt" an einer Stelle, wo immer viel Luft zirkuliert (ich hatte extra diese Stelle gesucht) und er hatte nur 0,1°C Hysterese. Das Resultat war, daß die Raumtemperatur ständig um satte 5°C auf und ab schwankte. Danach hatte ich den Sensor in das Gehäuse eingebaut, mit Lüftungs-Schlitzen natürlich und die Hysterese auf 1°C erhöht. Seit dem hat der Raum ein angenehmes Klima. Also bitte nicht so:
1 | if (temperature >= temperatureSoll) |
2 | {
|
3 | PORTC.OUT = 0; |
4 | }
|
5 | else
|
6 | {
|
7 | PORTC.OUT =0xFF; |
8 | }
|
Denn das würde einer Hysterese von 0,0°C entsprechen. Schalte ein, wenn der Raum 0,5° Grad unter der Soll-Temepratur ist. Schalte aus, wenn die SOll-Temperatur um 0,5°C überschritten wurde. Dazwischen hast du eine Spanne von 1°C, wo nicht umgeschaltet wird.
Hi Nur so nebenbei: Warum schaltest Du das ganze Port auf High/Low? Da reicht eigentlich der eine Pin, Der wirklich dafür benutzt wird, oder? MfG
Patrick J. schrieb: > Hi > > Nur so nebenbei: Warum schaltest Du das ganze Port auf High/Low? > Da reicht eigentlich der eine Pin, Der wirklich dafür benutzt wird, > oder? > > MfG Und wie würdest Du es machen?
Anfänger schrieb: >> Nur so nebenbei: Warum schaltest Du das ganze Port auf High/Low? >> Da reicht eigentlich der eine Pin, Der wirklich dafür benutzt wird, >> oder? >> >> MfG > > Und wie würdest Du es machen? Dafür hat der XMega z.B. die OUTSET und OUTCLR Register an jedem Port. Also z.B.
1 | // Heizungsausgang ist hier PORTC Bit 0
|
2 | #define HEIZUNG PIN0_bm
|
3 | // atomic
|
4 | PORTC.OUTSET = HEIZUNG; // schaltet Heizung auf high |
5 | PORTC.OUTCLR = HEIZUNG; // schaltet Heizung auf low |
6 | // es geht aber auch klassisch
|
7 | // read-modify-write
|
8 | PORTC.OUT |= HEIZUNG; // Heizung high |
9 | PORTC.OUT &= ~(HEIZUNG); // Heizung low |
:
Bearbeitet durch User
Matthias S. schrieb: > Anfänger schrieb: >>> Nur so nebenbei: Warum schaltest Du das ganze Port auf High/Low? >>> Da reicht eigentlich der eine Pin, Der wirklich dafür benutzt wird, >>> oder? >>> >>> MfG >> >> Und wie würdest Du es machen? > > Dafür hat der XMega z.B. die OUTSET und OUTCLR Register an jedem Port. > Also z.B.// Heizungsausgang ist hier PORTC Bit 0 > #define HEIZUNG PIN0_bm > // atomic > PORTC.OUTSET = HEIZUNG; // schaltet Heizung auf high > PORTC.OUTCLR = HEIZUNG; // schaltet Heizung auf low > // es geht aber auch klassisch > // read-modify-write > PORTC.OUT |= HEIZUNG; // Heizung high > PORTC.OUT &= ~(HEIZUNG); // Heizung low Super! Danke schön!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.