Forum: Analoge Elektronik und Schaltungstechnik BLDC Sinuskommutierung Ansteuerung H-Brücke


von Mach F. (machfax)


Lesenswert?

Hallo

Ich habe einen BLDC Motor mit 3 Phasen
Jetzt möchte ich diesen mit der Sinuskommutierung ansteuern. Die 3-fach 
H-Brücke ist an +24V und 0V angeschlossen.
Der Motor ist ein 24V Typ.

Muss ich jetzt bei Speed 0 50% duty cycle auf die Pahsen geben und den 
Sinus dann bei positiver Halbwelle zu den 50% duty cycle vom PWM bei den 
HighSide FETs (gegen 24V schaltend) dazurechnen und die low side auf 50% 
eingestellt lassen oder bei positiver Halbwelle die LowSide Fets 
deaktivieren? Ich muss ja in der "mitte" der 24V sein, also müssten die 
lowSide Fets (gegen Masse schaltend) mit 50% duty cycle immer 
eingeschaltet sein? Oder wie macht man das korrekt?

: Verschoben durch Admin
von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Moin,

erste Frage: Ist dir die Rotorlage bekannt? 
Drehgeber/Hallsensoren/Beobachter?
zwote Frage: Was genau willst du antreiben?

Du musst die Sinuswerte ja nicht auf 50% von 24V beziehen. es reicht 
doch voll kommen wenn die Werte auf Vsin/2 bezogen sind. Also auf die 
Hälfte deiner Sinusamplitude.

Wenn du es nach Industriestandart machen möchtest suche mal nach 
SVPWM/SpaceVector/Raumzeiger Modulation. Damit macht man eine solche 
Aufgabe üblicher weise. Aber für eine Regelung des Motors brauchst du 
zwingend die Rotorlage.

MfG

Tec

von Mach F. (machfax)


Angehängte Dateien:

Lesenswert?

Hallo

Ja die Rotorlage ist mmir bekannt, ich bestimme die über die 
Hallsensoren und zwischen 2 Flanken von Hallsensoren über die 
EncoderWerte, , somit habe ich den effektiven Winkel (Position vom 
Motor). Über eine Sinustablle rechne ich die Amplitude, was auch alles 
super funktioniert. Nur ist jetzt die Frage wie ich diesen Sinus auf die 
Endstufe High und LowSide geben soll (siehe Excel)
Im Excel sind die 3 generierten duty cycle zu sehen, die ich jetzt noch 
korrekt auf die Endstufe bringen muss. Mir ist aber nicht klar, was ich 
mit den LowSide Fets machen soll, wenn der Sinus positiv ist, und 
umgekehrt.

Danke

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Moin,

Wenn du einfach die PWMs frei laufen lässt mit ihrer jeweiligen t_on 
bekommst du arge Probleme mit Spikes und EMV. Die 3 PWMs müssen zwingend 
synchron laufen. das ist das erste. Wenn das der Fall ist und alle PWMs 
mittelpunkt synchron sind kannste die PWM Sinuswerte mit 50% auf die 
Brücke geben. Das ist nicht schön sollte aber funktionieren. Von 
richtiger Regelung ist das zwar weit entfernt, aber es ist einfach.

Für richtige Regelung musst du dich etwas belesen.
http://www.mikrocontroller.net/articles/Frequenzumrichter_mit_Raumzeigermodulation 
mal als Anfang.

Ansonsten empfehle ich mal die Begriffe aus meinem ersten Post zu 
googlen.

MfG

Tec

von Mach F. (machfax)


Lesenswert?

Tec Nologic schrieb:
> Wenn das der Fall ist und alle PWMs
>
> mittelpunkt synchron sind kannste die PWM Sinuswerte mit 50% auf die
>
> Brücke geben. Das ist nicht schön sollte aber funktionieren. Von
>
> richtiger Regelung ist das zwar weit entfernt, aber es ist einfach.

Ok, das werde ich machen, danke. Aber vom Prinzip her sind es die 50% 
PWM plus positiver oder negativer Sinus aus der Tabelle entsprechend dem 
Winkel?

Oder wie muss ich das verstehen mit 50% auf die Brücke geben?

von MaWin (Gast)


Lesenswert?

> Muss ich jetzt bei Speed 0 50% duty cycle auf die Pahsen geben

Du meinst damit: Um effektiv 0V an eine Phase zu geben,
schaltest du beide MOSFETs ab, oder verwendet du 50% PWM
wobei je einer nach +24V und der anderen nach 0V für 50%
der Zeit leitet ?

Ja, 50% PWM für effentiv 0V an der Phase.

Der Stromverbrauch sinkt dabei übrigens auf fast 0.

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

jop.

die 50% stellen sich so da. sagen wir du hast 12bit pwm also 0 bis 4095
dann ist die mitte 2048. dein Sinus muss damit ((sin(w*t)*2048)-1) sein. 
damit hast du dann werte von -2048 bis 2047 die versiehst du mit dem 
offset 2048. das bedeutet wenn du sin(0) ausgibst geht auf die pwm 2048 
und sie macht 50% pulse. Wenn alle PWMs synchron sind wackelt dann nur 
dein Sternpunkt der Motorwicklungen von 0 bis 24V mit 50% aber es sollte 
kein Strom durch die Wicklungen fließen. Für andere winkel brauchst du 
natürlich die 120° phase zwischen den Wicklungen aber das hast du ja in 
deinem Excel sheet schon drin.

von Mach F. (machfax)


Lesenswert?

Ok

Danke für die Erklärung!
Icch habe 16Bit, das heisst 50% = 32768.
Also zusammengefasst heisst es dann bei Speex x und gerechnetem Sinus 
von zum Beispiel von zum Beispiel 50'000 gebe ich die 50'000 auf das 
duty cycle der High side und die entsprechende low side lasse ich auf 
32768? Oder schalte ich die low side komplett aus?
Die low side muss dann doch komplett ausgeschlatet sein und erst aktiv 
werden, wenn der Sinus unter 32768 fällt? Dafür dann die Highside 
Treiber ausschalten?

So müsste es doch passen, oder?

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

nee, Low und Highside immer komplementär, also wenn high an ist dann Low 
aus und umgekehrt. bei dem Umschalten musst du auf die Deadtime achten 
die du für die Fets brauchst, sonst hast du beim umschalten einen 
Kurzschluss. Aber vllt machen das deine Fet-Treiber schon wie ist denn 
deine Schaltung gebaut.

MfG

Tec

von Mach F. (machfax)


Lesenswert?

Ok, das habe ich. (mit dead time)
Also schalte ich bei werten über 32768 den high side durch und bei 
werten darunter den low side Fet.
Somit habe ich bei Speed 0 auf high side 50% und low side ebenfalls 50% 
und der Motor steht. Sollte ich irgendwie hinkriegen, danke.
Aber was heisst jetzt folgendes:

Tec Nologic schrieb:
> Wenn das der Fall ist und alle PWMs
>
> mittelpunkt synchron sind kannste die PWM Sinuswerte mit 50% auf die
>
> Brücke geben. Das ist nicht schön sollte aber funktionieren. Von
>
> richtiger Regelung ist das zwar weit entfernt, aber es ist einfach.

Ist doch genau so wie es sein sollte oder macht man das "professionell" 
anders?

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Domi --- schrieb:
> Ok, das habe ich. (mit dead time)
> Also schalte ich bei werten über 32768 den high side durch und bei
> werten darunter den low side Fet.
Nee, die 32768 gibste dem Compare register der PWM einheit für die 
jeweilige phase. und die schaltet dann die Ausgänge für low und highside 
mit 50% bei deiner PWM frequenz.

> Somit habe ich bei Speed 0 auf high side 50% und low side ebenfalls 50%
> und der Motor steht. Sollte ich irgendwie hinkriegen, danke.
> Aber was heisst jetzt folgendes:
>
> Tec Nologic schrieb:
>> Wenn das der Fall ist und alle PWMs
>>
>> mittelpunkt synchron sind kannste die PWM Sinuswerte mit 50% auf die
>>
>> Brücke geben. Das ist nicht schön sollte aber funktionieren. Von
>>
>> richtiger Regelung ist das zwar weit entfernt, aber es ist einfach.
>
> Ist doch genau so wie es sein sollte oder macht man das "professionell"
> anders?
Professinonell geht man von einem Drehzeiger aus. Der Rotor hat sagen 
wir mal den lage winkel von 30° damit der lich jetzt links rum dreht 
muss das elektrische Feld 90° voreilen, also ist der winkel den dein 
Stromzeiger haben muss 30° +90° = 120°.  wenn jetzt Phase a auf 0° liegt 
und Phase b auf 120° uns Phase c auf 240° bzw. -120° liegt. Müssen die 
Phasen c und a --16.6667% Spannung fahren und Phase b fährt 66.6667% 
Spannung. Das ganze nennt sich Raumzeiger-modulation, damit gibst nur 
SpannungsWinkel und Ampitude vor und über den Algo hast du dann die PWM 
Werte.

