PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : BLDC Regelung



bert89
11.11.2012, 20:42
Hallo Leute,

ich war mir nicht ganz sicher, ob ich das unter "Motoren" posten sollte, oder hier. Bitte entschuldigt also, wenn meine Frage nicht ganz passen sollte :-)
Ich habe ziemlich viele Fragen zur Ansteuerung eines BLDC.

Ich bin im Moment daran, ein kleines Fahrzeug mit einem BLDC anzutreiben.
Ich habe einen maxon motor, dieser verfügt über 6 Hallsensoren. Da mein Fahrzeug auch sehr langsam fahren können muss, habe ich ein Getriebe 1:10 drin; die minimalste Drehzahl vom Motor möchte ich zwischen 100..200 U/min regeln (Maximal dann 8000 U/min).

Erst mal zur Ansteuerung des Motors. Diese mache ich wie folgt: jede Änderung der Hallsensoren löst einen Interrupt aus. Im Interrupt werden dann die aktuellen Hallsensor-Zustände abgefragt. Danach lege ich die zu bestromende Phase jeweils an einem Anschluss an Masse, mit dem anderen Anschluss "wackle" ich PWM-mässig zwischen 0V und 12V. So kann ich den Motor steuern. Ist das richtig so, oder sollte ich das anders machen? eine Seite fest auf Masse, und die andere PWM-mässig entweder offen oder 12V?
seltsam an meiner Ansteuerung ist nämlich, dass der Motor am meisten Strom verbraucht, wenn der Tastgrad so um 50% rum ist. Und das, obwohl ich eine grosse Totzeit eingebaut habe, von 2 us! mit kleineren Totzeiten wird es nicht besser. Zwar dreht der Motor immer sauber, aber es irritiert mich, dass er bei 50% duty cycle mehr Strom braucht als bei 100%. Woran könnte das liegen?


Dann, zur Regelung des Motors: ich messe mit einem Timer des Mikrocontrollers (ein STM32F4) die Pulsbreite der Hallsensoren, und diese versuche ich auf einen konstanten Wert zu regeln. Leider oszilliert meine Regelung und ist recht träge. Wenn ich Kp und Ti ändere, kriege ich das oszillieren im höheren Drehzahlbereich zwar weg (Stichwort Ziegler Nicholls), allerdings kann ich den Motor im Unteren Drehzahlbereich kaum regeln, weil ich ja nur 6 Impulse pro Umdrehung kriege. Ich dachte erst, das würde reichen, aber jetzt sehe ich, dass es ein wenig knapp ist. Oder liegt es tatsächlich an meinem Regler? den habe ich einfach so in 10 Minuten mal schnell zum Testen geschrieben und dann damit ein wenig experimentiert ;)

Ich überlege gerade, ob ich noch einen Drehgeber an den Motor bauen soll, damit ich mehr Impulse pro Umdrehung kriege. Das würde wohl mein Problem lösen, oder?

dann, noch eine Frage. Im Moment fahre ich mit Blockkommutierung. Damit dreht der Motor gut, aber schöner wäre eine Sinuskommutierung. Ich habe mir jetzt überlegt:
ich könnte einen Timer nehmen, und diesen z.B. alle 100 us einen Interrupt auslösen lassen. Und im Interrupt zähle ich dann, abhängig von meiner gewünschten Drehzahl, eine Variable phi hoch, die mir den Rotorwinkel angibt. Mit einer Sinus-LUT könnte ich dann den duty cycle für die PWM bestimmen. Und dann, alle 60°, kriege ich von den Hallsensoren einen Interrupt, und kann phi wieder synchronisieren. Ist das ein möglicher Ansatz?

Noch besser wäre eine feldorientierte Regelung, ich möchte aber nicht unbedingt die Phasenströme messen. Wäre es auch möglich, eine solche zu bauen, wenn ich nur die Ströme an den lowside MOSFETs messe?

Ich hoffe, ihr könnt mir mit meinen Fragen ein wenig weiter helfen.

