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
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
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
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
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?
> 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.
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.
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?
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
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?
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
Poste mal den Schaltplan dann können wir ja mal gucken wie du das richtig machen kannst.
http://www.ti.com/lit/ug/spmu041/spmu041.pdf Schema ist hier abgelegt: http://www.ti.com/lit/ug/spmu033c/spmu033c.pdf
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.
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
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...
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
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...
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.
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
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!
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.
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
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.
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
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.
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
Das solltest du schon selber hin bekommen. das Magnetfeld sollte rotieren... http://www.mikrocontroller.net/articles/Brushless-Controller_f%C3%BCr_Modellbaumotoren
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
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
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
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
>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.
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
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
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.
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?
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.
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.
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?
Denke ich auch, Ich muss dazusagen ich habe den code selbst nicht ausporbiert. fand ihn aber rechtsimpel implementiert.
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
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?
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
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
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
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?
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
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
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
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
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!
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
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?
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.
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
naja so wie ich das sehe sind die werte vllt auch ausm DAC, aber ist auch egal, der strom ist wichtig
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!
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
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
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
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
Ich meine einen Sinus ohne die ausgefüllte Fläche darunter...
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.
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
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
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
Der OP war am Anschlag... Dieser Plot ist symetrisch...
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
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.
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
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
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 ;)
>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
Nein sind nicht 16 Bit, wird danach entsprechend der PWM Frequenz skaliert, habe ich zu diesem Zeitpunkt nicht gesehen... Aber trotzdem Danke
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
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
> 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?
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.
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...?
>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?
>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...
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...
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
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
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
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?
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
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
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
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
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
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.
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...
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
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
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
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
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.