Nichts desto trotz funktioniert es erst mal auch wenn du 3 120° versetze 
Sinus nach der besprochenen Methode auf dem Motor gibst. Solange er dem 
Feld mechanisch folgen kann wird das gehen. Aber du kannst ihn auch 
leicht anhalten und bei langsamen Drehfeldgeschwindikeiten hast du hohe 
Ströme und der Motor wird leicht ruckeln, das liegt am Rastmoment und 
eben daran das du das Drehfeld bzw. den Motorstrom nicht Senkrecht zum 
Magnetfeld regelst und so der Rotor immer an deinem Drehfeld hängt und 
nur durch das einrasten der Magnete kurz angehalten wird.

MfG

Tec

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Poste mal den Schaltplan dann können wir ja mal gucken wie du das 
richtig machen kannst.

von Mach F. (machfax)


Lesenswert?


von Mach F. (machfax)


Lesenswert?

Das mit der Verschiebung:

Das kann ich machen, indem ich bei der Winkelbestimmung den Offset 
reinnehme, das sollte kein Problem sein. Ich werde einfach die Tabelle, 
nachder entsprechend der Hallsensoren die Winkel bestimmtv werden, 
anpassen bzw. um 90° schieben.

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Das kannst du so machen und es sollte zuverlässig funktionieren.
Ich frage mich gerade nur was dein Ziel ist? Deine Hardware ist 
grundsätzlich für den "richtigen" Weg über eine Feldorientierte Regelung 
geeignet (zumindest die Endstufe) nur hast du genug Rechenpower und 
willst du dich da einarbeiten? Das ist nicht ganz Trivial.

Deshalb wo willst du nachher hin?

MfG

Tec

von Mach F. (machfax)


Lesenswert?

Tec Nologic schrieb:
> nur hast du genug Rechenpower und
> willst du dich da einarbeiten? Das ist nicht ganz Trivial.

Das Problem ist dass ich mit der Blockkommultierung ein Ruckeln auf dem 
Motor habe, sprich eine Unruhe von ca. 1.5%, das ich in der gemessenen 
Geschwindigkeit vom Encoder sehe. Darum bion ich dabei, alles auch 
Sinuskommutierung umzubauen, damit der Motor ruhiger die Phasen 
umschaltet und die Unruhe durch das Schalten der Phasen eliminiert wird.
Dass es nicht ganz Trivial ist ist mir inzwischen auch bewusst, wobei 
den Sinus habe ich schon (dieser im Excel Sheet ist der effektive Sinus 
entsprechend der Motorposition), gerechnet und der entsteht nur wenn der 
Motor läuft und somit die IRQs vom Hall und Encoder erzeugt werden. 
Somit ist die halbe Miete schon gemacht. Das Problem was ich noch habe, 
ist dass ich den SinusWert ins Register schreibe (für das dutycycle vom 
PWM) aber die Software mir irgendwo im Code (und der ist nicht gerade 
klein) wieder auf Blockkommutierung sprich das dutry cycle auf allen 
Phasen identisch überschreibt. Ansonsten müsste es gehen. Der Ausgang 
vom Speed PID wird über die Sinustabelle verrechnet und der Wert im 
Excel Sheet entspricht dem Wert, der auf das PWM Register gsechrieben 
werden muss. Ich bin jetzt am suchen, wo mir die Software 
dazwischenfunkt und den Sinus nicht sauber ausgibt, denn die 1ersten 60° 
sehe ich den Sinus auf dem Oszi, danach aber nicht mehr. und 60° sind 
genau die Differenz zwischen 2 Flanken der Hallsensoren.

Die Software ist auch vorbereitet für Sinuskommutierung, nur wird der 
aktuelle Winkel nicht über den Encoder gerechnet sondern über die 
induzierte Spannung der Phasen (back EMF). Und nach TI ist dies auch 
nicht ganz funktionsfähig. Darum habe ich den Winkel über die 
Hallsensoren plus Encoder Pulse gerchnet und nehme die Routinen der 
Blockkommutierung, nur dass ich den Sinus während eines Blockes auf das 
PWM Register gebe anstatt das duty cycle stabil zu setzen...

Aber ich hoffe kurz vor der Verezweiflung finde ich noch eine Lösung 
dazu...

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

OK,

das hört sich für mich erst mal so an das das laufen könnte, es gibt 
auch von atmel z.b. ne appnote Sinuskummutierung mit Hallgebern.

Ich persönlich hätte bei dem Lastverhalten des ganzen Konstrukts 
Probleme.
In der industriellen Antriebstechnik macht man das eben Feldorientiert. 
Dazu müsstes du ne SVPWM implementieren.

Dazu möchte ich dir diesen Thread anherzlegen, da ist sogar code drin 
den du nur portieren müsstes. Vllt hilft dir das auch noch weiter.
Beitrag "SVPWM mit LPC1769"

Wenn du dazu Fragen hast kann ich dir die bestimmt auch beantworten.

MfG

Tec

von Mach F. (machfax)


Lesenswert?

Ja der Motor dreht mal, aber eben habe ich am Ausgang keinen Sinus (An 
der Motorphase gemessen)
Ich sehe mir den Beitrag mal durch, danke. So wie ich das verstehe, ist 
dieser Code zur Erzeugung der Duty Cyclkes, die ich dann auf diue 
Endstufe geben muss bzw. auf das PWM Register?
Es sieht so aus, wie wenn mein aktueller Code das nicht macht :-(

Also heisst es jetzt für mich Winkel bestimmen und danach in diese 
Funktion einspeisen und den Ausgang wieder zu meinen Programm 
zurückführen...
Da wartet etwas Arbeit auf mich...

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Die oben genannte AVR447 Application Note hilft dir da schon mal. Dort 
wird allerdings überhaupt kein Sinus berechnet, sondern einfach aus 
einer 3er Tabelle ein auf 8-bit normierter Sinuswert für alle 3 Phasen 
geholt, mit der gewünschten Amplitude (Geschwindigkeitssteuerung) 
multipliziert und dann auf die PWM Timer geschickt. Einfach und 
wirkungsvoll. Der Einstieg in die Tabelle wird durch die Hallsensoren 
bestimmt und somit in 6 'Häppchen' aufgeteilt.
Da die gesamte Apllication Note auf einem 8-bitter basiert, ist das 
alles recht effektiv und benötigt keine Echtzeitberechnung von SIN oder 
COS.

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Moin Zusammen,

@Matthias: Jop die AppNote meinte ich.

@Domi: Ja der Code Berechnet anhand von Amplitude und Winkel die PWM 
Dutycycles. Damit ist dann auch die volle Ausnutzung der 24V möglich 
weil die SVPWM die Mittelpunktspannung immer so verschiebt das die 
maximale Spannung gestellt wird. Deshalb auch die "Popo-Kurven", Die 
Phasen gegeneinander gemessen haben aber einen sauberen Sinus.

MfG

Tec

von Mach F. (machfax)


Lesenswert?

Tec Nologic schrieb:
> Moin Zusammen,
>
> @Matthias: Jop die AppNote meinte ich.
>
> @Domi: Ja der Code Berechnet anhand von Amplitude und Winkel die PWM
> Dutycycles. Damit ist dann auch die volle Ausnutzung der 24V möglich
> weil die SVPWM die Mittelpunktspannung immer so verschiebt das die
> maximale Spannung gestellt wird. Deshalb auch die "Popo-Kurven", Die
> Phasen gegeneinander gemessen haben aber einen sauberen Sinus.
>
> MfG
>
> Tec

Hallo Tec

Vielen Dank für die Inputs! Super!
Das heisst nur für mein Verständnis: Wenn ich den Sinus nur um 120° 
verschoben wie in meinem Excel auf die PWM Regsiter gebe, ist das noch 
keine saubere SVPWM, da die Mittelpunktspannung ja nicht geschoben wird? 
Ich habe als Mittelpunktspannung immer die gleiche, da die momentan noch 
nicht angepasst wird... Somit würde sich auch erklären, warum bei mir 
kein Sinus oder nur die ersten 60° ausgegeben werden...
Es genügt also nicht, den Sinus im Excel auf die PWM Regsiter zu geben, 
sondern um einen sauberen Sinus zu erhalten, muss ich die 
Mittelpunktspannung mittels Code vom Post oben ebenfalls 
berücksichtigen?

Danke!

von Rauchzeichen (Gast)


Lesenswert?

Kann mich freilich irren, aber das Vorhaben scheint eher ein Gerücht zu 
sein.

Die einzige elektronisch korrekte Vollbrücke ist ein 4-Quadrantenregler 
mit zusätzlicher Überwachung der Eingangsspannung. Und davon ist dieses 
Projekt (so wie die meisten anderen Vollbrücken) unter Garantie 
meilenweit entfernt.

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Domi --- schrieb:
> verschoben wie in meinem Excel auf die PWM Regsiter gebe, ist das noch
> keine saubere SVPWM, da die Mittelpunktspannung ja nicht geschoben wird?
> Ich habe als Mittelpunktspannung immer die gleiche, da die momentan noch
> nicht angepasst wird... Somit würde sich auch erklären, warum bei mir
> kein Sinus oder nur die ersten 60° ausgegeben werden...
> Es genügt also nicht, den Sinus im Excel auf die PWM Regsiter zu geben,
> sondern um einen sauberen Sinus zu erhalten, muss ich die
> Mittelpunktspannung mittels Code vom Post oben ebenfalls
> berücksichtigen?
Das verschieben der Mittelpunktspannung dient nur dazu die 
Zwischenkreisspannung also die 24V bei dir besser aus zunutzen. Wenn du 
auf deine 16bit PWM register folgende Werte gibst muss da an jeder Phase 
ein sauberer Sinus raus kommen.

PWM1 = 32768*sin(w*t) + 32767;
PWM2 = 32768*sin(w*t + PI/3) + 32767;
PWM3 = 32768*sin(w*t - PI/3) + 32767;

mit w als Drehfrequenz Omega = z.B.: 50Hz*2*PI und t als fortlaufende 
Zeit = z.B.: 0..20ms in z.B. 1ms Schritten und dann wieder bei 0 
beginnend.

Wenn du das alle Millisekunde ausführst, muss deine PWM über ein 
RC-Filter gefiltert reinen Sinus ergeben. Und zwar 3 120°  versetze 
Spannungen.

MfG

Tec

von Mach F. (machfax)


Angehängte Dateien:

Lesenswert?

Hallo Tec

Danke, jedoch wenn ichg deine Formel ins Excvel schreibe, ergibt mir das 
nicht wie bei meinem Excel 120° verschobene Sinusspannungen, sondern 
diese PoPo Form. Das heisst meine Verschiebung von 120° stimmt nicht, 
sondern muss 30° sein? nicht?

(siehe in angehängtem Excel Sinus ganz rechts in der Grafik mit deiner 
Formel.

von Mach F. (machfax)


Lesenswert?

60° nicht 30° meine ich sorry

von Mach F. (machfax)



Lesenswert?

Ich habe die generierten Werte nochmals in ein Excel geloggt. Es hat da 
noch kleine Rundungsfehler drin aber es geht ja im Moment noch ums 
Prinzip. Die Position vom generierten Sinus den ich auf das PWM Register 
gebe zum entsprechenden Hallsensor ist darin ersichtlich. Ist das jetzt 
so wie in der Theorie oder schiebe ich den Sinus bzw. den Winekl auf die 
falsche Seite? Ich bin gerade dabei, aus dem Dokument von James Mevey 
die Antwort darauf zu finden. Aber vielleicht weiss ja hemand auf den 
ersten Blick ob dies korrekt oder nicht ist... Der Motor dreht nämlich 
so, aber macht nicht sehr schöne Geräusche. :-(

Danke fürs Feedback

von Mach F. (machfax)


Lesenswert?

Hallo

Ich werde jetzt wie Tec vorgeschlagen hat, den code SVPWM in mein 
Projekt übernehmen. Ich habe dazu noch eine Frage:
Du hast da eine Anpassung im Code gemacht und folgendes gepostet:

//Spannungsvektor Phase ist phU
  int icos=Cosinus(pM->teta + pM->phU);
  int isin=Sinus(pM->teta + pM->phU);
  //Spannungsvektorbetrag wäre MagU
  pM->valpha=(int)((long long int)pM->MagU*(long long int)isin))>>32);
  pM->vbeta =(int)((long long int)pM->MagU*(long long int)icos))>>32);