Wichtig: ich bin noch im Studium, also verzeiht mir, wenn ich teilweise etwas naiv Frage :)

ranke
12.11.2012, 15:49
... Danach lege ich die zu bestromende Phase jeweils an einem Anschluss an Masse, mit dem anderen Anschluss "wackle" ich PWM-mässig zwischen 0V und 12V ...

Das Kurzschließen von Motorwicklungen ist in diesem Fall ungünstig. Die Generatorspannung verursacht einen hohen Strom in der Wicklung, dessen Magnetfeld wirkt der Antriebsrichtung entgegen. Der Strom verursacht entsprechende Erwärmung der Wicklung, der Wirkungsgrad ist schlecht. Unterbrechen ist richtig, gegebenfalls müssen aber hohe Abschaltspannungen über Freilaufdioden abgeleitet werden.


... Wenn ich Kp und Ti ändere, kriege ich das oszillieren im höheren Drehzahlbereich zwar weg (Stichwort Ziegler Nicholls), allerdings kann ich den Motor im Unteren Drehzahlbereich kaum regeln ...

Bedenke dass sich die Regelstrecke nochmals völlig verändert, sobald der Motor mechanisch als Antrieb für das Fahrzeug eingesetzt wird. Drehzahlschwankungen gibt es dann wegen der hohen Masse kaum noch, entsprechend können (müssen) die Regelparameter angepasst werden.

bert89
20.11.2012, 06:12
Hallo,

