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