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
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.
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.
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.
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.
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!