Hallo liebe Mikrokontrollerprogrammierer da draussen. Ich bastle gerade an einer Motorsteuerung für bürstenlose Motoren auf Basis eines AVR32UC3C und hänge da gerade an einem Problem. Ich verwende 3 Hallsensoren um die Rotorposition in 6 Sektoren zu teilen. Innerhalb eines Sektors wird die Position durch Interpolation "geschätzt". Mein Startvorgang sieht so aus das ich den Winkel "Teta" für ein paar ms konstant vorgebe und in die SVPWM schicke um den Rotor auszurichten. Danach erhöhe ich Teta künstlich (Open Loop) um den Rotor mit einer bestimmten Geschwindigkeit in Drehung zu versetzen. Soweit funktioniert es ganz gut und ich bekomme am Ausgang die zu erwartenden "Popokurven" der Raumzeigermodulation. Mein Problem liegt nun bei dem Sprung in die "Closed Loop". In diesem Betriebszustand wird der Winkel nicht vorgegeben sondern gemessen und die Drehmoment- und -Fluxregelung der FOC setzt ein, welche Strommessung von 2 Phasen als Basis hat. Wie muss der Übergang zwischen openloop- und closedloop- Betrieb aussehen? Im openloop läuft er brav - mit vorgegebenen Werten für Ud, Uq und Winkel produziert die inverse Park-, Clarke- und SVPWM-Transformation die erwarteten Popokurven. Die berechneten Sektoren eilen den tatsächlichen - um ca. 2 Sektoren voraus. Aber sobald auf closedloop umgeschaltet wird, werden Ud und Uq aus Ia und Ib mittels Clarke- und Park und durch Vergleich mit Sollwerten von Flux(=0) und Torque(=?). Wilde Regelschwingungen sind zu beobachten und der Motor steckt sofort fest. Wie muss der Sollwert für Torque aussehen, damit nach dem Umschalten ein harmonischer Übergang in den closedloop erfolgt? Kann man ihn aus der Drehzahl gewinnen? Wenn ja, wie? Welche anderen Strategien sind möglich?
Für eine gute Regelung ist eine genaue Positionserfassung, z.B. mit einem 1-Chip Encoder wie dem iC-MH8 auf einer kleinen Platine - statt mit drei Hallsensoren, einfach zu machen. Hier die Beschreibung der Lösung: http://www.gb97816.homepage.t-online.de/mh8_2.htm mit Layout-Daten und das deutsche Datenblatt vom iC-MH8 ist hier: http://www.ichaus.biz/product/iC-MH8 .
Danke, das mit der alternativen Positionserkennung hab ich mir auch schon überlegt aber ich denke nicht das dies der Grund meines Problems ist. Mein Problem liegt in der "Closed Loop".
Aber du hast doch schon die Werte der Hallsensoren, die dir bei einem Flankenwechsel eindeutig den vorhandenen Drehwinkel angeben. Ein Timer, der davon zurückgesetzt wird, ermöglicht es dir dann, auch jeden Zwischenwinkel zu errechnen. Je nach Drehzahl sind absolute Drehgeber dafür auch einfach zu langsam oder zu zeitaufwendig abzufragen. Mein Rat wäre also, dich immer nach den Sensoren zu richten und gar nicht zu versuchen, aus Ia und Ib was zu ermitteln. Was möchtest du mit dem Closed Loop Betrieb denn erreichen? Wenn du Drehzahlen konstant halten möchtest, ist die Ist-Drehzahl einfach aus den Sensoren zu ermitteln und dein Stellwert ist die PWM Breite. Zum Starten des Motors tut es übrigens auch die klassische Blockkommutierung. Nach einigen erfolgreichen Sensorwechseln schaltest du dann auf SVPWM um. Siehe auch AVR447.
Ja, genau so läuft es bereits mit der Winkelmessung aber ich benötige die gemessenen Ströme um auf ein bestimtes Moment hin zu regeln. Drehzahlregler soll dann erst in einem weiteren Schritt realisiert werden. Eine Frage noch bezüglich dem gemessenen Winkel: Mit welchem Wert wird in der Park bzw. Invers Park gerechnet... Teta oder Teta + 90°?? Der Raumzeiger soll ja immer um 90° voreilen um maximales Moment zu erziehlen oder?
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.