Ich erhgalten aus dem PID Regler (Geschwindigkeit) die Amplitude, diese 
gebe ich jetzt auf phU und MagU. Was ist der Unterschied zwischen diesen 
beiden Variablen. Spannungsvektor und Spannungsvektorbetrag steht im 
Kommentar. Ist das bezüglich der Drehrichtung? Ich gehe mal davon aus 
dass bei negativer Drehrichtung der Spannungsvektor auch negativ ist?

Bitte um eine kurze Erklärung dazuz. Vielen Dank.

von F. F. (foldi)


Lesenswert?

Vielleicht hilft dir das weiter.
https://www.youtube.com/watch?v=NyaOAJOG-zw

von Mach F. (machfax)


Lesenswert?

Ebenfalls ist da eine Variable "sector" vorhanden.
Damit kann ich die entsprechendenHigh und LowSide Treiber durchschalten, 
oder?
Ist es folgendermassen?
Sector   Phase
0        U high, V low, W high
1        U high, V low, W low
2
3
4
5

Kann mir jemand datzu eine Tabelle geben?

Danke

von Busbauer (Gast)


Lesenswert?

Das solltest du schon selber hin bekommen. das Magnetfeld sollte 
rotieren...
http://www.mikrocontroller.net/articles/Brushless-Controller_f%C3%BCr_Modellbaumotoren

von Mach F. (machfax)


Lesenswert?

Ja werde ich auch, aber ich dachte eventuell hat schon jemand den Code 
geschrieben und würde diesen zur Verfügung stellen. Das Prinzip ist mir 
schon klar, ich muss es noch implementieren. Trotzdem danke

von Mach F. (machfax)


Angehängte Dateien:

Lesenswert?

Hallo
Ich habe den Code vom Beispiel
Beitrag "SVPWM mit LPC1769"
imoplementiert. Der Winkel wird gemäss dem aktuellen Hallstate und 
Encoder berechnet, die Amplitude entsprechend dem Ausgang vom PID. Meine 
Software arbeitet im Moment noch mit Blockkommutierung, nur zur 
Simulation der Winkelwerte und der Amplitude auf der realen Hardware.
Im Anhang das Excel mit den geloggten Werten. Dies sieht schon mal 
vielversporechend aus, oder hat es da noch Fehler drin? Ich werde diese 
Kurven jetzt auf das PWM Register schreiben und danach mal schauen, was 
mit dem Motor passiert.

Danke & Gruss

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

moin,

jetzt bin ich wieder da:),

Dein ExcelSheet mit der SVPWM sieht ja schon richtig gut aus, bzw. wenn 
der offset von knapp 11000 da noch raus kommt dann ists richtig gut.

Dazu musst du mal nach dem NullVektor gucken, ob der richtig bestimmt 
wird.
Oder falls du noch n Offset drauf geschaltet hast von der alten 
implementierung muss das raus, die SVPWM bestimmt alles selbst.

MfG

Tec

von Mach F. (machfax)


Lesenswert?

Tec Nologic schrieb:
> Dein ExcelSheet mit der SVPWM sieht ja schon richtig gut aus, bzw. wenn
>
> der offset von knapp 11000 da noch raus kommt dann ists richtig gut.
>
>
>
> Dazu musst du mal nach dem NullVektor gucken, ob der richtig bestimmt
>
> wird.
>
> Oder falls du noch n Offset drauf geschaltet hast von der alten
>
> implementierung muss das raus, die SVPWM bestimmt alles selbst.

Hallo

Freut mich wieder von dir zu hören :-)
Der Offset von 11000? Du meist das ganze müsste um 11000 tiefer liegen, 
also um die 0 pendeln?
Ich habe im SVPWM Code die Zeilen mit den BITS schieben rausgenommen, da 
ich ansonsten immer 0 am Ausgang erhalte. Folgende Zeilen:

Die Bits habe ich so definiert:
#define BITS  15  // 32768
#define IMAX 65535

// Offsetverschiebungen rausrechnen und das Ergebnis auf den PWM Bereich
  // scalieren
/*
if (FW == 0)
  {
  n1=(IMAX-dU)>>(30-BITS);
  n2=(IMAX-dV)>>(30-BITS);
  n3=(IMAX-dW)>>(30-BITS);
  }
else
  {
  n1=(IMAX-(IMAX/4+1)-dU)>>(30-BITS);
  n2=(IMAX-(IMAX/4+1)-dV)>>(30-BITS);
  n3=(IMAX-(IMAX/4+1)-dW)>>(30-BITS);
  }
*/

  n1=(IMAX-(IMAX/4+1)-dU);
  n2=(IMAX-(IMAX/4+1)-dV);
  n3=(IMAX-(IMAX/4+1)-dW);

/*
  // Begrenzung der Werte
  if (n1<0) n1=0;
  if (n2<0) n2=0;
  if (n3<0) n3=0;
  if (n1 > (1<<BITS)) n1=(1<<BITS);
  if (n2 > (1<<BITS)) n2=(1<<BITS);
  if (n3 > (1<<BITS)) n3=(1<<BITS);
*/
  pM->dU=n1;
  pM->dV=n2;
  pM->dW=n3;
  pM->sector=sector;

Der NullVektor wird auch in der SVPWM berechnet?

Danke & Gruss

von Matthias L. (Gast)


Lesenswert?

>ist das noch keine saubere SVPWM


Der GRundgedanke hinter eine SVPWM ist folgender:

Der Motorstrom (also der Phasenstrom) ist ja nur entsprechenden 
Phasenspannung irgendwie verschoben. Dieser Strom wird nun in zwei 
Komponenten zurückgerechnet: Eine in Phase zur Spannung, und eine 90° 
nachlaufende. Diese nennt man meist Id und Iq. Aus diesem Grund braucht 
man die aktuelle Rotorposition.

