Forum: Analoge Elektronik und Schaltungstechnik Motor-Drehzahlregelung


von Makelleli (Gast)


Lesenswert?

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?

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


Lesenswert?

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.

von Makkeleli (Gast)


Lesenswert?

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

von Helmut L. (helmi1)


Lesenswert?

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.

von Makkeleli (Gast)


Lesenswert?

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.

von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

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.

von Makkeleli (Gast)


Lesenswert?

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.

von Makkeleli (Gast)


Lesenswert?

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.

von MaWin (Gast)


Lesenswert?

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

von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

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.

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


Lesenswert?

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.

von Makkeleli (Gast)


Lesenswert?

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.

von Makkeleli (Gast)


Lesenswert?

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?

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


Lesenswert?

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.

von Makkeleli (Gast)


Lesenswert?

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.

von Helmut L. (helmi1)


Lesenswert?

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.

von Helmut L. (helmi1)


Lesenswert?

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.

von MaWin (Gast)


Lesenswert?

> 3 PI Regelungen. Schon heavy meiner Meinung nach.

Kaum.

Davon schafft der 30000, wenn man ordentlich programmiert.

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.