sorry für die späte Antwort. Ich hatte sehr viel zu tun... :(

also, wegen dem Kurzschliessen der Motorwicklungen - da habe ich keine neuen Erkenntnisse gewonnen. Ich habe mal versucht, die PWM anders zu implementieren: nun liegt immer ein Anschluss fest auf Masse, der andere ist entweder offen oder auf +. Das hat den Stromverbrauch aber nur unwesentlich beeinflusst -- ist eigentlich ja auch klar, denn beim Motor handelt es sich ja um was induktives, d.h. der Strom fliesst eh noch weiter, wenn die PWM aus ist. Warum der Motor bei 50% duty am meisten Strom verbraucht, ist mir ein absolutes Rätsel. Ich schiebe die "Schuld" mal auf eine nicht so optimale Endstufe (vielleicht shoot through oder sowas).

Zur Regelung - ich habe jetzt einen Drehgeber am Motor montiert, mit 1024 Inkrementen pro Umdrehung. Damit lässt er sich auch im unteren Drehzahlbereich super einfach regeln. Die Kommutierung läuft weiterhin über die Hallsensoren; ein Hardwaretimer wertet die Drehgebersignale aus. Ca. alle 100ms schaue ich nach, wie viele Inkremente der Timer gezählt hat, und regle dann auf die Anzahl Inkremente - so funktioniert das wunderbar!

Jetzt komme ich zur feldorientierten Regelung. Meine Endstufe kann bei jedem lowside FET den Strom gegen Masse messen. Geht das so? eigentlich möchte man für eine feldorientierte Regelung ja den Strom in den Phasen kennen.

ikarus_177
21.11.2012, 14:25
@bert89: ich arbeite auch gerade an einem Brushlesscontroller mit feldorientierter Regelung. Sieh dir dazu mal von Microchip die AN1078 an (auf deren Basis ich meinen Regler aufbaue), interessant für Schaltplaninspirationen ist auch der "dsPICDEM MCLV Development Board Users Guide".

Falls du Interesse hast, kann ich dir den Schaltplan meines Reglers zukommen lassen (für den ich gerade die Platine geätzt habe, die Schaltung wurde also noch nicht getestet)!

Schöne Grüße!

bert89
21.11.2012, 18:56
Hallo Ikarus,

danke für den Tipp. Die AN schaue ich mir gleich an! Allerdings habe ich mit der Hardware am allerwenigsten Probleme. Eher Sorgen bereitet mir die Ansteuerung der Brücke! Eben diese Raumzeigermodulation, die ganzen Drehzeigertransformationen etc. Leider wird in der gängigen Literatur alles immer mystifiziert, obwohl es wahrscheinlich nicht soo kompliziert ist. Immerhin habe ich jetzt schon das Schema gezeichnet für eine Hardware incl. Motortreiber, Interface für die Hallsensoren und Drehgeber sowie eine Strommessung in allen 3 Phasen (jeweils am lowside MOSFET).

Eine Frage taucht auch immer wieder auf -- für die Park-Transformation benötige ich ja den aktuellen Rotorwinkel. Der kann zwischen 0° und 360° liegen, ja? Nun, wie finde ich heraus, wo denn die Position 0° liegt? ich habe nur einen Inkrementaldrehgeber mit A und B Signalen, die mein Mikrocontroller in Hardware schön brav hoch zählt. Ich habe 1024 Inkremente pro Umdrehung, das sollte ja schon recht gut sein, oder?

Gruss

ikarus_177
22.11.2012, 13:11
Ich denke, das ist einfach Definitionssache, soll heißen, wenn du vor Hochlauf des Motors einfach zwei Wicklungen für eine gewisse Zeit bestromst und die dritte offen lässt, müsste das doch dem Winkel 0° entsprechen, oder?

Eine andere Frage: die Application Note, die ich angesprochen habe, verwendet eine Sensorlose Implementierung, d.h. die Ermittlung des Rotorwinkels für die Park-Transformation geschieht über ein Modell des Motors, welches über einen "Slide-Mode-Controller" an das tatsächliche Motormodell angeglichen wird (über die Rückspeisung eines Korrektursignals). Den Teil, den ich nun nicht verstehe, ist jener, bei dem über Tiefpassfilterung dieses Korrektursignals Z die Back-EMF abgeschätzt wird (siehe ab S.12, im speziellen S. 14 unten). Wieso genau Tiefpassfilterung (das Modell enthält als zusätzlichen Term ja den Korrekturwert, der natürlich im physikalischen Motor nicht enthalten ist - kann man daher die beiden Größen zusammenfassen und die Back-EMF einfach als niederfrequenten Teil auffassen (der die "höherfrequenten" Störungen durch die Adaption des Algorithmus nicht enthält))?

Schöne Grüße!

EDIT: so wie es aussieht, verwendet auch die AN1078 für den Anlauf einen vorherige "Ausrichtung" des Stators - zu sehen z.B. auf Figure 1-20 (Seite 17 (http://ww1.microchip.com/downloads/en/AppNotes/70638A.pdf)).

bert89
22.11.2012, 17:06
Hallo Ikarus,

sorry, mit dem Motormodell habe ich mich bisher nicht befasst. Ich habe in meiner Anwendung Sensoren, d.h. ein Drehgeber und Hallsensoren, daher habe ich mir das gar nie überlegt.
Aber ich schaus mir nachher an, vielleicht kann ich dir trotzdem ein wenig weiter helfen.
Dafür kannst du mir auch was verraten :-)

Oder besser gesagt 2 Dinge.

1. Mein Drehgeber liefert mir einen Wert zwischen 0 und 1024 für die Rotorposition. Ich habe mir eine Lookuptable gemacht für sin und cos, die grade die 1024 Werte aufnimmt. Zwar hat mein Mikrocontroller eine FPU, aber sin und cos möchte ich dann doch nicht in Echtzeit rechnen müssen :-) So, also, die Clarke und Park Transformation sowie deren Inverse sind jetzt mit dieser Tabelle lauffähig. Ich rechne alles in floating point (weiss zwar nicht ob es nötig ist, Integer würde wohl auch reichen). So, ich messe ia, ib und ic, gehe damit über Clarke zu alpha und beta über, und mit Park erhalte ich d und q. Dann regle ich (das ist der einfachste Teil von allen :-) ) und dann wird mit inverser Parktrafo nach alpha und beta transformiert, mit clarke erhalte ich wieder ia, ib, und ic. Jetzt ist die Frage: wie berechne ich nun aus diesen Werten den Duty cycle für meine PWM? Es ist eine Center aligned PWM mit 10 Bits Auflösung. Mit Hilfe der Hallsensoren kann ich ja den Sektor bestimmen, aber dann?