Ziel der SVPWM Regelung ist es jetzt, den Iq-Anteil konstant zu halten, 
denn das ist der 90°versetzte Strom, der das Magnetfeld aufbaut und 
somit erst den Motor in die Lage versetzt, drehen zu können. Weiterhin 
wird versucht, den Id-Anteil den Lastanforderungen nachzufühen.

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Moin,


ich bin nicht mehr ganz so vertraut mit dem Code. Aber so wie deine 
Daten aus sehen werden die Werte dU,dV,dW nur bis 2^15 also 32k, IMAX 
ist 65k und IMAX/4 sind dann knapp 12k. dh deine Werte gehe nur von 48k 
bis 12k mit der Berechnung  n1=(IMAX-(IMAX/4+1)-dU);

Diese Skalierung solltest noch mal genauer angucken. bzw welche 
Amplitude gibste denn vor?

MfG

Tec

von Mach F. (machfax)


Lesenswert?

Tec Nologic schrieb:
> Diese Skalierung solltest noch mal genauer angucken. bzw welche
>
> Amplitude gibste denn vor?

Tec Nologic schrieb:
> Diese Skalierung solltest noch mal genauer angucken. bzw welche
>
> Amplitude gibste denn vor?

ca. 16500

von Mach F. (machfax)


Lesenswert?

PWM Register geht von 0 - 65535

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

jetzt ist die frage wie willst du deine PWM werte zur Amplitude 
Skalieren?

Aus deinen Excel-Daten entnehme ich das du von ca 11k bis 22k auf die 
PWMs gibst. bei 65k-65k/4-x = 11k-22k => dU/dV/dW =  25k - 37k. 
Dementsprechend würde ich die Skalierung des Codes ermitteln also 
Amplitude zu dU/dV/dW.


nichts desto trotz sollte der Motor drehen, denn das Offset ist ihm egal 
den interessiert nur die Spannung zwischen den Phasen.

von Mach F. (machfax)


Lesenswert?

Ja der Motor sollte drehen, bin ich auch der Meinung, macht er aber noch 
nicht, da ich die entsprechenden Fets noch nicht korrekt durchschalte 
bzw. High-LowSide aktiviere. Dies kann ich aufgrund der sector variable 
machen oder? Wie ist da der Zusammenhang zwischen Variable sector und 
HighLowSide Fets? Sector geht von 0-5, und die Fets High und LowSide von 
U,V,W müssten dementsprechend geschaltet werden oder?

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

nein eben bei dem SVPWM nicht mehr. dU dV dW kannste direkt auf dem PWMs 
geben. und da dan Low und High side immer komplementär schalten.


mit dem Sektor wird bei der SVPWM bestimmt welche Raumzeiger ausgewählt 
werden. jenach dem wo der Winkel in dem Sektor liegt werden die 
Raumzeiger gewichtet. Die Amplitude ist dann das Verhältnis der 
Raumzeiger zum Nullzeiger. Aus den Zeigerverhältnissen werden dann die 
Einzelkomponenten für die jeweilige Phase bestimmt. Eine Phase (U,V,W) 
meint eine Halbbrücke. Diese Brücke schaltet dann immer entweder Low 
oder Highside. Das Verhältnis ist dabei eben der PWM duty cycle. 
Dementsprechend Rechnet der Code dir alles aus du musst nur die werte 
auf die PWMs geben.

 pM->dU=n1;
  pM->dV=n2;
  pM->dW=n3;

in dem code aus dem anderen Thread. weiter unten werden dann die Werte 
in die PWM register geschoben.

von Mach F. (machfax)


Lesenswert?

Tec Nologic schrieb:
> nein eben bei dem SVPWM nicht mehr. dU dV dW kannste direkt auf dem PWMs
>
> geben. und da dan Low und High side immer komplementär schalten.


Ok, dann werde ich alle PWM Ausgänge aktivieren und die gerechneten dU, 
dV und dW direkt auf die Register schreiben.

>Eine Phase (U,V,W) meint eine Halbbrücke. Diese Brücke schaltet dann >immer 
entweder Low oder Highside.

Ok, das heisst Low und Highside ist entsprechend dem duty cycle 
geschaltet, richtig?
Werde ich heute Abend ausprobieren.

von Mach F. (machfax)


Lesenswert?

Tec Nologic schrieb:
> mit dem Sektor wird bei der SVPWM bestimmt welche Raumzeiger ausgewählt
>
> werden. jenach dem wo der Winkel in dem Sektor liegt werden die
>
> Raumzeiger gewichtet.

Der Sector wird aber nur geschrieben, und im Code nirgends verwendet 
bzw. ausgelesen, ist dies nur als Debug-Funktion gedacht?

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Denke ich auch,

Ich muss dazusagen ich habe den code selbst nicht ausporbiert. fand ihn 
aber rechtsimpel implementiert.

von Mach F. (machfax)


Lesenswert?

Tec Nologic schrieb:
> nein eben bei dem SVPWM nicht mehr. dU dV dW kannste direkt auf dem PWMs
> geben. und da dan Low und High side immer komplementär schalten.

Das sollte das PWM Register übernehmen? Ich muss mich mal durchs 
Datenblatt vopm Chip kämpfen, denn jetzt blockiert der Motor, Aber 
eventuell muss ich da noch was mit den Register ändern. Denn wenn ich 
das gerechnete duty cycle auf das Register gebe, sind immer Low und High 
side aktiv (schon komplementär, habe keinen Kurzschlus... :-)   )

Kennt jemand eine Grafik, wo ich die Ansteuerung der Gates von den FETs 
(High und LowSide) im Vergleich mit den Hallsensoren sehe? Danach suche 
ich schon eineige Zeit, habe aber für die Sinuskommutierung noch nichts 
gefunden...

Grüsse

von Mach F. (machfax)


Lesenswert?

Ich gebe die duty cycles auf folgende Funkion (für das PWM Register)

// Sets the duty cycle of the generated PWM waveforms.
//
// \param ulDutyCycleA is the duty cycle of the waveform for the U phase 
of
// the motor, specified as a 16.16 fixed point value between 0.0 and 
1.0.
// \param ulDutyCycleB is the duty cycle of the waveform for the V phase 
of
// the motor, specified as a 16.16 fixed point value between 0.0 and 
1.0.
// \param ulDutyCycleC is the duty cycle of the waveform for the W phase 
of
// the motor, specified as a 16.16 fixed point value between 0.0 and 
1.0.
//
// This function configures the duty cycle of the generated PWM 
waveforms.
// The duty cycle update will not occur immediately; the change will be
// registered for synchronous application to the output waveforms to 
avoid
// discontinuities.

Somit müsste ich als Imax doch 4'294'967'295 haben oder? Und als Bits 
define = 15?

Oder sehe ich das falsch? Der Motor blockiert, aber mein Wertebereich 
stimmt doch nicht?

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Das kann ich dir nicht mehr beantorten ohne deinen Code gesehen zu 
haben.
Du sollstes dir aber mal die Werte von dU/dV/dW vor der Berechnung mit 
IMAX mal mit loggen um mal zusehen was kommt ohne Skalierung da raus. 
Und dann kannst du die Skalierung so machen wie du sie brauchst.

MfG

Tex

von Mach F. (machfax)


Angehängte Dateien:

Lesenswert?

Hallo Tec

Ich habe es jetzt zum drehen gebracht, Phase V und W im Code war 
veratuscht... (Ich könnte mich...)
Auf jeden Fall habe ich noch keinen Sinus auf der Endstufe, aber ich 
habe noch eine Frage zur Verschiebung der Spannungen und Hallsesnosren.

Im angehängten Excel sieht man, dass das PWM Register mit dem 
Hall-Signal verschoben ist. Ist das korrekt? Oder müsste das nicht 
symetrisch (PWM nach rechts geschoben sein?)

Danke

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Moin,

Erstmal Glückwunsch zum drehenden Motor.


Zu deiner Verschiebung die ist in der Tat so nicht gedacht.
Aber diese Verschiebung erzeugt einen Strom und deshalb dreht der Motor 
weil Magnetfeld vom Rotor und Elektrisches Feld nicht über einander 
liegen.

Mein erster Tipp ist deine Winkelinterpolation, also wie generierst du 
aus den Hallsensoren den Winkel für die SVPWM berechnest?

Wenn du das geklärt hast hast du mehrere Möglichkeiten.

Du addierst/subtrahierst zu dem korrekten Rotorwinkel 90° damit das 
elektrische Feld senkrecht zum magnetischen steht. (ist nicht ganz 
korrekt aber für den Anfang ok). Damit dreht der Motor rein gesteuert 
aber er sollte erstmal stabil drehen auch bei Last. Nur das unter Last 
die Verluste im Motor steigen.

Die richtige Variante wäre die feldorientierte Regelung. In dem Code aus 
dem du die SVPWM hast sind die nötigen Funktionen enthalten.

