Forum: Mikrocontroller und Digitale Elektronik PID Regler Code für Relaisansteuerung


von Anfänger (Gast)


Angehängte Dateien:

Lesenswert?

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

von THOR (Gast)


Lesenswert?

Auf roboternetz gibts das alles fertig.

von Frank K. (fchk)


Lesenswert?

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

von Bastian W. (jackfrost)


Lesenswert?

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

von THOR (Gast)


Lesenswert?

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.

von aSma>> (Gast)


Lesenswert?

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.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

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

von Anfänger (Gast)


Lesenswert?

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

von Matt (Gast)


Lesenswert?

Hast du für den I-Teil ein Anti-Windup gemacht?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Anfänger (Gast)


Angehängte Dateien:

Lesenswert?

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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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
von Stefan F. (Gast)


Lesenswert?

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.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

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

von Anfänger (Gast)


Lesenswert?

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?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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
von Anfänger (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.