2. Wie soll ich die Ströme in den Phasen messen. Zwar kann ich meinen ADC mit den Timern synchronisieren, aber ich möchte zwei Motoren ansteuern, der ADC lässt sich aber nur von einem Timer triggern, was ein bisschen unschön ist..... Hast eine Idee? Ich habe bei jedem lowside FET einen Shunt mit Differenzverstärker. Ich habe mir überlegt, da ein kleines Tiefpassfilter einzubauen, damit der OpAmp die PWM nicht "sieht" und dann so auf den Mikrocontroller zu gehen und einfach "irgendwann" zu messen, durch das Tiefpass kriege ich ja dann so eine Art Mittelwert, der ja auch meinem Strom entspricht. Meinst du, das würde gehen?

Gruss

ikarus_177
23.11.2012, 09:44
Hallo bert89!

1.) Mit der PWM kannst du ja primär die drei Phasenspannungen ausgeben, eigentlich sollen ja aber die Ströme beeinflusst werden. Nach meinem derzeitigen Verständnis des Themas sollte das aber kein Problem sein, da ja Spannung und Strom nur durch eine konstante Phasenverschiebung getrennt sind (im Idealfall 90°). Soll heißen, du gibst einen um 90° dem gewünschten Stromvektor vorauseilenden Spannungsvektor aus (bitte korrigieren, falls falsch - ist einfach nur so daherüberlegt!).
Dafür gibt es jetzt mehrere Möglichkeiten (siehe AN955 (http://ww1.microchip.com/downloads/en/AppNotes/00955a.pdf)): einerseits die "straightforward"-Methode, bei der du einfach gemäß dem gewünschten Spannungsvektor (resultiert in drei eindeutigen Phasenspannungen) verschiedene Spannungen an die Phasen legst (einfach durch unterschiedliche PWM-dutycycles).
Zweitens gibt es die Raumzeigermodulation, die lt. AN955 eine bessere Ausnutzung der Zwischenkreisspannung (bzw. DC-Speisespannung) mit sich bringt. Die Raumzeigermodulation ist dort auch gut beschrieben. So wie ich die Grafiken verstehe, benötigt man bei dieser Art als primäre Eingangsgröße nicht die geforderten Phasenspannungen/Phasenströme sondern kann direkt mit alpha und beta arbeiten, wodurch die letzte Rücktransformation obsolet wird (stimmt das?).

2.) Hmmm, ein Tiefpassfilter erzeugt immer auch eine Phasenverschiebung, die bei höheren Drehzahlen schnell unangenehm werden kann (ich hatte zuvor die klassische Brushlessregelung mit Blockkommutierung versucht; da zeigte sich bei hohen Drehzahlen - die für meinen Quadrocopter unerlässlich sind - eine Verschiebung des Kommutierungszeitpunktes und somit eine Verschlechterung des Wirkungsgrades).
Andere Frage: welchen Controller/DSP verwendest du? Beim dsPIC33FJMC202 (den ich verwenden werde) lässt sich der ADC über die PWM-Einheit triggern, d.h. es wird in der Mitte jeder PWM-Periode (center-aligned) gesampled. Wenn du dir jetzt einen Controller mit ausreichend vielen PWM-Kanälen für 2 Motoren suchst und alle center-aligned betreibst, kannst du problemlos zum optimalen Zeitpunkt messen.
Allerdings ist wohl die Rechenleistung, die der ganze Algorithmus braucht, nicht zu unterschätzen (lt. AN1078 ca. 21MIPS für 20kHz-PWM).

Schöne Grüße!

bert89
24.11.2012, 09:00
Hallo Ikarus,

ja ich denke deine Aussage über die letzte Rücktransformation dürfte korrekt sein. Wie man nun aber von Alpha und Beta auf die drei Duty Cycles kommt, das verstehe ich noch immer nicht! :-(

Wegen des Tiefpassfilters. Die Phasenverschiebung dürfte relativ gering sein, da das Filter ja eine Grenzfrequenz von einigen kHz hat, und die Frequenz des Motors ja relativ gering ist (einige 100Hz wohl) dürfte das doch passen. Oder nicht?

Das Problem ist, dass in dem Lowside Shunt der Strom auch negativ werden kann, d.h. man benötigt eine bipolare Strommessung, was auch recht haarig wird denke ich :-(

Der Algorithmus ist allerdings nicht so komplex, dünkt es mich; ich benutze einen DSP mit 160 MHz Takt und Floatingpoint Unit. So kann ich die Clarke, Park und deren inverse Transformationen in knapp einer Mikrosekunde rechnen, das passt. Für sin und cos habe ich eine Lookuptable, die auch direkt zur Auflösung meines Drehgebers passt :-)

ikarus_177
24.11.2012, 11:00
Hi bert!

Zur Dutycycle-Berechnung mit Raumzeigermodulation: sieh dir mal die Gleichungen auf S. 4 von AN955 (http://ww1.microchip.com/downloads/en/AppNotes/00955a.pdf) an.

Zur bipolaren Strommessung: ich zitiere wieder AN1078 bzw. den Schaltplan dazu - dort ist die Strommessung so realisiert (die Anschlüsse links kommen von den Shunts, davon messen die oberen beiden direkt 2 der 3 Phasenströme (der dritte kann ja daraus berechnet werden), der untere den Gesamtstrom - der Komparator rechts unten gibt ein Überstromsignal an den Controller zurück):
23837

Zum Tiefpassfilter: da hast du wohl recht (ich hab' nachgesehen - mein Tiefpass hatte eine Grenzfrequenz von um 350Hz), käme auf einen Versuch an. Für die maximal geforderte Kommutierungsfrequenz spielt neben der max. gewünschten Drehzahl aber auch die Polpaarzahl des Motors eine Rolle.

OK, da ist dein Controller natürlich ein paar Nummern größer als meine Plattform, da sollte das schon hinhauen ;-)

Schöne Grüße!

bert89
25.11.2012, 20:55
Hallo Ikarus

danke für deinen Schaltplan. Ich habs mittlerweile auch rausgefunden wie ich es machen kann und bin auf dieselbe Lösung gekommen :-)

Die Berechnungen der Dutycycles schaue ich mir grade an. Ich frage mich gerade, ob ich es wirklich wagen soll, die FOC zu implementieren. Das ist nämlich ein Semesterprojekt an meiner FH, und ich muss zuerst alle Konzepte etc. entwickeln, jetzt habe ich noch keine Hardware, wo ich das alles richtig testen kann. Zwar rechnet mein DSP recht locker mit Floatingpoint rum (Takt 160 MHz), aber ich möchte zwei BLDC-Motoren regeln, d.h. es sind insgesamt 4 digitale Regler zu implementieren (je einer für d und q). Dann noch ein überlagerter Drehzahlregler pro Motor, gibt 6 zu implementierende Regelkreise.
Auf der englischen Wikipedia habe ich soeben noch gelesen, dass für eine gescheite feldorientierte Regelung der Regler alle 1ms ausgeführt werden soll - mindestens. Das packt mein Controller zwar schon, aber ob es dann reicht?

Bisher habe ich immer mit Blockkommutierung gearbeitet und habe damit einige Erfahrung; ich wollte aber schon immer mal FOC machen, und da ich in diesem Projekt die Motoren besonders genau regeln möchte, dachte ich das wär eine gute Idee ;-)

Ich denke ich werde mal meine Hardware dann so planen, dass ich FOC machen kann, aber erst werde ich Blockkommutierung implementieren und dann wenn die Zeit noch reicht auf feldorientiert wechseln. Hmm.... Okay aber das ist eine andere Baustelle.



EDIT:
habe soeben die Gleichungen in der AN995 angeschaut. Diese kenne ich bereits ;-) Da gibt es aber ein Problem:
Zwar stehen da schon Gleichungen für TA und TB, aber da kommt noch der Winkel Psi vor, also der Winkel den der auszugebende Vektor mit der reellen Achse bildet. Nun, Psi kenne ich ja nicht... Ich habe nur d und q, bzw. nach der inversen Park-Transformation alpha und beta. In alpha und beta ist Psi ja implizit gegeben; muss ich da wirklich mit trigonometrischen Funktionen noch den Winkel ausrechnen? Wenn das so ist, erscheint mir dies recht verwegen, auch auf einem DSP. Dazu wäre ja ein arctan() nötig -- der braucht Rechenleistung ohne Ende :-/