Grundsätzlich gehts darum den Strom pro Phase zu messen, den Winkel und 
die Amplitude des Stromes zu bestimmen. Dann wird der Strom in das 
Koordinaten System des Rotors transformiert und dort kannst du ihn dann 
so regeln das er immer 90° Phase zum Rotor hat.

Damit sind dann auch Dinge wie rekuperatives Bremsen und Andere Tolle 
Sachen :) möglich.

MfG

Tec

von Mach F. (machfax)


Lesenswert?

Hallo Tec

Danke für deine immer sehr informative Antworten!

Zum Strom:
Im Code hast du mal eine Anpassung vorgenommen:
/*
  //Spannungsvektor Phase ist phU
  int icos=Cosinus(pM->teta + pM->phU);
  int isin=Sinus(pM->teta + pM->phU);

  //Spannungsvektorbetrag wäre MagU
  pM->valpha=(int)(((long long)pM->MagU*(long long)isin)>>32);
  pM->vbeta =(int)(((long long)pM->MagU*(long long)icos)>>32);
  */

  /*
  Ich hab mir mal deinen Code angesehen, sieht ganz gut aus, für die
  Vorgabe von Phase und Amplitude müsstest du nur deine InvPark umbauen
  wie ich das oben mal getan habe. Wäre toll wenn du das Mal Probieren
  könntest. Ich hab das bisher nur Simuliert :)
  */

Ich arbeite aber momentan noch mit diesem Code:
int icos=Cosinus(pM->teta);
  int isin=Sinus(pM->teta);
  pM->valpha=(int)((((long long int)pM->MagU*(long long int)icos)-((long 
long int)pM->MagU*(long long int)isin))>>32);
  pM->vbeta =(int)((((long long int)pM->MagU*(long long int)icos)+((long 
long int)pM->MagU*(long long int)isin))>>32);

Origianl stand da vQ und vD drin. was ist vQ und vD? Beziehungsweise wo 
kann ich den Strom plus Amplitude vorgeben? Denn ich habe als Input für 
den SVPWM nur eine Amplitide aus dem PID Regler der Geschwindigkeit und 
eine Phasenlage von 0-359.


Du schreibst:
Grundsätzlich gehts darum den Strom pro Phase zu messen, den Winkel und
die Amplitude des Stromes zu bestimmen. Dann wird der Strom in das
Koordinaten System des Rotors transformiert und dort kannst du ihn dann
so regeln das er immer 90° Phase zum Rotor hat.


Ich habe aber in der SVPWM nur Amplitude und Winkel als Input, wo soll 
ich denn den Strom übergeben? Amplitude kommt wie gesagt aus dem Speed 
PID. Stromregler habe ich gar nicht, müsste ich implementieren. Aber da 
ich eine Geschwindigkeitsregelung möchte muss ich auch den Soll mit dem 
IstSpeed verrechnen und den Ausgang von diesem PID auf die SVPWM geben 
oder liege ich da falsch?

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

OK,

noch etwas zu den Grundlagen. Du hast drei Phasen A, B, C. jede Phase 
hat einen Strom i_A, i_B, i_C und eine Spannung U_A,U_B,U_C. Das 
elektrische Feld
bildet sich auf Grund des Stromes, folglich musst du den Strom in den 
Phasenregeln um das elektrische Feld zu regeln.

Für eine Antriebsmaschine hast du noch zusätzliche Randbedingungen, die 
Phasen sind 120° versetzt angeordnet und bilden einen Sternpunkt. Wenn 
der Sternpunkt nicht rausgeführt ist dann muss die Knotengleichung 
0=i_A+i_b+i_C erfüllt sein. Wenn du dir die Gl ansiehst, dann brauchst 
du nur 2 Ströme kennen um auf den 3. zu schließen. Dies nutzt man bei 
der Clark-Transformation das bedeutet du machst aus den i_A,i_B,i_C mit 
120° Phase i_Alpha und i_Beta mit 90° Phase (also Vektor 
[i_Alpha;i_Beta] in einem normalen Koordinatensystem). Dies ist dann der 
Strom Vektor den du auch in Polarkoordinaten angeben kannst also 
Amplitude und Winkel.

Da sich alles immer dreht ist das etwas ungünstig für lineare Regler 
also macht man nen Kniff. Die Park-Transformation, also man nimmt den 
Vektor mit [i_Alpha;i_Beta] und transformiert ihn in das drehende 
Rotor-Koordinatensystem. Dafür brauchst du den Rotorwinkel normaler 
Weise. Der Vektor der sich ergibt ist [i_d;i_q]. Wobei das "d" für 
"direct" steht also die Stromkomponente parallel zum Magnetfeld meint. 
Für maximales Drehmoment muss dieser 0 sein. Und "q" steht für "quer" 
und meint die Stromkomponente senkrecht zum Magnetfeld. Also den 
drehmomentbildenden Strom.

Zur Regelung:

Wenn du deine Phasen-Ströme nach i_d und i_q transformiert hast, kannste 
die mit PI-Reglern regeln (q zu 0 und d auf soll Strom/Drehmoment). Die 
Stellgröße die aus dem Reglerkommt ist U_d und U_q. Die werden Invers 
Park-transformiert das macht die Funktion in dem Code:
1
// das Ergebnis wird in pM->valpha und pM->vbeta gespeichert
2
// das >>32 anstelle >>31 bedeutet, dass valpha und vbeta durch
3
// 2 geteilt wird um ein �berlauf des Wertebereiches zu verhindern
4
void ParkInv(struct McParm *pM)
5
{
6
  int icos=Cosinus(pM->teta);
7
  int isin=Sinus(pM->teta);
8
  pM->valpha=(int)((((long long int)pM->vD*(long long int)icos)-((long long int)pM->vQ*(long long int)isin))>>32);
9
  pM->vbeta =(int)((((long long int)pM->vQ*(long long int)icos)+((long long int)pM->vD*(long long int)isin))>>32);
10
}

Und die Clarktransformation der Spannungen U_Alpha und U_Beta macht die 
SVPWM.

Damit schließt sich der Regelkreis über den Antrieb.

Demnach kannst du fürs erste einfach pM->vD = 0; setzen und pM->vQ auf 
einen Spannungssollwert/Amplitude.

Die Impelentierung die Ich in dem Thread vorgeschlagen hatte gibt die 
Phase zum Rotorwinkel in phU vor, hier = 90° (Skalierung beachten), und 
die Amplitude(Magnitude) MagU vor.

Ich hoffe es wird etwas klarer wie das alles zusammen hängt

MfG

Tec

von Mach F. (machfax)


Lesenswert?

Do mi schrieb:
> Tec Nologic schrieb:
>> nein eben bei dem SVPWM nicht mehr. dU dV dW kannste direkt auf dem PWMs
>> geben. und da dan Low und High side immer komplementär schalten.
>
> Das sollte das PWM Register übernehmen? Ich muss mich mal durchs
> Datenblatt vopm Chip kämpfen, denn jetzt blockiert der Motor, Aber
> eventuell muss ich da noch was mit den Register ändern. Denn wenn ich
> das gerechnete duty cycle auf das Register gebe, sind immer Low und High
> side aktiv (schon komplementär, habe keinen Kurzschlus... :-)   )
>
> Kennt jemand eine Grafik, wo ich die Ansteuerung der Gates von den FETs
> (High und LowSide) im Vergleich mit den Hallsensoren sehe? Danach suche
> ich schon eineige Zeit, habe aber für die Sinuskommutierung noch nichts
> gefunden...
>
> Grüsse

Hallo

Nochamls kurz zum Verständnis bezüglich der Ansteuerung der Endstufe.
Wenn ich auf dem Treiberbaustein das HighSide und LowSide Signal messe, 
habe ich immer über die vollen 360° beide Gates angesteuert. Meiner 
Meinung nach müsste aber das HighSide nur die ersten 180° angesteuert 
sein und die Low Side von 180-360°. Jetzt habe ich immer das komplemtäre 
duty cycle von High side auf der LowSide, und das über den ganzen 
Bereich. Scheinabr macht das mein Chip nicht automatisch.
Nur dass ich jetzt nicht wieder falsch liege, frage ich mal nach.
Gibt es irgendwo eine Grafik wie die HighSide und LowSide Signale an den 
Gates entsprechend dem Drehwinkel liegen müssen?

Danke & Gruss

von Mach F. (machfax)


Lesenswert?

Hallo

Kurz eine Frage zur Endstufe:

Ich habe jetzt den Sinus zwischen Phase U und V. Jedoch mitz sehr vielen 
Störungen (Spikes) auf der Messung.
Meiner Meinung nach sollte am Ausgang ein Filter mit L und C eingebaut 
werden, um diese Spikes zu filtern. Liege ich da richtig? Wie sollte so 
ein Filter aussehen? L in Serie zm Motor debke ich mal, oder?

Danke & Gruss

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Moin,

