Forum: Mikrocontroller und Digitale Elektronik ATMega32: mit PID-Regler PWM ansteuern


von Martin L. (sbond)



Lesenswert?

Hi Leute,

Ich hätte da mal eine Frage und hoffe, dass ihr mir eventuell einen Tipp 
geben könnt. Folgendes: Ich habe in einer Simulation einen einfachen 
Schaltregler gebaut und ihn mit Hilfe eines PID-Reglers etwas optimiert.
Der Widerstand R1 ist die Last und kann auch problemlos variabel sein. 
Der PID-Regler macht was er soll und die Spannung wird von 12V auf 
konstante 5V gehalten.

Nun war meine Überlegung, wie ich dies in C auf einem Mikrocontroller 
umsetze. Das einlesen der Werte und auch die Programmierung des 
PID-Reglers sollte keine Probleme verursachen.

Mein Problem liegt in der berechneten Stellgröße y. Ich würde z.B. einen 
digitalen Pin als Ausgang benutzen und gewissermaßen ein PWM generieren 
um den MOSFET anzusteuern. Ich habe aber nicht die geringste Ahnung was 
ich da machen müsste oder ab welcher Stellgröße ich den Ausgang auf HIGH 
setze.


Um es vorne herein zu sagen, ich habe es bis jetzt noch nicht 
programmiert und bin auch nicht in der Lage es hier schnell zu erproben. 
Es ist jetzt also kein praktisches Problem, sondern eine Überlegung von 
mir bei der ich nicht weiter komme ^^


ich danke für jede Hilfe

von Christian B. (chbalnuweit)


Lesenswert?

Du berechnest aus deinem Reglerausgang den Duty-Cycle für dein PWM und 
schreibst den Duty-Cycle in das Register welches für dein Hardware PWM 
vorgesehen ist.

Wie du Timer und PWM mit dem Atmega zum laufen bekommst steht im 
AVR-GCC-Tutorial.

Viele Grüße Christian

von Martin L. (sbond)


Lesenswert?

Ich weiß schon was du meinst, aber ich bin mir nicht sicher wie ich den 
Duty-Cycle berechnen soll. Ich kann ja wahrscheinlich nur positive 
Stellgrößen auswerten.

Bzw. gibt es Richtlinien, wie den Duty-Cycle richtig skaliere? (Also ich 
muss ja eine Art y_max definieren)

wirft Hirn auf mich :D

von Karl H. (kbuchegg)


Lesenswert?

Martin L. schrieb:
> Ich weiß schon was du meinst, aber ich bin mir nicht sicher wie ich den
> Duty-Cycle berechnen soll.

Ist eigentlich recht einfach.
Denn ein Duty Cycle ist dem Prinzip nach einfach nur eine Prozentzahl.
0% bedeutet alles aus
100% bedeutet komplett ein.

Das man diese Prozentzahl aufgrund technischer Gegebenheiten dann noch 
in eine andere Zahl verwandelt, weil die PWM anstelle von 0 bis 100 nun 
mal beispielsweise bei einer 8-Bit PWM Werte von 0 bis 255 haben will, 
ist eine andere Geschichte. Konzeptionell sind das einfach nur 
Prozentzahlen.

> Bzw. gibt es Richtlinien, wie den Duty-Cycle richtig skaliere? (Also ich
> muss ja eine Art y_max definieren)

weniger als 0% geht nicht, den 'weniger aus' als aus kann etwas nicht 
sein.
mehr als 100% geht nicht, denn 'mehr ein' als 'komplett ein' geht nun 
mal auch nicht.

Das Gaspedal deines Autos kann entweder komplett Nicht-gedrückt sein 
(0%) oder es ist komplett durchgedrückt (100%) oder es ist in 
irgendeiner Stellung dazwischen. Aber weniger als 0 und mehr als 100 
kann nicht sein. Ob du dann diese Prozent als Millimeter reingedrückter 
Weg beim einstellen des Gaspedals ausdrückst oder als Winkel um den das 
Pedal reingedrückt wurde, ist zweitrangig. Erst mal hast du eine 
Gasstellung die sich zwischen 0% und 100% bewegt. Und genau das spuckt 
dann auch der PID Regler aus, der die Geschwindigkeit konstant halten 
soll. Verringert sich die Geschwindigkeit, dann gibt er mehr Gas und 
erhöht den Gaswert von 23% auf 25%, egal wie das dann technisch 
umgesetzt wird. Liegt die tatsächliche Geschwindigkeit über dem Soll, 
dann verringert sich der Gaswert von 25% auf 23%, wieder: egal ob das 
dann noch in Millimeter oder Grad oder was auch immer umgemünzt wird. 
Das interessiert den PID Regler nicht. Für ihn existert einfach nur ein 
Stellglied, das er von 0% bis 100% einstellen kann und welches aufgrund 
dieser Einstellung etwas mit der Ausgangsgröße macht.

Der Rest ist dann: Abstimmung der Konstanten im Regler, so dass der 
Regler zwar schnell ausregelt aber auch noch nicht ins Schwingen kommt.

von Martin L. (sbond)


Lesenswert?

Dann habe ich es mir wirklich zu schwer gemacht. ^^   ..man bin ich 
blöd.
Das ist ja wirklich die einfachste Methode.

Klar wenn y=0 dann PWM = 0  und wenn y >= 1 dann PWM = 255. Und eine 
Schrittweite von ca. 0,004 ist wahrscheinlich ausreichend.

Bin schon fast schockiert, dass ich nicht selber darauf gekommen bin. 
...zumal ich so oft etwas mit PWM mache.

Zeit für ein Bier :D



vielen Dank nochmal für eure Hilfe. Jetzt muss ich mich doch nicht mehr 
in den Schlaf weinen :D


lg
SBond

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.