ikarus_177
25.11.2012, 21:18
Hallo!

Ich hab' mir mal den entsprechenden Codeteil der AN1078 angesehen - wie es scheint wird die inverse Clarke-Transformation doch noch ausgeführt, d.h. ins 3-Achsen-System zurückgerechnet.
Die Gleichungen zur Berechnung der PWM-Werte aus den Werten für die 3 Phasen scheinen sehr sehr einfach zu sein und enthalten keine Winkelfunktionen. So ganz verstehe ich den Lösungsweg aber noch nicht :-k

Der folgende Code ist eine C-Übersetzung des eigentlichen Codeteils, der in Assembler geschrieben ist. Alle verwendeten Variablen scheinen global zu sein.


void CalcRefVec( void )
{
if( Vr1 >= 0 )
{
// (xx1)
if( Vr2 >= 0 )
{
// (x11)
// Must be Sector 3 since Sector 7 not allowed
// Sector 3: (0,1,1) 0-60 degrees
T1 = Vr2
T2 = Vr1
CalcTimes();
dPWM1 = Ta
dPWM2 = Tb
dPWM3 = Tc
}
else
{
// (x01)
if( Vr3 >= 0 )
{
// Sector 5: (1,0,1) 120-180 degrees
T1 = Vr1
T2 = Vr3
CalcTimes();
dPWM1 = Tc
dPWM2 = Ta
dPWM3 = Tb

}
else
{
// Sector 1: (0,0,1) 60-120 degrees
T1 = -Vr2;
T2 = -Vr3;
CalcTimes();
dPWM1 = Tb
dPWM2 = Ta
dPWM3 = Tc
}
}
}
else
{; // (xx0)
if( Vr2 >= 0 )
{
// (x10)
if( Vr3 >= 0 )
{
// Sector 6: (1,1,0) 240-300 degrees
T1 = Vr3
T2 = Vr2
CalcTimes();
dPWM1 = Tb
dPWM2 = Tc
dPWM3 = Ta
}
else
{
// Sector 2: (0,1,0) 300-0 degrees
T1 = -Vr3
T2 = -Vr1
CalcTimes();
dPWM1 = Ta
dPWM2 = Tc
dPWM3 = Tb
}
}
else
{
// (x00)
// Must be Sector 4 since Sector 0 not allowed
// Sector 4: (1,0,0) 180-240 degrees
T1 = -Vr1
T2 = -Vr2
CalcTimes();
dPWM1 = Tc
dPWM2 = Tb
dPWM3 = Ta

}
}
}