Den Filter brauchste nicht das macht die Motorwicklung. Wenn du die EMV 
etwas senken willst kannste n Snubber einbauen, also ne RC kombi von 
jeder Phase auf Masse. Sowas 10k zu 10nF. Das man die PWM sieht ist 
mormal. Wenn du höhere Spikes als deine 24V hast dann kommen die Spikes 
aus den Deadtimes der Halbbrücken, wenn kein Fet aktiv ist. Das bedeutet 
deine Freilaufdioden sind zu lahm das kann dir auf dauer die Fets 
zerstören. Sind in der Endstufe überhaupt Freilaufdioden drin? oder nur 
die Bodydioden der Fets? Check das mal.

Ansonsten zuerst mal den Snubber setzen.

Was die PWM angeht. Die läuft immer Komplementär zu jedem Zeitpunkt. 
Denn wenn der Treibende Fet nicht aktiv ist muss der Motorwicklung ein 
Freilaufpfad gewährt werden. bei deinen Spikes ist dieser Pfad zeit 
weise nicht da, dann baut die Spule Spannung auf(Spikes). Die führt man 
üblicher weise über eine Freilaufdiode ab. Da aber selbst ne Schotky 
0,2V U_f hat ist ein geschalteter Fet immer noch effizienter und 
entlastet die Diode -> kleinere Diode notwendig usw. Bei n Paar kW 
Leistung kommste da nicht mehr drum rum. Das Ganze wird oft als Aktiver 
Freilauf beworben. Sieh dir auch mal die Ströme an die sind am 
interessantesten, wenns um die Funktion geht.


MfG

Tec

von Mach F. (machfax)



Lesenswert?

Hallo
Ich bin immer noch mit dem Sinus am kämpfen... Oder der Sinus mit mir 
:-(

Ich habe jetzt die FETs komplementär geschlatet. Somit sind die 
Störungen weg, das heisst der Freilauf wird über die FETs gemacht, wie 
Tec ja schon geschrieben hat. Ich habe jetzt ein korrektes duty cycle 
auf den Gates der FETs. Wenn ich jetzt die Phasenspannungen messe, sehe 
ich da aber nur das generierte duty cycle und weder eine Glättung oder 
einen Sinus. Ich sehe im Moment nicht, warum dies so ist, denn die duty 
cycles werden korrekt generiert und auf die Endstufe bzw. die Phasen vom 
Motor gegeben.
Meine Endstufe wird mit 24V und 0V angesteuert:

Schema ist hier abgelegt: (S.65)
http://www.ti.com/lit/ug/spmu033c/spmu033c.pdf

Somit habe ich einen theoretischen Nullpunkt von 12V. Wenn ich also mit 
50% duty cycle High side und Lowside ansteuere, bin ich mit der 
Motorenspannung genau in der Mitte, somit dreht der Motor nicht und 
blockiert. Das stimmt ebenfalls. Beim Starten wird jetzt die positive 
Halbwelle auf diese 50% dazugerechnet und die negative von diesen 50% 
abgezogen und so die Fets angesteuert. Ist der High-Side Fet aktiv, so 
ist der LowSide Fet inaktiv und umgekehrt.

Mit den Messunegn im Anhang dreht der Motor auch, nur dass ich eben den 
Sinus nicht sehe. Liegt es vielleicht daran, dass ich die Phasenspannung 
messe und nicht den Strom?

Danke für die Hilfe!

von Tecnologic (Gast)


Lesenswert?

Mo in Domi.


Für den Motor ist die Spannung egal. Es geht nur um den Strom und der 
sollte jetzt Sinusförmig sein. Was du da siehst ist die pwm. Also eine 
mit einem sinus überlagerte pwm. Das ist alles richtig so.

Freut mich das de Fortschritt machst.

MfG

Tec

von Mach F. (machfax)


Lesenswert?

Hallo Tec

Aber die Spannung muss so aussehen? Ist das korrekt?
Ich bin etwas verwirrt, denn hier sieht die Spannung anders aus:
Beitrag "SVPWM mit LPC1769"

Oder ist das auch der Strom?

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Ne das ist schon die Spannung nur gefiltert. Die Spannung am Motor muss 
so aus sehen. Da ist ja kein Kondensator der das glätten könnte und die 
Motorspulen interessieren sich eh nur für den strom.

von Mach F. (machfax)


Lesenswert?

Ok, verstehe. Aber gefiltert? Das muss ja extrem gefiltert sein damit 
ich aus meinen PWM Signalen einen Sinus erhalten würde? Meine Messung 
ist ja auch direkt über den Motorenspulen gemacht, aber sieht überhaupt 
nicht nach einem Sinus aus. Ich versuche es mal wenn ich wirklich den 
Strom messe, was da so passiert...
Danke

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

naja so wie ich das sehe sind die werte vllt auch ausm DAC, aber ist 
auch egal, der strom ist wichtig

von Mach F. (machfax)


Angehängte Dateien:

Lesenswert?

Hallo

Ich habe jetzt den Strom gemessen. (siehe Bild)
So wie ich sehe, stimmt die PWM Frequenz noch nicht, ist das korrekt?
Wie stelle ich diese ein? -> Berechnung?
Danke!

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Moin,

Was für eine PWM Frequenz hast du denn?, Und was Für eine Induktivität 
hat dein Motor? Kennst auch den Innenwiderstand der Windung. Dann haste 
die Zeitkonstate einer Windung. Aber das sieht doch schon ganz gut aus. 
Wenn du mit Industriefrequenzen wie 8Khz oder so arbeitetst siehts oft 
schlimmer aus. Ich glaube du verrennst dich dazu sehr. Trace mal lieber 
deine Berechneten Daten mit die auf die PWMs gehen.

MfG

Tec

von Mach F. (machfax)


Lesenswert?

Ich habe aktuell 50kHz.
Motor hat eine Induktivität von 0.31mH pro Windung, Widerstand = 3.65 
Ohm.

http://www.maxonmotor.ch/maxon/view/product/combine/166935?code=166935&code=272768

Danke

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

50kHz sind auf jeden Fall genug. Was ist jetzt eigendlich dein Problem? 
Das du die PWM am Ausgang siehst ist normal. Man sieht das du schön den 
strom in den Motor fährst.

Ist der Motor stabiel unter Belastung? macht er Geräusche?

MfG

Tec

von Mach F. (machfax)


Lesenswert?

Hallo

Ich dachte ich muss den Strom ohne PWM sehen, sprich wie in der SVPWM 
den Sinus ohne die Störungen darunter, keiene ausgefüllte Kurve sondern 
eine Linie. Ja der Motor dreht schön, wie stabil muss ich noch 
anschauen.

Gruss

von Mach F. (machfax)


Lesenswert?

Ich meine einen Sinus ohne die ausgefüllte Fläche darunter...

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Naja wo hast du den Strom gemessen? Aber Strom rippel ist immer da: 
Normalerweise wägt man dann zwischen EMV(Steile Flanken), 
Schaltverluste(Hohe PWM Freq.), und Stromrippel(Drehmomentwelligkeit) 
ab.

von Mach F. (machfax)


Lesenswert?

direkt über dem Shunt Widerstand der H-Brücke

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Ich würde an deiner Stelle nicht so viel drauf geben. Hast du mal HF 
Reject bei deinem Scope eingeschaltet. Denn so saubere Bilder wie sie 
der Jürgen mit dem scope in dem anderen Thread geamcht hat. habe ich 
bisher bei den ganzen Maschinen die ich kenne nicht gesehen. Gut das 
sind alles Servos mit >2KW aber trotzdem. Vllt kann dein Scope ja bei 
10kHz abschneiden.

MfG

Tec

von Mach F. (machfax)



Lesenswert?

Hallo Tec, ok versuche ich mal, ich werde den Speed mnal loggen und dann 
sehe ich ja wie stabil der Motor läuft. Jedenfalls ist es jetzt so, dass 
der Motor um Welten mehr Drehmoment hat, mit den gleichen Einstellungen 
vom PID REgler. Im Anhang einmal die Blockkommutierung und einmal die 
Sinuskommutierung.

Grüsse

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Das doch schon mal ne Information. Aber die negative Halbwelle sieht 
etwas kleiner aus als die Positive. Da das bei der Blockkommutierung 
auch so ist, solltest du mal gucken ob das n Messfehler ist oder n HW 
fehler.

MfG

Tec

von Mach F. (machfax)


Angehängte Dateien:

Lesenswert?

Der OP war am Anschlag...
Dieser Plot ist symetrisch...

von Mach F. (machfax)


Lesenswert?

Ich messe den Strom am Ausgang eines nicht invertierenden Verstärkers. 
Aber der OP wurde übersteuert. Habe darum den Shunt-R halbiert. Jetzt 
passt die Messung. Bringt eine Induktivität in Serie zur Motorenwicklung 
etwas? Ich würde mal 3x100uH Versuchen, der Motor hat ja 310uH.

Gruss

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Die Induktivität bring vllt was für die messung ist aber ansonsten 
unsinn.
Nimm n Tp 2. Ornung auf 10kHz und das ist sauber. Vllt reicht schon 1. 
Ordnung bei 50KHz.

von Mach F. (machfax)


Lesenswert?

Hallo. Den TP nur für die Messung oder bringt er am Motor effektiv 
etwas?
Ich würde einen LC TP nehmen, L in Serie und danach kleines C gegen 
Masse.
Gruss

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Moin,

den TP nur für die Messung der bringt ja ne Phasenverschiebung rein, 
damit kommt der Regler Eventuell nicht klar. Und dem Motor ists egal. N 
Industrie WR hat zwar auch n LC oder LCL Am Ausgang, aber das nur wegen 
EMV.

MfG

Tec

von Jörg E. (jackfritt)


Lesenswert?

Ich bin zwar nur Stiller Mitleser aber ein Lob an euch möchte ich 
trotzdem loswerden.
Am liebsten hätte ich das ganze Thema als Lesenwert markiert!
Nochmals danke für die Füllung meiner Wissenslücken ;)

