Hallo,
ich möchte mit einem STM32 einen BLDC regeln. Genauer gesagt soll eine
feldorientierte Regelung zum Einsatz kommen.
Jetzt die Frage, für die Clarke-Transformation benötige ich ja die
Ströme zweier Phasen Ia und Ib. Da es sehr aufwändig ist, diese zu
messen, möchte ich dies nicht tun. Stattdessen wird an jedem lowside
MOSFET der Strom gemessen (mittels Shunt und Differenzverstärker). So
liessen sich die Phasenströme ja auch berechnen, oder?
zudem habe ich ein Tiefpassfilter bei der Strommessung noch vorgesehen,
damit mein ADC kein PWM sieht ;)
geht das so?
Peter T. schrieb:> Hallo,> ich möchte mit einem STM32 einen BLDC regeln. Genauer gesagt soll eine> feldorientierte Regelung zum Einsatz kommen.> Jetzt die Frage, für die Clarke-Transformation benötige ich ja die> Ströme zweier Phasen Ia und Ib. Da es sehr aufwändig ist, diese zu> messen, möchte ich dies nicht tun. Stattdessen wird an jedem lowside> MOSFET der Strom gemessen (mittels Shunt und Differenzverstärker). So> liessen sich die Phasenströme ja auch berechnen, oder?> zudem habe ich ein Tiefpassfilter bei der Strommessung noch vorgesehen,> damit mein ADC kein PWM sieht ;)> geht das so?
Blöde Frage:
Warum willst du für eine DC Maschine feldorientierte Regelung anwenden?
Klingt in meinen Ohren komisch...
Moin Peter,
so wie du beschrieben hast misst du doch den Strom in der jeweiligen
Phase. Eben wenn der LowSide geschaltet ist. Wird schon seit Jahr und
Tag so gemacht. über leg dir einfach welche Ströme fließen wenn du alle
LowSides einschaltest und durch die Spulen noch ein Strom Vektor fließt.
MfG
Tec
Hey,
danke für deinen Beitrag, Tec. Muss ich meinen ADC zwingend mit der PWM
synchronisieren, oder kann ich einfach irgendwann messen? ich habe ja
extra noch ein RC-Glied vorgesehen, damit die PWM rausgefiltert wird.
Die Grenzfrequenz des RC habe ich 10x tiefer gelegt als die
PWM-Frequenz. Könnte es so gehen?
Andere Frage: am Motor habe ich einen Drehgeber mit 1024 Impulsen pro
Umdrehung. Mit diesem sollte es schon möglich sein, den Motor auf ca. so
200 U/min zu regeln, oder?
Moin,
der Drehgeber macht es super einfach den Motor zu regeln, auch
Positionsregelung ist damit nicht das Problem. Ich persönlich würde den
Tiefpass eleminieren wollen weil du dadurch eine Phasenverschiebung beim
Strom hast die du Strom abhängig kompensieren musst. Die PWM Einheit
deines µC/DSP sollte schon den ADC triggern, das können aber eigendlich
alle die Ansatzweise für Motioncontrol gedacht sind.
MfG
Tec
Peter T. schrieb:> Es handelt sich um eine Drehfeldmaschine. So mit 3 Phasen und so... :O
Ups, da habe ich mich tatsächlich vom Namen verwirren lassen. Sorry. :D
Hi Tec,
danke. Den ADC kann ich natürlich mit der PWM synchronisieren. Jetzt
stellt sich nur noch eine Frage. Ich muss ja die aktuelle Rotorposition
kennen. Jetzt habe ich aber einen inkrementalgeber - wenn ich den Motor
starten will, dann steht ja der Rotor irgendwie. Wie finde ich heraus,
wo 0° liegt?
Dann die PWM - diese muss "center aligned" sein, oder ist das gar nicht
so wichtig? Mein Controller kann beider (edge und center aligned).
Für die FOC benötige ich ja zwei Phasenströme; nun gibt es ja aber
Momente, wo nur ein lowside FET eingeschaltet ist, was macht man da?
irgendwie fehlt mir noch ein wenig der Link, wie man das praktisch
implementiert, aber ich hab das Gefühl kurz davor zu sein ;D
Hi Peter,
bei der Strommessung würde ich die Filter nicht so niederfrequent
auslegen da Du dir sonst die Stromsignale wegfilterst. Du möchtest ja
den realen Zeitwert der Phasenströme messen.
Die PWM sollte man center-aligned einstellen. Der ADC muss dann so
eingestellt werden dass er genau am Umkehrpunkt des Timers getriggert
wird (entweder oben oder unten). Der Trigger muss immer dann erfolgen
wenn alle Low-Side Schalter eingeschaltet sind, d.h. es wird der
Freilaufstrom des Motors gemessen. => Gemessen wird damit automatisch in
der Mitte der Strompulse also möglichst weit weg von den Schaltflanken
=> Die Störungen sind dort am geringsten => das Tiefpassfilter kann
schnell ausgelegt werden.
Wenn Du für die Positionserkennung nur einen Inkrementalgeber hast must
Du vor Motoranlauf eine Positionierungsphase durchführen, d.h. Du gibts
ein statisches Pulsmuster aus und wartest bis der Motor "eingerastet"
ist. Dann weißt Du wo der Rotor steht und kannst deine Position von dort
an mit dem Inkrementalgeber bestimmen.
Das folgende Skript ist vielleicht ganz interessant für Dich:
http://wwwlea.uni-paderborn.de/fileadmin/Elektrotechnik/AG-LEA/lehre/geregelte-drehstrom/vorlesung/Geregelte_Drehstromantriebe.pdf
bzw.
http://wwwlea.uni-paderborn.de/lehre.html
Viele Grüße
Moin Zusammen
Peter Gonzo hat es auf den punkt gebracht was ich meinte mit dem Strom
messen. Du musst im NullVektor 000 also alle LOW Fet on messen. Der
Strom ist für eine PWM Periode ja grob gesagt Konstant.
Was die PWM Grundsätzlich angeht hier gibts n Artikel zum
Frequenzumrichter mit Raumzeigermodulation, dort meine ich war die SVPWM
mit minimalen Schaltverlusten erklärt. Dafür brauchst du 3 Centeraligned
und am besten syncronisierte PWMs. Dann siehst du auch was ich mit dem
Nullvektor 000 meine.
MfG
Tec
Hallo zusammen,
so ich habe mich nochmals ne Weile hingesetzt und diese ganzen
Transformationen studiert. Jetzt ist mir immerhin klar, was ich wie
rechnen muss und auf meinem Mikrocontroller habe ich es bereits
implementiert. Kann es sein, dass die sache gar nicht so kompliziert
ist, wie man auf den ersten Blick meinen würde?
Woran ich jetzt gerade herum doktere, ist die Frage zur PWM. Und zwar
habe ich die inverse Clarketransformation gemäss Wikipedia
implementiert, sodass ich ia ib und ic erhalte. Im Artikel zur
Raumzeigermodulation wird leider nicht erklärte, wie man daraus nun den
Duty bestimmt; zwar sind mir die Prinzipiellen Kurvenverläufe klar,
nicht aber wie ich von diesen drei Grössen auf die PWM komme. Ich
vermute allerdings, dass man die Zeiten für Anfangs- und Endvektor durch
Projektion auf die 6 "Achsen" dieses "SVM Star" erhält, richtig?
oder kann ich ia ib und ic direkt meinem PWM Modul als Duty übergeben?
Gruss
Moin,
die SVM Zeiger geben Dir die verschiedenen Pulsmuster an die deine PWM
Stufe erzeugen kann. Legst Du nur ein Pulsmuster für die Dauer deines
gesamten PWM Zyklus an, so gibst Du also genau einen Zeiger aus. D.h.
die Länge der SVM Zeiger gibt 100% Duty Cycle an.
Liegt dein Ausgangszeiger zwischen zwei SVM Zeigern, so setzt Du diesen
mit einer Vektoraddition aus den beiden angrenzenden SVM Zeigern
zusammen. Die Gleichungen lassen sich über trigonometrische Funktionen
ableiten.
Ein Zeiger setzt sich also immer aus der Addition zweier SVM Zeiger
zusammen. Dazu kommen dann noch ein oder zwei Nullzeiger (0,0,0) oder
(1,1,1) über die die Spannungshöhe eingestellt werden kann.
Die maximale Zeigerlänge der Ausgangsspannung ist cos(30°) was sich aus
der Kreisbegrenzung ergibt.
Die inverse Clarke brauchst Du nicht zu berechnen. Du kannst die
Einzelzeiger auch direkt aus den alpha/beta-Komponenten berechnen.
Gruß,
Ralf
Hi Ralf,
ja das habe ich schon verstanden. Nur wie ich direkt aus alpha und beta
auf die duty cycles komme, finde ich partout nicht heraus. Zwar ist mir
schon klar, dass man unter berücksichtigung trigonometrischer
Beziehungen das irgendwie berechnen kann; aber dann muss ich für jeden
Raumzeiger wieder das ganze Gedöns mit sin und cos rechnen? das kann
doch nicht sein?
Ich frage mich gerade ob mein STM32F4 genug Dampf hat, dass er das
packt, sind ja 2 Motoren. Und nebenher soll er ja auch noch was anderes
machen... bisher rechne ich alles in float, da ich eine FPU habe. Für
die trigonometrischen Funktionen habe ich eine Tabelle.
al3ko schrieb:> Peter T. schrieb:>> Es handelt sich um eine Drehfeldmaschine. So mit 3 Phasen und so... :O>> Ups, da habe ich mich tatsächlich vom Namen verwirren lassen. Sorry. :D
Ist ja eigentlich auch ziemlicher Unsinn, daß man einen synchronen
Drehstrommotor als "bürstenlosen Gleichstrommotor" bezeichnet.
Moin Zusammen,
http://www.mikrocontroller.net/articles/Frequenzumrichter_mit_Raumzeigermodulation
dort unter Raumzeigermodulation ist es ganz gut erkärt wie man eine
SVPWM errechnet.
Wenn du den Code hier mal reinstellen würdest würde das sicher viele
Interessieren. Würde gern mal n M4 mit Float mit dem M3 mit 32Bit
Berechnung vergleichen.
MfG
Tec
Noch mal vllt in anderen Worten das es klarer wird.
Beitrag "SVPWM Ansteuerung eines BLDC" weit unten
Du hast Va und Vb daraus berechnetst du Winkel und Amplitude der
Spannung.
Anhand des Winkels bestimmst du den Sektor in dem der Zeiger liegt.
Beispiel: Winkel 30° und Amplitude 50% ergibt. Sektor 1 (siehe Bild)
30° liegt in der Mitte des Sektors. -> 50% Vektor2 110 und 50% Vektor1
100
Oder mathematisch sin(30°) Vektor 1 100 und sin(60° - 30°) Vektor2 110
(60° sind die Sektoren auseinander).
Zusammen gefast bedeutet das um die Amplitude auf 50% zu bringen musst
du 50% Nullvektor schalten. Am besten 25% 111 und 25% 000 bzw. um mehr
Messzeit zuhaben kannst auch mehr 000 geben aber das ist Optimierung.
Weiter im Text. außerdem weißt du wie oben beschrieben 50% von deiner
Leistungstragenden Zeit ist Vektor1 100 und die anderen 50% sind Vektor2
110.
also 25% 111 + 25% 110 + 25% 100 + 25% 000 ergibt. eine Ton für
Va von 75% für Vb von 50% und für Vc 25%. Das haust du in die Compare
Register der syncronisierten centerd PWM und den Rest macht die HW für
dich. So hast du minimale Schaltverluste zumindest für n SVPWM. Andere
Modulationen lass ich mal außen vor.
Ich hoffe du kannst das Bsp nach vollziehen.
MfG
Tec
Hallo Tec,
ja meinen Code kann ich hier gerne rein stellen. Sobald er fertig ist.
Es ist wirklich keine Hexerei, von den in Matrizenform gegebenen
Berechnungen der Clarke- und Parktrafo überzugehen auf "normale"
Berechnungen die man mit dem M4 durchführen kann. Und mit der FPU ist
das ganze wirklich sehr performant. Werde nachher mit dem Oszi ein paar
Messungen vornehmen und die hier posten, damit du einen Vergleich hast.
Den Code gebe ich dann auch her, möchte erst aber die SVPWM noch fertig
implementieren und testen.
Einziges Problem was ich noch habe ist, dass ich mit meiner jetzigen
Hardware die Ströme im Motor nicht messen kann. Ich habe eine fertige
Vollbrücke genommen, die ich vor Jahren mal gebaut habe (war für 5kW,
etwas überdimensioniert für meinen 12V Motor aber egal). Dort habe ich
allerdings keine Shunts drin zur Strommessung, muss mir da noch was
überlegen ;-)
@Ralf,
kannst du mir sagen, wie du den ADC getriggert hast? Mein M4 (Stm32F407)
hat mehrere ADCs, aber ein ADC lässt sich nur von einem Timer triggern.
Und ich muss ja aber auf 2 verschiedene Trigger triggern, für jeden
Motor einen.
Ah ja, noch was fällt mir ein -- wenn ich den lowside Strom messe, kann
der nicht auch negativ sein? Es gibt ja immer einen Zeitpunkt, wo der
Nullvektor geschaltet wird. Dann kann ich messen, das ist jetzt klar.
Aber zu diesem Zeitpunkt wird ja in eine oder zwei Phasen Strom
hineinfliessen (Spannungsabfall über dem Lowside Shunt ist dann negativ)
und gleichzeitig wird aus zwei oder einer Phase Strom herausfliessen
(Spannungsabfall über dem lowside Shunt ist dann Positiv). Oder täusche
ich mich?
Diese Messerei ist mir also noch gänzlich unklar. Aber ich denke ich
werde mir dein erwähntes Buch kaufen, ist recht interessant :-)
Hallo,
also falls es jemanden interessiert, ich habe mit dem Cortex M4F ein
paar Tests gemacht. Mit einer Lookuptable für Sinus und Cosinus kann ich
die Clarke und Park Transformation und wieder zurück innerhalb von 1.3
us erledigen, alles mit Floatingpoint Berechnungen. Sollte schnell genug
sein, oder? ;-)
Interessanter Thread. Ich bin grade dabei eine Platine für PMSM
aufzubauen, und die Steuerung steht mir auch noch ins Haus.
Peter T. schrieb:> Jetzt die Frage, für die Clarke-Transformation benötige ich ja die> Ströme zweier Phasen Ia und Ib. Da es sehr aufwändig ist, diese zu> messen, möchte ich dies nicht tun
Warum es gibt genug bidirektionale Strommessverstärker. Kosten nicht die
Welt. AD8210 oder LT1999 uvw
gonzo schrieb:> Wenn Du aus den alpha/beta Komponenten die Einschaltdauern berechenest> brauchst Du kein sin und cos. Schau dir mal das an:> Vector Control of Three-Phase AC Machines: System Development in the> Practice> von Nguyen Phung Quang,Jörg-Andreas Dittrich
gibt es auch auf Deutsch: Praxis der feldorientierten
Drehstromantriebsregelung hab ich grad neben mir liegen :-)
STM hat auch eine sehr gute application note (UM1052). An sich hat jeder
IC Hersteller eine.
Wenn mein Layout steht poste ich es mal. (60V,70A)
Gruß Ert
Die Messung der Ströme mittels Shunts macht man über OpAmps. Der
Arbeitspunkt der OpAmps wird ausgangsseitig so eingestellt, dass bei 0
Strom die Ausgangsspannung in der Mitte des Aussteuerbereichs liegt.
Dann kannst Du positive und negative Ströme messen. Den Offset musst Du
dann vor der Verarbeitung abziehen.
Die Triggerung des ADC habe ich vom Motortimer aus gemacht (TIM8 oder
TIM1). D.h. ich habe pro Motor jew. einen Timer. Immer wenn alle
Lowsides eingeschaltet sind sendet der jew. Motortimer ein TRGO Signal
an den ADC. Ich habe dann immer zwei ADCs parallel laufen, d.h.
Master/Slave. D.h. z.B. ADC1 ist Master und ADC2 ist der Slave. Damit
kann ich dann zwei Ströme gleichzeitig messen. Heißt glaube ich combined
regular simultaneous mode oder so. Der injected mode ist ggf. auch
interessant wenn Du noch was anderes abtasten willst.
Ggf. kannst Du auch die Ströme seqenziell messen. Das musst Du dann bei
den Einschaltdauern berücksichtigen. Die ADCs sind ja relativ schnell.
Ob das geht hängt von Deiner erforderlichen Reglerperformance ab.
Gruß,
Ralf
Hallo Ert,
danke für den Tipp mit der Deutschen Variante. Diese werde ich mir
kaufen, das Thema interessiert mich.
Ralf,
kannst du mir mal schematisch zeigen, wie du das mit dem Arbeitspunkt
des OpAmp machst? ich bin analog nicht so fit :-)
ausserdem möchte ich für die Strommessung was möglichst günstiges und
einfaches, ich möchte darüber nicht eine Doktorarbeit schreiben ;-) Hast
einen Tip für mich?
Das mit dem ADC Trigger schaue ich mir auch nochmal an, leider verstehe
ich das so aus dem Stegreif nicht. Im Prinzip muss ich aber 3 Sachen
messen:
- Die drei Phasenströme
- Die DC-Bus Spannung
- Den DC-Bus Strom
wobei die letzten beiden eher optional und als "nice to have" zu
verstehen sind.
Moin,
bzgl. der Strommessung kannst Du bei ST kupfern :-)
Such auf der ST Seite einfach mal nach
STEVAL-IHM021V2
Zu diesem Board gibt es dort auch einen Schaltplan.
Im Prinzip ist die Schaltung eine normale OP Grundschaltung. (nicht
invertierender Verstärker mit Spannungsteiler zur Offset Einstellung)
Gruß,
Ralf
der AD8210 ist doch Top! einfach mit einem Spannungsteiler 2,5V dran und
fertig ist es. Einfacher gehts kaum... Der LT1999 hat das sogar schon
und kostet ca 5Euro das Stk.
Shunts gibts doch auch recht günstig. Ansich brauchst du nur zwei
Phasenströme, da einer immer identisch sein sollte.
MfG Ert
Hallo,
danke für die Tipps bezüglich der Strommessung. Ich werde mir mal diese
ICs anschauen.
Zur Raumzeigermodulation noch was - siehe angehängtes Excelsheet. Ich
habe mir für jeden Sektor überlegt, wie ein Vektor aus den Komponenten
alpha und beta auf die Achsen dieses "SVPWM Star" projiziert wird.
Daraus ergeben sich für jeden Sektor dann 2 Gleichungen, mit denen man
t1 und t2 berechnen kann, also die Komponenten für den Anfangs- und den
Endvektor. Dann habe ich noch gerechnet t3 = 1 - (t1 + t2), dies ist die
Zeit für den Nullvektor.
Da mein Drehgeber eine Auflösung von 1024 Schritten hat, habe ich dann
das ganze so ausgelegt, dass ich mit Inkrementen arbeiten kann und mir
eine Tabelle mit 1024 Werten gebaut, wo ich dann Sinus und Cosinus raus
lesen kann. So, und was ihr im angehängten Sheet nun seht ist folgendes:
Ich habe mir mal einen virtuellen Zeiger aus alpha und beta Komponenten
gebastelt, der um den Ursprung rotiert. Also alpha = cos phi und beta =
sin phi. Aus alpha und beta habe ich dann t1, t2 und t3 in Abhängigkeit
des Sektors berechnet. Dann habe ich die duty cycles berechnet. Je nach
Sektor muss man verschiedene Kombinationen von t1, t2 und t3 addieren.
Immer eine Phase hat einen konstanten duty cycle von 1, die anderen
beiden Phasen sind verschieden von 1. So entstehen die berühmten
"Popokurven" (das Wort habe ich hier irgendwo gelesen :-) Hat diese
Kurvenform keinen offiziellen Namen?)
Die Differenz zwischen den Popokurven ist sinusförmig. Mit der
Referenzspannung Vref, die zwischen 0 und 0.866 betragen kann
(sqrt(3)/2) kann man die Amplitude der SVPWM verändern.
Was meint ihr, kann das so stimmen? sieht nicht so übel aus oder?
Was mir noch aufgefallen ist - man kann das entweder so rechnen, wie ich
es in dem angehängten Sheet mache, oder man kann t3, also die Zeit für
den Nullvektor, noch halbieren, dann ergeben sich symmetrische
Popokurven, die Differenz ist aber noch immer ein Sinus. Was ist also
der Unterschied?
Gruss
Über die Platzierung der Nullvektoren kannst Du die Schaltverluste
deiner Ansteuerung beeinflussen, d.h. Du kannst es schaffen, dass über
einen ausgegebenen Sinus eine Halbrücke immer nur über 240° mittels PWM
moduliert wird. Die anderen 120° werden die Schalter statisch
angesteuert.
Zum anderen kann man über die Nullvektoren auch das Strommessfenster
entsprechend beeinflussen.
Ansonsten sehen Deine Kurven auf den ersten Blick sinnvoll aus (ohne in
die Gleichungen geschaut zu haben :-))
Gruß,
Ralf
Perfekt, danke Ralf.
So wie ich es im Moment realisiert habe, ist ein Schalter immer über
120° statisch angesteuert, während die anderen beiden Schalter
"wackeln".
Die Frage ist jetzt noch, wie ich auf mein VREF komme. Was ich im Moment
ja mache ist, einfach die gegebenen Vektoren alpha und beta auf die 6
Achsen zu projizieren. Muss ich da noch irgendwie den Betrag nehmen?
Hoffe ich habe deine Frage richtig verstanden...
Wenn Du die Projektionen gemacht hast, hast Du im Prinzip auch schon die
Schaltzeiten. Die Länge eines Sternvektors entspricht 100% Duty Cycle.
Deine Projektion entspricht nun einem bestimmten Anteil von diesen 100%.
Die Umrechnung ist also einfach per Dreisatz möglich. Die 100%
entsprechen auf deinem Controller dem Spitzenwert des PWM Timers wenn er
im centeraligned Mode läuft.
Gruß
Hallo Zusammen,
zurzeit versuche ich das gleiche Projekt zu realisieren wie Peter!!
Diesbezüglich sind ein paar Fragen aufgekommen...
Bei der synchronisation der ADC'S mit den PWM-Modulen habe ich vorerst
eine Frequenz von 1KHz eingestellt. Bei der ADC-Einheit besteht jedoch
noch die Notwendigkeit die Sample Time zu setzen,die geringste
einstellung beträgt 3 Cycles. Soweit ich weiß wird dadurch 3-mal
abgetastet um den Mittelwert zu bilden.... somit ist die Messung der
Phasenströme ungenau oder sehe ich das falsch? Falls nicht wie könnte
man das Problem lösen?
@Peter: Besteht die Möglichkeit deinen bisherigen Stand hochzuladen,
bzw. das Zeitverhalten deiner Regelung näher zu beschreiben?
Gruß
Thomas
hallo,
ich ein problem mit mit der FOC.
ich schaffe die "Positionierung mit encoder" nicht..
weiss zwar was zu tun ist, aber es in simulink hinzukriegen fällt mir
schwer.
weiss einer, wie man drauf kommt?
Arbeite mit einem stm32f4, boostxl DRV8301, und einen bldc 8 poligen
Motor.
das ganze in simulink
Hallo,
ich versuche auch mit einem STM32 einen BLDC Motor von einem Scooter
regeln und zwar habe ich einen Kalman Filter gebaut der zumindest in der
Simulation den Rotor Winkel gut schätzt.
Zu meinem Motor, es hat:
- 15 Polpaare,
- 3 Hall Sensoren, 90 Inkremente pro Umdrehung, mit den der Kalman
Filter gefüttert wird,
- Ib, Ic, I_gesamt messbar.
Nun meine Frage:
Entspricht der von mir geschätzte Winkel dem Winkel auf dem Bild
SVPWM.png ?
Mich verwirrt die Darstellung der einzelnen Sektoren. Der Motor hat ja
15 Polpaare, pro Rotor Umdrehung werden 15 mal die Hallzustände 462315
wiederholt.