void CalcTimes(void)
{
T1 = PWM*T1
T2 = PWM*T2
Tc = (PWM-T1-T2)/2
Tb = Ta + T1
Ta = Tb + T2
}


Der Teil, in dem der Sektor bestimmt wird ist ja noch verständlich, die drei ersten Gleichungen von CalcTimes() ja auch - die beiden nächsten verstehe ich aber überhaupt nicht, vor allem, da anscheinend die Zeitwerte der vorhergehenden Berechnung ebenfalls eine Rolle spielen...

Schöne Grüße!

bert89
25.11.2012, 22:47
Hmm also so ganz blick ich das nicht. Warum nur wird das so mystifiziert, wie man diesen Duty cycle berechnet?

Gut, im Prinzip ist es ja einfach: aus Alpha und Beta kann der Winkel berechnet werden. (Dieser müsste mit dem vom Drehgeber gelieferten Winkel übereinstimmen, oder?)
Anhand des Winkels bestimmt man den Sektor, und danach berechnet man den Winkel innerhalb des Sektors. Anschliessend ist

t1 = sin(60 - x)
t2 = sin(x)

die Zeiten für Vektor 1 und Vektor 2, wobei x der Winkel in diesem Sektor ist.

Beispiel:

Winkel des Rotors sei 70°. Dies ist im Sektor 2. Also subtrahiere man 60°, man erhält 10°. Somit ist