von Ert (Gast)


Lesenswert?

>Ich habe aktuell 50kHz.

>Icch habe 16Bit, das heisst 50% = 32768

Sicher?

Kommt mir sehr sehr viel vor.

D.h. deine Timer-Clock müsste mit 3,276GHz laufen... evtl hätt ich auch 
mit TI anfangen sollen^^ und dann ist das PWM es noch nicht einmal 
mittenzentriert...

Habe eben 2min gegoogled. Max f bei dem M3 ist 20kHz. und dann ist die 
frage ob der dann wirklich auf 2^16 vergleichen kann... Ich arbeite mit 
dem STM und der schafft keine 13bit auf 18khz

von Mach F. (machfax)


Lesenswert?

Nein sind nicht 16 Bit, wird danach entsprechend der PWM Frequenz 
skaliert, habe ich zu diesem Zeitpunkt nicht gesehen...

Aber trotzdem Danke

von Mach F. (machfax)


Lesenswert?

Hallo

Ich habe jetzt den Sinus auff dem Motor.
Jedoch läuft dieser immer noch nicht stabil. Ich habe jetzt den 
kompletten Regelkreis geöffnet und steuere mit einem fixen Sollwert den 
Motor an. Dieser hat aber immer noch Schwankungen drin.
Die Ursache wird daran liegen, dass der Strom vom Sinus nicht exakt mit 
der Rotorlage übereinstimmt. Das heisst, dass wenn der Rotor genau 
oberhalb der Spule ist, muss der Sinus am Scheitelpunkt sein sprich der 
höchste Strom muss durch die entsprechende Spule fliessen. Je nach Motor 
ist die Phasenverschiebung unterschiedlich. Wie stelle ich diese ein?
In der svpwm Routine ist ja der Cosinus integriert, der anhand des 
aktuellen Stromes die Winkelverschiebung vom Sinus einstellt.. Kann ich 
also "einfach" den aktuellen Motorenstrom auf diese Funktion geben und 
somit wird die Phasenverschiebung immer nachgerechnet und geschoben, 
damit ich immer mit dem Scheitelpunkt vom Sinus genau in der Mitte bin?
Ich frage mich gerade, wie man das in der Praxis macht. Bei 
Frequenzumrichter wird ja der cos Phi vom Typenschild auf dem Motor 
eingestellt. Wie passiert dies mit dem SVPWM und einem BLDC Motor?

Danke und Gruss

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Diese Routinen du meinst sind für die feldorientierte Regelung und genau 
das musst du jetzt machen. Ströme messen, transformieren, Id/Iq Regeln, 
und Ud/Uq mit der SVPWM auf die PWMs geben.

MfG

Tec

von Mach F. (machfax)


Lesenswert?

> Id/Iq Regeln,
> und Ud/Uq mit der SVPWM auf die PWMs geben.

Hallo
Danke wie immer für die Inputs.
Das heisst ein Regler für den Strom einbauen. Id und Iq regeln und die 
Abweichung in die SVPWM Routine geben.
Ud/Uq ist ja in der SVPWM soweit ich verstehe schon vorbereitet. 
Regelfehler sollte also 0 sein, dann gibt es keine Phasenverschiebung.

Zum für den Regler:
Was ist da der Sollwert? IstWert ist ja der aktuelle Motorenstrom? Und 
der Ausgang wird dann in die SVPWMRoutine gegeben, oder?

von Mach F. (machfax)


Lesenswert?

Hab die Antwort im Post weiter oben gefunden, sorry

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Id ist der Strom in Phase mit dem Rotor, der sollte also 0 sein, und Iq 
ist der Strom Quer zum Rotor und das ist der Drehmomentbildende Strom.

von Mach F. (machfax)


Lesenswert?

Tec Nologic schrieb:
> Id ist der Strom in Phase mit dem Rotor, der sollte also 0 sein, und Iq
> ist der Strom Quer zum Rotor und das ist der Drehmomentbildende Strom.

Und dementsprechend die Geschwindigkeit...?

von Matthias L. (Gast)


Lesenswert?

>Id ist der Strom in Phase mit dem Rotor, der sollte also 0 sein, und Iq
>ist der Strom Quer zum Rotor und das ist der Drehmomentbildende Strom.


Ist das so?

Ich dachte immer, Id ist in Phase zur aktuellen Rotorposition und der 
Erzeugt das Drehmoment und wird je nach Last geregelt.

Und Iq ist quer (90°) zur aktuellen Rotorposition und erzeugt das 
Magnetfeld umd dieses Drehmoment erzeugen zu können. Das wird dann 
konstant gehalten.

Deshalb gibt es bei kleinen Drehzahlen auch den Boost-betrieb, wo mehr 
Spannung als U/f zulassen würde, zugelassen wird, um Verluste 
(Wicklungswiderstande etc) auszugleichen und Id und Iq 
aufrechtzuerhalten...

Oder verwechsel ich da was?

von Matthias L. (Gast)


Lesenswert?

>Und dementsprechend die Geschwindigkeit...?

Nicht ganz. Die Drehzahl ist das an der Welle überschüssige Moment 
aufsummiert. Wenn die Last als xNm braucht, und du durch die Regelung 
genau xNm bereitstellst, dann bleibt die Drehzahl wie sie ist. Der der 
Iq/Iq überlagerte Drehzahlregler muss also das "Solldrehmoment" 
(=Sollstrom) zeitweilig entsprechend erhöhen um Beschleunigungsarbeit 
leisten zu können...

von Mach F. (machfax)


Lesenswert?

Ok, aber dann wird so wie ich verstehe die Geschwindigkeit über den 
Strom geregelt und nicht über die Encoder-Impulse wie in den meisten 
"einfachen" Beispielen gemacht wird. Es funktioniert zwar über die 
Encoder Frequenz, jedoch eben nicht stabil genug für gewisse 
Anwendungen...

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Matthias Lipinsky schrieb:
>>Id ist der Strom in Phase mit dem Rotor, der sollte also 0 sein, und Iq
>>ist der Strom Quer zum Rotor und das ist der Drehmomentbildende Strom.
>
>
> Ist das so?
>
> Ich dachte immer, Id ist in Phase zur aktuellen Rotorposition und der
> Erzeugt das Drehmoment und wird je nach Last geregelt.
>
> Und Iq ist quer (90°) zur aktuellen Rotorposition und erzeugt das
> Magnetfeld umd dieses Drehmoment erzeugen zu können. Das wird dann
> konstant gehalten.
>
> Deshalb gibt es bei kleinen Drehzahlen auch den Boost-betrieb, wo mehr
> Spannung als U/f zulassen würde, zugelassen wird, um Verluste
> (Wicklungswiderstande etc) auszugleichen und Id und Iq
> aufrechtzuerhalten...
>
> Oder verwechsel ich da was?
Also ich gehe von einer permanenterregten Synchronmaschine aus. Und bei 
der muss das elektrische Feld dem des Rotors um 90° voreilen für 
maximale Effizienz. In Strömen ausgedrückt. Id ist 0 und Iq =  M * K. Id 
fast du nur an um beispielsweise einen negativen Id vorzugeben um dem 
Magnetfeld entgegen zu wirken um es abzuschwächen und dann mehr Drehzahl 
machen zu können. In Rotorwinkeln bedeutet das, dass das elektrische 
Feld mehr als 90° vor eilt dementsprechend sinkt das Drehmoment und die 
erreichbare Drehzahl steigt. weil der Betrag der induzierten Spannung 
sinkt gegen über einen Id = 0.

MfG

Tec

von Mach F. (machfax)


Lesenswert?

Eine kurze Frage zur SVPWM.

Ich habe diese Struktur:
struct McParm
{
  int dU;
  int dV;
  int dW;
  int vD;
  int vQ;
  int valpha;
  int vbeta;
  int MagU;  //Spannungsvektorbetrag wäre MagU
  int phU;  //Spannungsvektor Phase ist phU
  int teta;
  int sector;
};

Der gemessene Strom der Phasen muss ich in dU, dV und dW schreiben?
Winkel ist teta ist klar und vD und vQ sind die Werte die aus dem PID 
Regler kommen.

Danke

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Hi Domi.

Jop  u v w scheinen die phasenströme zu sein. Ich finde die Namen etwas 
nichts sagend aber der weitere code deutet drauf hin.

MfG

Tec

von Mach F. (machfax)


Lesenswert?

