PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PID Regler - Hilfe! Atmega8



bexter
13.07.2011, 17:12
Habe ein Problem, und hoffe Ihr könnt helfen!
Ich habe einen Roboter mit 2 gehackten Servos (1-2ms Pulse von rückwärts vollgas - vorwärts vollgas)
Dazu Radencoder mit 72 Inpulsen pro Umdrehung. 1 Rad-Umdrehung benötigt etwa 1 sek..
(das Rad hat 89mm also ca. 28cm Durchmesser) = 3,88mm pro click

So ich habe schon eine PWM für die Geschwindigkeit implementiert Mit Timer0 ovflw
Der Wert 51= stillstand
Der Wert 66= vollgas vorwärts
Der Wert 36= vollgas rückwärts

So jetzt möchte ich eine PID-Regelung. Wie mach ich das?
Die Encoder liefern auf INT0 und INT1 Interrupts.
Hab jetzt den Timer1 auf 1ms gestellt, und zähle bei überlauf einen Zähler hoch.
Kommt z.B. INT0 schaue ich wieviele 1ms vergangen sind zwischen 2 Encoder Pulsen.

Für die die bis jetzt durchgehalten haben ein Bild als Belohnung::cool:
19315

Dh. also bei Vollgas hab ich 13,56 ms zwischen 2 Encoderpulsen

Der einfachheit halber mal ein PD Regler betrachtet:

Sagen wir ich gebe Soll(zwischen 2 Pulsen) = 10ms vor.

Am Anfang hab ich 0ms zwischen 2 Pulsen. D.h

t0:
Error = 10ms-0ms = 10ms

P= 10ms(Error) * Verstärkung Kp(z.B.2x) = 20
D= 0 (Error alt) - 10 (Error neu) / 10ms(oder wie??) = -10 (oder -1?) * Verstärkung Kd(z.b. 1x) = -10 (oder -1)

PD= 20 + -10 = 10 (Stellgrösse)
(oder) PD = 20 + -1 = 19 (Stellgrösse)

t1:
Error = 10ms-5ms(angenommen)

P= 5ms(Error) * Verstärkung Kp(z.b.2x) = 10
D= 10ms(Error alt) - 5ms (Error neu) / 10ms(<-stimmt das?) = 5 (oder 0,5)

PD= 10 + 5 = 15?
(oder PD = 10 + -0,5 = 9,5)

Kenn mich nimmer aus lol...
Und was mach ich dann mit der Stellgrösse?

LG Alex

oberallgeier
13.07.2011, 17:34
Hi Alex
... Problem ... PID-Regelung. Wie mach ich das? ...Schau doch mal in das Wiki zu Regelungstechnik, dort gibts nen Abschnitt zum digitalen Regler. (http://www.rn-wissen.de/index.php/Regelungstechnik#Realisierung_mit_digitalem_Regler ) Eigentlich könnte man den gesamte Artikel durcharbeiten, aber das ist VIEL und ziemlich TROCKEN.

Ich habe das durchgeackert, zu meinem Vorgehen steht hier ein bisschen was (klick). (https://www.roboternetz.de/community/showthread.php?37518-Linie-Folgen&p=357670&viewfull=1#post357670) So ziemlich meine gesamte Arbeit zum PID-Regler meiner beiden gehackten Servos (Hackmethode 2 = gesamte Elektronik raus) steht hier - (https://www.roboternetz.de/community/showthread.php?36121-Autonom-in-kleinen-Dosen-R2_D03-Nachfolger-R3D01&p=402546&viewfull=1#post402546) ein bisschen davor und ein bisschen danach. Da steht auch mein Regelungscode in C. Hoffentlich hilfts erstmal. Wenn Du speziellere Fragen hast, melde Dich halt wieder.

Viel Erfolg und - - viel Geduld.

bexter
13.07.2011, 17:45
Danke den RN-Wiki hab ich schon durchgeackert, aber da Hilft warscheinlich nur vieeel Kaffee... ;)
Ich hab die Servoelektronik beibehalten aber aus dem Servo rausverlegt, wegen der Encoder.
Das sieht man hier:
19316
Ich brauch wahrscheinlich wen, der das mal mit mir durchrechnet *lol*

Dass ich in Assembler programmier macht die Sache nicht einfacher...

oberallgeier
13.07.2011, 18:02
Die "Wurzel allen Übels" ist die Sprungantwort. Sprich: schau mal, ob Du messen kannst, wie bei Dir das Fahrzeug beschleunigt, wenn Du von 0 auf vollePWM schaltest. Ich habe das hier gezeigt (https://www.roboternetz.de/community/showthread.php?36121-Autonom-in-kleinen-Dosen-R2_D03-Nachfolger-R3D01&p=404730&viewfull=1#post404730) - das war mein Anfang. Später ging das deutlich besser (klick). (https://www.roboternetz.de/community/showthread.php?36121-Autonom-in-kleinen-Dosen-R2_D03-Nachfolger-R3D01&p=427784&viewfull=1#post427784) Hatte statt eines m168 einen m328 genommen - und damit viel Platz geschaffen für online-Messung und offline-Datenausgabe.

Die Daten wurden "offline" - also nach der Testfahrt, über die UART ausgegeben und in der Tabellenkalkulation in Diagramme übersetzt - und ausgewertet.

Au au - Assembler ist wahrscheinlich wirklich exotisch. Da rate ich dringend dazu, ein bisschen C zu lernen (oder so).

seite5
15.07.2011, 22:07
hi,

Den D-Anteil würde ich erstmal beiseite legen, der spielt nur dann eine Rolle, wenn Du innerhalb von einigen wenigen Grad der Umdrehung die Drehzahl stabil halten willst. Dazu
bräuchtest Du dann allerdings eine wesentlich höhere "Auflösung" Deines Gebersignals.
P-Anteil bedeutet die sofortige Reaktion auf eine Abweichung, führt, wenn zu gross zum Schwingen. Also Stellwert = kP*(Alt-Neu), kP sollte klein sein.
Wichtig: I-Anteil, "sorgt" langfristig für hohe Regelgenauigkeit. Dazu würde ich "gleitend" immer eine bestimmte Anzahl von Messwerten aufsummieren, d.h, in einem array die
letzten 10...100 (werte - sollwert) (signed nicht unsigned) aufheben, daraus die Summe s bilden, Stellwert ist dann PWert+kI*s.

mfg

achim

RP6conrad
15.07.2011, 22:35
Eine servo ist nicht ideal zum P-Regelung. Das nullpunkt ist sehr sensibel, und das Regelbereich relatif eng. Dabei haben sie auch nur ein encoder pro Rad, damit konnen sie nicht die Drehrichtung erfassen. Aber ihre Gedanke sind richtig : Error = Ist_geschwindigkeit - Soll_geschwindigkeit. Bei ihre Robby wird der geschwindigkeit in ms zwischen zwei encodertics ausgedruckt. Das ist eigentlich das inverse von Abstand/Zeit.
Stellgrosse = P_factor * Error. Leiter hat jetzt diesen Error keine Richtung !! Oder Forwarts, oder Ruckwarts fahrt, ihre Error ist immer positif. Damit kan auch in falsche Richting geregelt werden und ist ihre Regelung instabil. Das gleiche gult auch für I und D Anteil.
Mogliche Alternative : Rund das Nullpunkt von PWM nur Steuern, nicht Regelen. Ab eine bestimmte Geschwindigkeit, kan dan eine PID Regelung actif werden.