t1 = sin(50°) = 0.766
t2 = sin(10°) = 0.173

die Zeit für den Anfangs- und den Endvektor. Der Nullvektor muss während der Zeit

1 - t1 - t2 = 0.061

ausgegeben werden.

Das ist alles schön und gut und auch sehr trivial, aber

a) was mache ich denn nun mit alpha und beta, die benötige ich ja gar nicht, denn den Winkel kann ich ja auch vom Drehgeber ablesen
b) irgendwie ist das doch ein wenig komisch, innerhalb jedes Sektors immer dieselben Winkel wieder zu berechnen -- das sollte doch auch einfacher gehen, direkt mit alpha und beta, denn diese geben den winkel doch implizit an, oder nicht?

Gruss

ikarus_177
26.11.2012, 19:42
Hallo!

Der Winkel, der durch alpha und beta (im Grunde ja das Ergebnis der ganzen Regelung), ist (bzw. sollte) ein "bisschen" größer als der aktuelle Winkel vom Drehgeber sein. Du willst ja den Rotor im Vergleich zur aktuellen Position um ein Stückchen weiterbewegen.
Würdest du den Winkel vom Drehgeber nehmen, könntest du dir die ganze Rechnerei gleich ganz sparen, dann würde sich der Rotor aber nie bewegen.

Das Ergebnis der Regelung (= der Winkel, der auf den Motor / die 3 Phasen gegeben werden soll) ist sicher in alpha und beta enthalten, wie genau man dann aber die PWM-Werte mit der Methode der AN1078 berechnet, weiß ich auch noch nicht so ganz... :-k

Schöne Grüße!

bert89
26.11.2012, 22:20
Hallo Ikarus,

hmm stimmt eigentlich :-)

heute in der Mittagspause war mir ein wenig langweilig, und daher habe ich nochmals ein wenig über Vektorgeomtrie nachgedacht. Ich habe mir überlegt, wie man ohne nervige Winkelfunktionen den Vektor (alpha, beta) auf die 6 Achsen vom "SV PWM Star" projizieren kann -- genau das möchte man ja tun, um die Einschaltzeiten für den Anfangs- und den Endvektor zu berechnen.
Nun, es hat sich gezeigt, dass dies recht simpel ist. Es ergeben sich so sechs 2x2 Matrizen, mit denen man einen Vektor (alpha, beta) nun so umrechnen kann. Der aktuelle Sektor gibt an, welche der sechs Matrizen zu benutzen ist. Ich habe mir mal in Excel ein Sheet erstellt, wo ich die Duty cycles mit diesen Matrizen berechne und in einem Diagramm darstelle, und siehe da, es ergeben sich diese schönen SVPWM-Kurven. (Die man, glaube ich, Supersinus nennt??)

Ich werde dann morgen schnell ein PDF hochladen, wo das beschrieben ist. Eigentlich ist es recht einfach :-)

schorsch_76
27.11.2012, 07:20
Nur als Bestätigung für mich das ich das halbwegs verstanden habe, hier geht es um so eine Regelung und die 6 Sektoren die in diesem [1] [2] PDF gezeigt werden?

Gruß
Georg

[1] http://www.arpnjournals.com/jeas/research_papers/rp_2010/jeas_0710_362.pdf
[2] http://www.ti.com/lit/an/bpra073/bpra073.pdf

ikarus_177
27.11.2012, 09:31
Hallo!

@bert: deine Matritzen würden mich sehr interessieren! Ich hab' auch schnell versucht, eine Umrechnung im ersten Sektor zu formulieren, hab aber noch nicht verifiziert, ob da was brauchbares herausgekommen ist...

