Hallo liebe Comm.
Ich möchte mal aus spaß halber einen GLeichstrommotor mit einem
Mikrocontroller auf seine Drehzahl regeln, welche bei geringen
Abweichungen der Belastung gleich bleiben soll. Das ganze wird einmal
ein Fahrroboter zur Erfassung von Funkdaten. Dafür muss der Roboter
fähig sein gerade zu fahren, was nur mit einem Regler funktioniert. Ich
stelle mir hier einen einfachen PI Regler vor, wobei anfangs nur der P
Regler aufgedreht wird.
Ich verwende den Mikrocontroller Atmega644 dafür. D.h. ich werde
vermutlich die PWM für die Regelung nutzen.
Ich habe einen Reflexkoppler als Drehzahlmesser beider Motoren am
zweiten Ende der Motorwellse so angeordnet, dass ich die Drehzahl
digital erfassen kann.
Mein Problem ist jetzt die Überlegung wie ich die Regelung anstellen.
Ich habe mir überlegt diese analog aufzubauen. D.h. ich schalte einen RC
Tiefpass nach den PWM Signalen. Somit habe ich ein ANaloges Signal aus
dem digitalem gewonnen. Dieses signal führe ich jetzt auf einen OPV
PI-Regler und der Ausgang geht über einen Klasse AB Verstärkerstufe auf
den Motor. Der Refelxkoppler liefert mir ein Rechtecksignal, welches die
momentane Geschwindigkeit des Motors liefert. Diese wandle ich auch
durch einen RC Tiefpass in ein analoges SIgnal. Jetzt habe ich ein
Sollwert und ein Istwert. Ist nur noch die Frage wie ich diese zwei
Werte in Verbindung bringe.
Was sagt ihr dazu?
AVR 221 beschreibt einen PID Regler in C , vermutlich interessante
Lektüre.
Makelleli schrieb:> Ich habe mir überlegt diese analog aufzubauen. D.h. ich schalte einen RC> Tiefpass nach den PWM Signalen.
Aber warum denn das ? Steuere den Motor direkt mit der PWM an, das spart
Energie und ermöglicht simpelste Endstufen .Ausserdem läuft der Motor
dann besser an.
Makelleli schrieb:> Der Refelxkoppler liefert mir ein Rechtecksignal, welches die> momentane Geschwindigkeit des Motors liefert. Diese wandle ich auch> durch einen RC Tiefpass in ein analoges SIgnal.
Erscheint mir auch überflüssig. Schick den Reflexkoppler an einen
Interrupt und messe die Zeit zwischen zwei Pulsen. Je kürzer die Zeit,
desto schneller ist der Motor. Wenn du einen 16-bit Timer nimmst, ist
65536 - TCNT proportional zur Drehzahl.
Damit hast du deinen Ist-Wert und kannst per PID das PWM zum Motor
regeln.
Matthias Sch. schrieb:> Erscheint mir auch überflüssig. Schick den Reflexkoppler an einen> Interrupt und messe die Zeit zwischen zwei Pulsen. Je kürzer die Zeit,> desto schneller ist der Motor. Wenn du einen 16-bit Timer nimmst, ist> 65536 - TCNT proportional zur Drehzahl.> Damit hast du deinen Ist-Wert und kannst per PID das PWM zum Motor> regeln.
Das Problem ist, dass es mich zu viel Zeit kosten könnte. ALlein wenn
ich bedenke, dass der Roboter Gegenständen ausweichen muss. Jetzt müsste
er nämlich 2 Motoren Regeln un gleichzeitig Sensoren messen und Werte
berechnen.
Deswegen die Idee mit dem externen analogen System, welches keine
zusätzlichen Totzeiten in meine Hauptschleife bringen soll.
Eine weitere Idee von mir ist die Regelung über einen 2ten oder gar 2
weitere Mikrokontroller zu machen. Dann müsste ich aber einen DAC und
ADC vornehmen, das könnte mich wieder Totzeiten kosten. Hmm, ist die
Frage was dann die bessere Lösung ist...
Makkeleli schrieb:> Jetzt müsste> er nämlich 2 Motoren Regeln un gleichzeitig Sensoren messen und Werte> berechnen.> Deswegen die Idee mit dem externen analogen System, welches keine> zusätzlichen Totzeiten in meine Hauptschleife bringen soll.
Wie so bringt die Drehzahlmessung mittels Captureeinheit eine Totzeit
ins Programm? Das läuft doch fast alles in der Hardware ab. Und das
bisschen PI-Regler macht der AVR nebenbei mit links.
Helmut Lenzen schrieb:> Wie so bringt die Drehzahlmessung mittels Captureeinheit eine Totzeit> ins Programm? Das läuft doch fast alles in der Hardware ab. Und das> bisschen PI-Regler macht der AVR nebenbei mit links.
Ich habe bei meinem alten Linefollower welcher eine Zykluszeit von 700
us hatte diese auf 120 us verbessert und dies machte schon große
Unterschiede. Noch dazu benutzte ich einen reinen P-Regler mit Kp = 1,
also vom Rechnen war da nicht die Rede. Allein eine Subtraktion und eine
Division + 8 * ADC einlesen brachten das Fahrzeug zum entweichen von der
Linie, da zu großes Schwingen auftrat, bzw der Roboter nicht mit dem
Messen nachkam (Schnelligkeit überdimensioniert).
Weiters habe ich im Mega644 nur eine ICP.
Außerdem müsste ich in einem COntroller 3 Regelungen auf einmal
erledigen, das bedeutet 3 mal PID Berechnung. Das ist schon Aufwendig,
würde ich sagen.
Makelleli schrieb:> (...) ich schalte einen RC> Tiefpass nach den PWM Signalen. Somit habe ich ein ANaloges Signal aus> dem digitalem gewonnen. Dieses signal führe ich jetzt auf einen OPV> PI-Regler und der Ausgang geht über einen Klasse AB Verstärkerstufe auf> den Motor. Der Refelxkoppler liefert mir ein Rechtecksignal, welches die> momentane Geschwindigkeit des Motors liefert. Diese wandle ich auch> durch einen RC Tiefpass in ein analoges SIgnal. Jetzt habe ich ein> Sollwert und ein Istwert. Ist nur noch die Frage wie ich diese zwei> Werte in Verbindung bringe.
Das hört sich m.E. zu kompliziert an. Wieso willst Du die
Klemmenspannung des Motors messen? Wenn der Strom nicht lückt, ist diese
recht gut proportional zum Tastverhältnis. Der Controller kennt die
Spannung also bereits.
Wenn Du die tatsächliche Ist-Drehzahl misst, dann kannst Du doch auch
einen echten Regler aufbauen?
Es geht aber auch noch eleganter. Ich würde in einem ersten Schritt auf
die Drehzahlmessung verzichten und stattdessen den Motorstrom messen.
Dieser ist in guter Näherung proportional zum Lastdrehmoment. Aus der
Motorkennlinie (siehe meine Antwort auf Dein anderes Posting) kannst Du
nun ermitteln, um wieviel Deine Drehzahl bei welchem LAstmoment bzw. bei
welchem Motorstrom absinkt. Entsprechend erhöhst Du die Motorspannung
(bzw. das Tastverhältnis).
Das Verfahren nennt sich R-I-Kompensation. Physikalisch steckt dahinter,
dass der Motor einen ohmschen Ankerwiderstand besitzt. An diesem fällt
Spannung ab, sobald ein Ankerstrom fließt. Und genau diese Spannung
fehlt dem Motor worauf die Drehzahl absinkt.
Nun die Preisfrage: Wie würdest Du aus der Motorkennlinie den
Ankerwiderstand berechnen?
Grüßle aus Stuttgart,
Volker.
Volker Bosch schrieb:> Nun die Preisfrage: Wie würdest Du aus der Motorkennlinie den> Ankerwiderstand berechnen?
Hmm, der Ankerwiderstand ändert sich ja nicht. Ich denke, dass das der
Terminal Resistance im Datenblatt ist (30 Ohm).
Ansonsten würde ich von meine Klemmenspannung bzw PWM die resultierende
Spannung von der Kennlinie, die ich über das Lastmoment und der Drehzahl
ermittelt habe, abziehen und mit dem ohmschen Gesetz den Widerstand
ermitteln.
Oder nein, doch nicht, das würde nicht funktionieren, da ja dann
vorausgesetzt ist, dass ich eine Drehzahl einer bestimmten Spannung
zuordnen kann, was ich aber nicht kann.
Es müsste aber über den Wirkungsgrad gehen. Ich rechne mir die momentan
abgegebene el. Leistung mit Strom Spannungs-Messung (Spannung kenne ich
schon, PWM) und ziehe dann die abgegebene Leistung an der Welle (weiß
ich durch den wirkungsgrad) ab und schon habe ich Leistung und Strom und
kann mir den Ranker ausrechnen.
> Ich habe mir überlegt diese analog aufzubauen.
Wozu ?
Deine Motoren, und vor allem dr ganze Robot, sind um Grössenordnungen
träger als dein Microcontroller die Regelung quasi nebenbei digital per
direkter PWM erledigen kann.
Das ist doch keine DVD-Laser-Spurverfolgung.
Makkeleli schrieb:> Hmm, der Ankerwiderstand ändert sich ja nicht. Ich denke, dass das der> Terminal Resistance im Datenblatt ist (30 Ohm).
Prinzipiell ja. Das wäre der ohmsche Ankerwiderstand. Was uns hier aber
interessiert ist der wirksame Ankerwiderstand, in welchen auch noch die
Verluste der Kommutierung einfließen.
Diesen kannst Du aber ganz einfach aus der Kennlinie berechnen, indem Du
die Nennspannung, also hier 12V durch den Blockierstrom, also den Strom,
der bei Drehzahl == 0 fließt, divisierst. Dazu musst Du die Kennlinie
extrapolieren. Ich würde den Blockierstrom so Pi-Mal-Auge auf 270mA
schätzen, was dann einen dynamischen Ankerwiderstand von ca. 45Ohm
ergibt (wie gesagt: er muss größer als der ohmsche Widerstand sein).
> Ansonsten würde ich von meine Klemmenspannung bzw PWM die resultierende> Spannung von der Kennlinie, die ich über das Lastmoment und der Drehzahl> ermittelt habe, abziehen und mit dem ohmschen Gesetz den Widerstand> ermitteln.
Sollte das selbe ERgebnis bringen, da alle Zusammenhänge linear sind.
Makkeleli schrieb:> Das Problem ist, dass es mich zu viel Zeit kosten könnte. ALlein wenn> ich bedenke, dass der Roboter Gegenständen ausweichen muss. Jetzt müsste> er nämlich 2 Motoren Regeln un gleichzeitig Sensoren messen und Werte> berechnen.
Aber nein, das läuft in einem Interrupt und kostet dich allerhöchstens (
in C ) 50-100 Zyklen. In Assembler mache ich das in 20-30 Zyklen. Die
Motor PWM läuft sogar ganz ohne Software Unterstützung, sodass das
Hauptprogramm sich prima um den Robbi kümmern kann und um die PI
Regelung.
Wenn der MC nicht gerade mit 128 Khz läuft, bist du da auf der sicheren
Seite.
MaWin schrieb:> Deine Motoren, und vor allem dr ganze Robot, sind um Grössenordnungen> träger als dein Microcontroller die Regelung quasi nebenbei digital per> direkter PWM erledigen kann.
Die Trägheit der Motoren ist nicht so groß wie beispielsweise RB35
Motoren. Um eine Beschleunigung von 3 m/s² und eine konstante
Geschwindigkeit von 1m/s zu erreichen muss damit wenig Über-Schwingen
und dadurch Zeitverlust jegliche Fehlquellen reduziert werden.
Wie schon gesagt habe ich schon erfahrung mit PWM Steuerung. Man sieht
bei einer Fernsteuerung bzw. bei einer digitalen Regelung einer
Spurenverfolgung zu viel Fehler da ist.
Volker Bosch schrieb:> Das Verfahren nennt sich R-I-Kompensation.
Ich habe mich jetzt in meinen Büchern nochmal umgesehen und bin auf
diese Art Regelung gestoßen. Der Nachteil davon ist halt, die
Temperaturabhängigkeit, und die Feldschwächung.
Ich habe mich entschieden bei der ersten Methode zu bleiben, und zwar
einer Drehzahlmessung direkt am Motor mit einem Reflexkoppler, denn eine
genauere Methode gibt es nicht.
Matthias Sch. schrieb:> Aber nein, das läuft in einem Interrupt und kostet dich allerhöchstens (> in C ) 50-100 Zyklen. In Assembler mache ich das in 20-30 Zyklen. Die> Motor PWM läuft sogar ganz ohne Software Unterstützung, sodass das> Hauptprogramm sich prima um den Robbi kümmern kann und um die PI> Regelung.> Wenn der MC nicht gerade mit 128 Khz läuft, bist du da auf der sicheren> Seite.
Naja, dann werde ich halt einfach 2 Platinen machen müssen bzw die
fertige dann um ampotieren müssen um herauszufinden ob das dann wirklich
hinhaut. Denn nehmen wir an ich fahre mit einem Meter pro Sekunde auf
einer Geraden Spur, und sei meine Zykluszeit 1ms, dann messe ich nach
meiner Rechnung nach jeden Millimeter einmal aus bzw habe einen
Motorwert. Das klingt zwar genügend, aber was ist bei möglichen starken
Kurven, die oft hintereinander kommen? Da kann es ja passieren, dass die
Linie schneller als 1ms wechselt und ich verfehle die Messung. Das
bedeutet für den Roboter eine volle Drehung und ab wieder zum
Startpunkt, sprich der Roboter fährt verkehrt.
Ist doch riskant oder findet ihr nicht?
Makkeleli schrieb:> schneller als 1ms wechselt
Da du dich weiterhin über die verwendete CPU bedeckt hälst, rate ich mal
einen AVR bei 8 Mhz. Der bearbeitet in 1mS ca. 8000 Zyklen und dreht bei
den paar Events einfach mal Däumchen. Wenn die Kiste mit 16 Mhz läuft
wie ein anständiger Arduino , sinds nochmal doppelt so viele.
Matthias Sch. schrieb:> Da du dich weiterhin über die verwendete CPU bedeckt hälst, rate ich mal> einen AVR bei 8 Mhz. Der bearbeitet in 1mS ca. 8000 Zyklen und dreht bei> den paar Events einfach mal Däumchen. Wenn die Kiste mit 16 Mhz läuft> wie ein anständiger Arduino , sinds nochmal doppelt so viele.
Ich verwende als controller einen Mega644 und betreibe ihn mit 20MHz.
Programmiersprache ist wahrscheinlich C, da komplexere Berechnungen
vorhanden sind. Jedoch wie schon gesagt: 3 PI Regelungen. Schon heavy
meiner Meinung nach. Außerdem brauche ich für das Ausmessen der Linie
eine Division um das Verhältnis zu bestimmen.
Deshalb meine Skepsis, und da ich schon mal in so einer Situation war
und optimieren hab müssen, noch viel mehr.
Matthias Sch. schrieb:> a du dich weiterhin über die verwendete CPU bedeckt hälst,
Die hat er schon genannt. Ist ein ATMega664.
Aber er sagt nichts zu Taktfrequenz bzw. verwendeter Programmiersprache.
Nur um mal eine Vorstellung zur Rechenleistung eines AVRs zu bekommen.
Ich lass in einem Projekt auf dem Teil mit 16MHz Takt ein Intterupt
laufen in dem ein Digitaler Hochpass,Tiefpass,Integrator RMS Berechung
mit Wurzelziehen Und Mittelwertfilter laufen und habe immer noch
Rechenleistung über. Und das mit 24 Bit Auflösung.