PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Motoranpassung PI-Regler



Kampfwurst_Hugo
11.01.2012, 23:29
Hallo

Ich hoffe ich bin hier richtig und ihr könnt mir helfen.
Es geht um die Drehzahlregelung und einer Regelschleife von Motoren.

Ich baue gerade einen Rasenmähroboter. Er soll 2 Antriebsmotoren bekommen.
Die Motoren sind mit einem Magnetischer Impulsgeber (http://www.dunkermotoren.de/data/technical_data/servocomponents/pdf/90130_MG-ME_Seite%2061.pdf#page=1)(Hallgeber) ausgestattet.
Ich bekomme 2 Rechteck Signale von dem Sensor mit dem ich die Drehzahl und die Drehrichtung erkennen kann. Alles soweit auch kein Problem.
Jeder Motor hat seine eigene H-Brücke mit einem HIP4081A ( FET Treiber ). Jede H-Brücke wird von einem eigenen Atmega AT90PWM3B angesteuert.

Zur Steuerung gehe ich wie folgt vor. Ich habe 2 Register. ON_TIME0 und ON_TIME1
Wenn ich z.B
ON_TIME0= 2000
ON_TIME1=0
setze dreht sich der Motor nach links mit voller Drehzahl.
Bei
ON_TIME0= 0
ON_TIME1=2000
setze dreht sich der Motor nach rechts mit voller Drehzahl.
bei
ON_TIME0= 2000
ON_TIME1= 2000
setze stoppt der Motor.

Die Werte für die Register bekommt der AT90PWM3B per SPI von einem Atmega 2560.

Nun soll ich laut Lehrer einen PI-Regler für die Anpassung der Motoren in C programmieren. Da die Motoren ja Toleranzen habe laufen sie natürlich nie gleich schnell.
Leider fehlt mir aber der Richtige Ansatz wie ich die Register und die Daten von dem Magnetischer Impulsgeber miteinander in einer Regelschleife verknüpfe.

Im Internet finde ich auch keine Beispiele zu meinem Problem

Freue mich über konstruktive Anregungen.

Christoph

Che Guevara
12.01.2012, 00:58
Hallo,

ein PI-Regler ist ein seiner Grundstruktur sehr einfach. Er setzt sich aus dem P(roportional) und aus dem I(ntegral) Teil zusammen. Hier ein einfaches Beispiel:


int Error;
int ist;
int soll;
int p_anteil;
int i_anteil;
int error_integral;
int p_gain;
int i_gain;
...
Error = ist - soll;
p_anteil = error * p_gain;
error_integral = error_integral + error
i_anteil = error_integral * i_gain
...
motor1 = motor1 + p_anteil;
motor1 = motor1 + i_anteil;

Ist stellt die momentane gemessene Geschwindigkeit dar, Soll die Sollgeschwindigkeit. Die Differenz der beiden steht in Error.
p_gain und i_gain sind die beiden Variablen, die du selbst bestimmen musst, damit der Regler gut arbeitet. Wichtig ist, dass der Regler in einigermassen regelmäßigen Abständen aufgerufen wird und das so schnell als möglich.
Evtl. sollte man die Variablen als Fließkomma verwenden, um kleinere Abweichungen auch ausregeln zu können.
Wenn du Fragen hast, melde dich einfach. Ich weiß momentan nicht, wie groß dein Basiswissen ist.

Gruß
Chris

oberallgeier
12.01.2012, 10:21
Hallo Christoph.
... einen PI-Regler ... in C programmieren. Da die Motoren ja Toleranzen habe ... nie gleich schnell ...Die Rechnung selbst ist wirklich einfach (na ja, sie sieht nicht einfach aus und wenn man nicht in Regelungstechnik "daheim" ist, dann hat man so seine Probleme). Weniger einfach ist - für den Ungeübten - die Bestimmung der Parameter - wie Du es ja selbst feststellst. Das wird standardmässig mit der Bestimmung der Sprungantwort gemacht (WENN man das konkrete System vor sich hat, sonst muss man die Dynamik anhand der Motor- und Spannungs-/Stromdaten rechnen). Meine erste Sprungantwort habe ich hier (klick) ermittelt, (https://www.roboternetz.de/community/threads/36121-Autonom-in-kleinen-Dosen-R2_D03-Nachfolger-R3D01?p=404730&viewfull=1#post404730) etwas bessere Messbedingungen haben "schönere" Messdaten gebracht (klick). (https://www.roboternetz.de/community/threads/36121-Autonom-in-kleinen-Dosen-R2_D03-Nachfolger-R3D01?p=429579&viewfull=1#post429579) Aus diesen Daten werden nach theoretischen Grundlagen (etwa hier) die Kennwerte wie Regelverstärkung (P-Faktor), Zeitkonstante des Motors etc. bestimmt und mit denen z.B. nach Einstellregeln (http://www.rn-wissen.de/index.php/Regelungstechnik#Dimensionierung_nach_Einstellrege ln) die Kennwerte für die Regelungsrechnung ermittelt. Es lohnt sich eigentlich, das Regelungwiki durchzuarbeiten - zumindest die für den speziellen Fall relevanten Abschnitte. Hatte mich viel Zeit gekostet, aber es hatte sich gelohnt.

Viel Erfolg.

PICture
12.01.2012, 16:25
Hallo!


Hatte mich viel Zeit gekostet, aber es hatte sich gelohnt.

Sicher, aber nur, weil das für dich NOTWENDIG war. :)

@ Kampfwurst_Hugo

Woher weiss dein Lehrer, dass für diese Aufgabe zwei PI-Regler mit gleichem Sollwert optimal sind ? Nur für Gleichlauf von zwei Motoren gibt es sicher einfachere Lösungen mit nur einem Drehzahlregler, z.B.: https://www.roboternetz.de/community/threads/44332-Geradeaus-Fahren-mit-zwei-Motoren-ohne-PWM-%28beantwortet%29 . :confused:

Kampfwurst_Hugo
12.01.2012, 16:38
welche zum Beispiel

derNeue
19.01.2012, 18:46
hey hallo!

Vielleicht hilft dir dir Atmel-Application weiter

http://www.atmel.com/dyn/resources/prod_documents/doc7518.pdf


MfG Dennis

WL
19.01.2012, 23:33
Hallo Christoph ,

ich habe hier https://www.roboternetz.de/community/threads/51727-Motorregler-PID-Bascom einen Regler für 2 Motore und Synchronlauf vorgestellt.
Dabei wird (im Modus Synchronlauf / kein Lenk-Sollwert) zusätzlich zum P- und I-Anteil der Unterschied der Encoder-Inkremente hinzugerechnet.
Damit ist ein 99,99999%tiger Geradeauslauf gegeben.