Hi Tec

Ok, danke. Das heisst aber es sind direkt die ADC Werte, die ich über 
den Shunt messe? Oder muss ich diese noch skalieren oder schieben, damit 
ich positive und negative Werte habe oder so?

von Mach F. (machfax)


Lesenswert?

Hi Tec

Trotzdem kurz ne Frage, sorry:

int MagU;  //Spannungsvektorbetrag wäre MagU
int phU;  //Spannungsvektor Phase ist phU

Wo schreibe ich also jetzt den gemessenen ADC Wert vom Strom hin?
MagU oder phU?

Danke

von Mach F. (machfax)


Lesenswert?

Hi
Ich habe es jetzt so programmiert, dass ich den Phasenstrom messen kann 
und somit komplett die Feldorientierte Regelung benutzen kann.

Also kurz zum Struct. Ich habe ja folgende Inputs:
Amplitude, Strom U, Strom V, Strom W, Winkel, vd und vq aus PID Regelung

Das bedeuted dann hier folgendes:

struct McParm
{
  int dU; Strom U
  int dV; Strom V
  int dW; Strom W
  int vD; aus PID
  int vQ; aus PID
  int valpha; Winkel von Rotor
  int vbeta;
  int teta;
  int sector;
};

Es gibt jetzt aber noch:
int MagU;  //Spannungsvektorbetrag wäre MagU
int phU;  //Spannungsvektor Phase ist phU
Was genau ist bitte MagU und phU?

Danke

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Sry aber genau kenne ich den code auch nicht mehr.

MagU ist die Spannungsamplitude.
PhU ist die Phase der Spannung Also die vorgaben für die modifizierte 
Svpwm die ich in dem anderen thread mit dem Autor diskutiert habe.


Aber mal dir die Regelung mal auf und implementier es selbst. Der code 
aus dem thread ist sehr unvollständig. Lediglich der aus dem vorletzten 
post der code ist recht weit aber die strom verarbeitung ist auch net 
drin.

MfG

Tec

von Nils P. (ert)


Angehängte Dateien:

Lesenswert?

Es gibt von jedem Hersteller App Notes oder ähnliches. Siehe Anhang

Da habe ich mir auch viel abgeschaut ;-)

Warum willst du eigentlich einen BLDC Sinusförmig ansteuern?
Mir ist so in Erinnerung: PMSM = Sinuskommultiert  /// BLDC = 
Tranpezförmig

Hast du mal die Induziert Spannung gemessen? Wie sieht die aus?

G Ert

von Mach F. (machfax)


Angehängte Dateien:

Lesenswert?

Die induzierte Spannung ist sinus, daruzm ist der Motor eher PMSM...

Zur Clarke Transformation:
  Ich habe diesen Source Code verwendet:

  int icos=Cosinus(pM->teta);
  int isin=Sinus(pM->teta);
  int vU =  (pM->dV) - (pM->dW);
  int vW =  (pM->dV) - (pM->dU);

  pM->valpha=(int)((((long long int)vU)-((long long int)pM->dV*(long 
long int)icos)-((long long int)pM->dW*(long long int)icos))>>32);
  pM->vbeta =(int)((((long long int)pM->dV*(long long int)isin)-((long 
long int)vW*(long long int)isin))>>32);

  Daraus resultiern die Kurven wie im Excel Sheet.
  Ich bin mir jetzt nicht sicher ob dieser Code wirklich funktioniert.
  Denn ich habe die beiden Berechnungen angepasst da Variablen nicht 
definiert waren, ich denke es war ein Schreibfehler.
  Kann es also sein, dass valpha grösser ist in der Amplitude wie vbeta?

  Oder hat jemand ein Source Code davon zur Hand?

  pM->teta ist der aktuelle Winkel
  pM->dU , dV und dW ist der aktuell gemessene ADC Wert über den Shunt 
Widerständen.

  Passt das jetzt so?
  Vielen DANK

von Nils P. (ert)


Lesenswert?

Du verwechselt zuviel^^

In der Clarke-Tranformation kommt kein Winkel vor. Sieht eher nach einer 
Reverse-Park-transformation aus, nur die Winekl passen in meinen Augen 
nicht...
rev Park:
να = ν_qs*cosθr + ν_ds*sinθr
νβ = –ν_qs*sinθr + ν_ds*cosθr

Und was Ausgang von der Funktion heraus kommt hängt natürlich vom den 
Eingangssignalen ab. Setze mal v_ds null, und v_qs sehr klein wählen 
wenn der Motor angeschlossen ist und den Winkel hochzählen mit einer 
Schleife, dann müsste να und νβ gleich groß sein, nur Phasenverschoben.

von Mach F. (machfax)


Lesenswert?

Nils P. schrieb:
> In der Clarke-Tranformation kommt kein Winkel vor. Sieht eher nach einer
> Reverse-Park-transformation aus, nur die Winekl passen in meinen Augen
> nicht...

Ok Danke...
Aber hast du vielleicht einen Source Code der die Clarke Transformation 
beschreibt?
Ich habe diese Codeteil von hier:
Beitrag "SVPWM mit LPC1769"

Aber scheinbar hat dieser Fehler drin oder ich bin da komplett falsch...

von Mach F. (machfax)


Lesenswert?

Hallo

Ich bin die Clarke Transformation am einbauen, da ich dies elber machen 
muss, denn ansonsten wird das nichts und ich verstehe es nicht...

Auf jeden Fall lautet die Clarke Transformation ja wie folgt:

qIalpha = qIas
qIbeta = -(2*qIbs+qIas)/sqrt(3)

Ich möchte die Wurzel von 3 jetzt anlaog der Rechnung in der Clark 
Invers Transformation machen. Diese wir ja so gemacht:

vbeta * sqrt(3)/2

und dann in C:

// vb * Sq3/2 als Zwischenergebnis rechnen
vsq3h=vb-(vb>>3)-(vb>>7)-(vb>>10)-(vb>>12);

Ich sehe im Moment nicht wie ich dies auf den Ausdruck
qIbeta = -(2*qIbs+qIas)/sqrt(3)
umformen muss.

Kann mir jemand helfen?

Vielen Dank

von Mach F. (machfax)



Lesenswert?

Hallo zusammen

Ich habe den Sinus jetzt endlich auf den Phasen.
Wenn ich den Sinus jetzt aber so schiebe, dass er mit den Hallsensoren 
übereinstimmt, so wird kein sauberer Sinusstrom mehr erzeugt. Warum ist 
das so? bzw. was mache ich falsch? Ist es so, dass der Motor eine 
Spannung induziert die mir in den Strom stört wenn der Hall und die 
Hlabwelle vom Sinus übereinstimmen?

Danke & Gruss

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Moin Domi,

Was haste denn da genau gemessen? Phase zu Phase? Und wie sind die 
Hallsensoren angeordnet. Versuch mal 90° Phase zwischen Hall und Sinus. 
Dann solltest du richtig sein. Die Hall messen ja das Magnetfeld und der 
Strom mus 90° dem Magnetfeld voreilen.

MfG

Tec

von Mach F. (machfax)


Lesenswert?

Morgen

Ich messe direkt den Strom von Phase U über den Shunt Widerstand der 
entsprechenden H-Brücke. Jede H-Brücke hat einen eigenen Shunt 
Widerstand.
Wie die Hallsensoren genau angeordnet sind, weiss ich nicht genau, ist 
im Datenblatt nicht ersichtlich. (Maxon Typ 
http://www.maxonmotor.ch/maxon/view/service_search?query=361674)
Der Motor dreht im Leerlauf, und wenn dann der Strom über dem Shunt (der 
effektiv durch die Motorenwicklung fliesst)mit dem Nulldurtchgang mit 
dem HallSensor dieser Phase übereinstimmt, habe ich dieses Phänomen. 
Wenn ich den Motor aber etwas belaste, ist der Sinus wieder schöner und 
nicht mehr so verhackt.
Aber ich probiere jetzt mal mit den 90° voreilend.
Danke

von Mach F. (machfax)


Angehängte Dateien:

Lesenswert?

Hallo Ich habe mal gemssen wie es mit der Blockkommutierung aussieht, 
das war so im EvalBoard vorbereitet. (siehe Bild)
Das heisst aber, dass genau beim Umschalten des Hallsensores der Sinus 
anfangen muss, oder?

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Moin

nicht ganz. Sieh dir die Hallsignale und die PWM beim Block an. Der 
Hallsensor bildet immer 180°high und 180°low. In der Zeit ist ein Block 
mit 120° und 60° in dem die Phase freiläuft. in der Mitte der 
Freilaufphase muss der Nulldurchgang von deinem Sinus sein. Und wenn der 
Block oben ist muss der Sinus auch positiv sein.

Und dann haste auch die 90°.

Sieh dir mal das an
http://krex.k-state.edu/dspace/bitstream/handle/2097/1507/JamesMevey2009.pdf;jsessionid=63C53F6A37B454B00E49C8A02FBE346D?sequence=1

Da findest alles was de wissen musst.

MfG

Tec

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
Noch kein Account? Hier anmelden.