@schorsch: ganz genau :-)

Mittlerweile bin ich am Bestücken der Reglerplatine - bin schon gespannt auf die ersten Testläufe mit dem Motor!

Schöne Grüße!

schorsch_76
27.11.2012, 10:33
Hab hier noch ein Appnote [1] von Atmel gefunden das auf die Kommutierung und PWM eingeht.

[1] http://www.atmel.com/Images/doc7518.pdf

bert89
27.11.2012, 21:09
Also, die nötigen Matrizen für die Projektion eines (alpha, beta) - Vektors auf die SVPWM-Achsen lauten wie im beigefügten Bild.
Ich hoffe ihr seid mit der Matrizenrechnung vertraut ;-)

23863

Die Berechnung erfolgt dann wie folgt: Man multipliziert die Matrix mit dem Vektor (alpha, beta). Heraus kommt der Vektor (t1, t2), der die Projektion von (alpha, beta) auf die Achsen darstellt. Die Matrizen habe ich selber hergeleitet, ich habe die bisher noch nie so gesehen, aber es ist eigentlich einfach darauf zu kommen, ist nur ein wenig Vektorgeometrie ;-)

ikarus_177
28.11.2012, 08:33
Hallo!

Danke für das Bild!
Da war meine Herleitung ja doch äquivalent zu deiner - ich hab' nur die Matritzenschreibweise nicht benutzt und die Vorfaktoren ausgeschrieben.

Freut mich - das hat doch einiges zur Klärung des "Mysteriums" SVM beigetragen ;-)

Schöne Grüße!

bert89
29.11.2012, 21:27
Hallo zusammen,

mir ist eins noch eingefallen. Wie macht man denn so eine vernünftige Drehzahlregelung? Ich regle ja Id=0 und Iq=irgend ein Wert (welcher?).
Wo ist die Drehzahl? hmm.

ikarus_177
30.11.2012, 09:29
Servus,

Id = 0 gilt nur dann, wenn der Motor nicht im Feldschwächbetrieb operiert (erlaubt Drehzahlen über die Nenndrehzahl hinaus, aber mit vermindertem Drehmoment).
Die Drehzahl kannst du entweder (bei Sensorlosem Betrieb) aus dem Motormodell bestimmen, oder wie bei dir einfach über die Hallsensoren. Da Iq nun das Drehmoment des Motors bestimmt, muss Iq die Stellgröße sein, d.h. der Drehzahlregler gibt einen Sollwert für Iq vor, der vom unterlagerten Regelkreis (der Id und Iq regelt) eingestellt wird.

Schöne Grüße

Christian84
14.10.2013, 18:10
Moin alle zusammen,

ich wollte dieses Thema mit der Regelung der Geschwindigkeit eines BLDC aufgreifen. Es geht um die feldorientierte Regelung.


Wenn ich einen BLDC in Blockkommutierung betreibe, verstelle ich die Geschwindigkeit, indem ich die Spannungshöhe mit der PWM-Duty verändere.

Wie funktioniert es aber bei der feldorientierten Regelung? Wenn ich 2 verschiedene Geschwindigkeiten haben möchte, muss ich dann doch auch 2 verschiedene Spannungshöhen erreichen oder ?


VIelen Dank im Voraus

Christian

robin
14.10.2013, 18:30
Du hast durch deine drei Spulen, die du ja einzeln bestromen kannst, 6 (durch die polarität) verschiedene Vektoren (A, A', B, B', C und C'). Wenn alle drei Spulen die selbe Potential haben, dann hast du auch noch die beiden Nullvekroten.

Für die Rotation musst du A, A', B, B', C und C' kombinieren, sollte denk ich klar sein. Für die Spannungshöhe kommt dann noch der Nullvektor, also alle oberen oder unteren Transistoren an, ins Spiel. Für die halbe Spannung musst du entsprechend die halbe Zeit noch den Nullvektor anlegen.

E: Auch mal bei Wikipedia geschaut? Wird da mMn. recht gut erklärt.
http://de.wikipedia.org/wiki/Raumzeigermodulation