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...
Es handelt sich um eine Drehfeldmaschine. So mit 3 Phasen und so... :O
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
GOOGLE fragen: "vector control" Clark Park transformation current lowside http://de.wikipedia.org/wiki/Vektorregelung
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
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 Gibts auch bei google books zur einsicht. Zumindest die wichtigen Stellen sind verfügbar (S. 25) http://books.google.de/books?id=jRlK-Uok-iMC&printsec=frontcover&dq=vector+control+of+ac+machines&hl=de&sa=X&ei=eSavUI2oBMjitQaokoDoBQ&ved=0CDYQ6AEwAQ#v=onepage&q=vector%20control%20of%20ac%20machines&f=false Zwei Motoren parallel funktionieren mit dem Controller. Die Auslastung hängt natürlich von deinen Frequenzen ab. Habe ich schon gemacht, allerdings mit fixed Point Mathe (@72MHz => Du hast noch Luft). Gruß, Ralf
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.
Ich glaube ich müsste den elektrischen Winkel des Rotors schätzen, der in meinem Fall 15 mal pro mechanische Umdrehung der Motorwelle dreht.
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.