Forum: Mikrocontroller und Digitale Elektronik FOC-Ansteuerung eines BLDC Motors: Berechnung des Batteriestroms bei Feldschwächung


von hochsitzcola (Gast)


Lesenswert?

Hallo Zusammen,

ich komme mal wieder nicht weiter. In unserem open source Projekt für 
Ebike- bzw. Scooter-Controller habe ich bisher auf Feldschwächung 
verzichtet. Da aber gerade die Scooter-Gemeinde danach schreit, habe ich 
es jetzt eingebaut. Es funktioniert auch wie erwartet. Die Hardware hat 
keinen Shunt zur Messung des Batteriestroms. Ohne Feldschwächung war das 
kein Problem, hier konnte ich den Batteriestrom aus iq * dutycycle = iq 
* uq/umax leicht berechnen. Das funktioniert nun auch bei reinem id, 
(der Motor dreht sich also nicht) id * ud/umax, dann wird der 
Batteriestrom korrekt berechnet. Wenn ich aber id und iq ungleich Null 
fahre, hätte ich erwartet daß der Batteriestrom der Betrag des 
Stromzeigers ist. Batteriestrom = Wurzel((iq * uq/umax)²+(id * 
ud/umax)²)

Dem ist aber nicht so :-(
Habe ich irgendwo einen Denkfehler?!

Gruß
hochsitzcola

https://github.com/Koxx3/SmartESC_STM32_v3/blob/10205dff61ea2f6b2e5c30deeab56497beabb005/Core/Src/main.c#L582

von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

hochsitzcola schrieb:

> (...) Wenn ich aber id und iq ungleich Null
> fahre, hätte ich erwartet daß der Batteriestrom der Betrag des
> Stromzeigers ist. Batteriestrom = Wurzel((iq * uq/umax)²+(id *
> ud/umax)²)

Da Du den Raumzeiger des Stromes nicht beliebig einstellen kannst, 
sondern nur 6 feste Richtungen hast, die Dir durch die Raumachsen der 
drei Statorwicklungen erzeugt werden, ist die Summe der Phasenströme 
größer als der Betrag des Strom-Raumzeigers. Im Prinzip eine vektorielle 
Addition "anders herum". Aber sollte Deine Regelung nicht die Ströme im 
Statorsystem kennen?

Grüßle
Volker

von hochsitzcola (Gast)


Lesenswert?

Volker B. schrieb:
> sondern nur 6 feste Richtungen hast

Ich mache ja FOC, da kann der Zeiger im rotierenden Bezugssystem jede 
beliebige Richtung haben.

Gruß
hochsitzcola

von Felddreher (Gast)


Lesenswert?

Bei einer sinnvoll implementierten Feldschwächung bleibt die mechanische 
Leistung konstant im Maximum, denn man erkauft erreichbare Drehzahl mit 
reduziertem Drehmoment.

Ich komme damit auf:

von Felddreher (Gast)


Lesenswert?

Zu früh abgeschickt. Meine Begründung: die Formel beruht auf der 
Leistungsbeilanz P_elektrisch = P_mechanisch

I_DC * I_Bat = w*M

mit M = c_m * I_q
mit c_m = Kehrwert-irgendwas vom KV-Rating des Motors

von hochsitzcola (Gast)


Lesenswert?

OK und was soll dabei cm sein?!
Ich kann doch bei FOC id und iq auf jeden beliebigen Wert regeln, ob 
damit der Motor sinnvoll dreht oder nicht, sei mal dahingestellt. Aber 
ich sehe schon, ich muß die BEMF irgendwie mit reinrechnen. Bei reinem 
iq brauch ich das nach Erfahrung aber nicht ?!

Gruß
hochsitzcola

von hochsitzcola (Gast)


Lesenswert?

Ah OK, die Drehmomentkonstante, ich hab auch zu schnell abgeschickt :-)

von Hochsitz C. (hochsitzcola)


Lesenswert?

Felddreher schrieb:
> Leistungsbeilanz P_elektrisch = P_mechanisch

Der Ansatz passt bei Feldschwächung aber ja nicht, da ein Anteil der 
elektrischen Eingangsleistung zur Feldschwächung genutzt wird. Da wird 
Wärme statt Drehmoment erzeugt.

Gruß
hochsitzcola

von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

Hallo,

sorry, für meine nicht wirklich zielführende erste Antwort.
Nach etwas Nachdenken glaube ich die Lösung Deines Problems erkannt zu 
haben:

hochsitzcola schrieb:

> Batteriestrom korrekt berechnet. Wenn ich aber id und iq ungleich Null
> fahre, hätte ich erwartet daß der Batteriestrom der Betrag des
> Stromzeigers ist. Batteriestrom = Wurzel((iq * uq/umax)²+(id *
> ud/umax)²)

Iq ist ein Wirkstrom, da er Leistung umsetzt. Id ist (idealerweise) ein 
reiner Blindstrom (wenn man die -- im wesentlichen ohmschen -- Verluste 
vernachlässigt).

Id wird also weitgehend zwischen Umrichterbrücke und 
Zwischenkreiskondensator pendeln, die Batterie "sieht" ihn idelaerweise 
nicht. Lediglich die aus Id resultierenden, zusätzlichen Verluste müssen 
von der Batterie gedeckt werden.

Grüßle
Volker

: Bearbeitet durch User
von Achim M. (minifloat)


Lesenswert?

Volker B. schrieb:
> Lediglich die aus Id resultierenden, zusätzlichen Verluste müssen von
> der Batterie gedeckt werden.

Stell dir den Kram wie zwei Step-Down-Wandler vor. Einer wandelt von 
Ubat auf Uq und einer wandelt von Ubat auf Ud.

Da Id, Ud, Iq, Uq alle bekannt sind, einfach über Leistungsgleichung und 
Ubat den DC berechnen.

Dann gibt es noch die andere Methode, mit Schaltzeiten und 
Phasenströmen:
1
Idc = ((T_uhigh * I_u) + (T_vhigh * I_v) + (T_whigh * I_w)) / T_PWM
2
3
(Geht auch mit Low und alles andersrum...)
Kommt leider mit dem Nachteil nicht kompensierter sich ausbildender 
Diodenleitzeit während der Totzeiten.

mfg mf

von Hochsitz C. (hochsitzcola)


Lesenswert?

Achim M. schrieb:
> Da Id, Ud, Iq, Uq alle bekannt sind, einfach über Leistungsgleichung und
> Ubat den DC berechnen

Ich steh auf dem Schlauch. Wenn es einfach wäre, hätte ich es ja schon 
längst gemacht :-)

Gruß
hochsitzcola

von hochsitzcola (Gast)


Angehängte Dateien:

Lesenswert?

Hm, mit rumprobieren in Excel komme ich auf folgende Fallunterscheidung:

Wenn Betrag iq kleiner als Betrag id dann:
Ibat = Betrag (id*ud/umax) - Betrag (iq*uq/umax)

Wenn Betrag iq größer als Betrag id dann:
Ibat = Betrag (id*ud/umax) + Betrag (iq*uq/umax)

Im Bildchen oben, Motor mit Last auf 1000, 2000 und 3000mA laufen 
lassen, unten im Leerlauf bei voller Drehzahl, es ergibt sich ein 
Batteriestrom von ca.1800mA. id wird einfach linear zur Drehzahl erhöht.

So passen die berechneten Werte zu den gemessenen. Aber ist das 
physikalisch irgendwie sinnvoll?! Ich will auch gar nicht wissen, wie 
das dann bei Rekuperation oder anderer Drehrichtung aussieht :-)

Gruß
hochsitzcola

von Achim M. (minifloat)


Lesenswert?

Hochsitz C. schrieb:
> Achim M. schrieb:
>
>> Da Id, Ud, Iq, Uq alle bekannt sind, einfach über Leistungsgleichung und
>> Ubat den DC berechnen
>
> Ich steh auf dem Schlauch. Wenn es einfach wäre, hätte ich es ja schon
> längst gemacht :-)

Du hast einen Regler für Id drin. Dessen Ausgang entspricht Ud. Ud wird 
sehr klein sein, aber genau das ist der Verlust den du hast :)

Du hast einen Regler für Iq drin. Dessen Ausgang entspricht Uq. Iq und 
Uq müssen nicht invertiert werden, wenn rückwärts drehend. Weil 
rückwärts drehend und rückwärts weiter beschleunigend negatives Uq und 
auch negatives Iq zur Folge hat usw.

Dieser Leistungsbedarf beider orthogonalen Komponenten muss jetzt aus 
Ubat gedeckt werden. Also beide Leistungen addieren und das Ergebnis 
durch Ubat teilen. Und kräftig filtern :)

mfg mf

: Bearbeitet durch User
von Achim M. (minifloat)


Lesenswert?

PS.

hochsitzcola schrieb:
> folgende Fallunterscheidung

Merkwürdig... sind bei dir alle Vorzeichen richtig?

Alternativ kannst du ja die Phasenstrom-Schaltzeit-Methode probieren...

von Paul .. (paulederbaus)


Lesenswert?

Hallo Zusammen,

ich bin auch dabei für E-Scooter eine Feldschwächung zu schreiben.
Ich habe es geschafft Id so zu manipulieren, dass der Roller statt ca. 
35 km/h in der Luft lässig auch bis 50 km/h hochgeht. Id ist dabei in 
einer Range von 2A bis 10A. Iq ist vor der PI Regelung bei 30A.
Beide Werte werden in der bisherigen Hersteller FOC vor der PI Regelung 
eingespeist.
Wenn ich jedoch mit egal welchem Id auf die Straße gehe, kommt der 
Roller nicht über seine normale Höchstgeschwindigkeit hinaus.


Wie würde denn die Berechnung von Id aussehen, wenn ich die Möglichkeit 
hätte den Batteriestrom zu messen?

hochsitzcola schrieb:
> Die Hardware hat
> keinen Shunt zur Messung des Batteriestroms.

Grüße,

Paul

von Achim M. (minifloat)


Lesenswert?

Paul .. schrieb:
> Wie würde denn die Berechnung von Id aussehen, wenn ich die Möglichkeit
> hätte den Batteriestrom zu messen?

Das hat erstmal nix miteinander zu tun.
Die Frage hier im Faden war übrigens andersherum. Einer hatte 
Feldschwächung und hat es nicht hingebracht, den DC-Strom zu errechnen.

Paul .. schrieb:
> Wenn ich jedoch mit egal welchem Id auf die Straße gehe, kommt der
> Roller nicht über seine normale Höchstgeschwindigkeit hinaus.

Äh, du machst was falsch. Kann es sein, dass du positiven Id gibst? 
Damit schwächst du das Feld nicht.

Ein bisschen positiver Id kann im Ankerstellbereich helfen, zum normalen 
Drehmoment aus Iq noch Reluktanzmoment zu nutzen.

Außerhalb des Ankerstellbereichs muss es negativer Id sein, damit es 
weniger Feld ist, damit für ein bisschen mehr Iq noch genug Udc-BEMF zu 
Verfügung steht.

Wie regelst oder stellst du aktuell deinen Id ein?

Was meinst du mit...

Paul .. schrieb:
> der bisherigen Hersteller FOC

...?

mfg mf

von Paul .. (paulederbaus)



Lesenswert?

Achim M. schrieb:
> Das hat erstmal nix miteinander zu tun.
> Die Frage hier im Faden war übrigens andersherum. Einer hatte
> Feldschwächung und hat es nicht hingebracht, den DC-Strom zu errechnen.

Oh sorry. Dann habe ich die Anfrage oben falsch verstanden.

Achim M. schrieb:
> Kann es sein, dass du positiven Id gibst?

Ich glaube nicht. Umso größer der Wert Id wird, umso schneller läuft der 
Motor im Leerlauf.

Id = 0A --> 35 km/h

Id = -2A  --> 37-38 km/h

Id = -4A --> 40 km/h

Achim M. schrieb:
> Wie regelst oder stellst du aktuell deinen Id ein?

Ich setzte auf der Regelung der original Firmware des Roller auf indem 
ich Funktionen in die binary Datei einfüge.

Damit setzte ich auch auf der bestehenden SVPWM auf und verändere nur 
die Iq* und Id* Werte aus dem Schaubild.

Das heißt ich gebe der Id PI lediglich einen Sollwert von x Ampere mit.


Danke und Grüße,

Paul

: Bearbeitet durch User
von Achim M. (minifloat)


Lesenswert?

Paul .. schrieb:
> Achim M. schrieb:
>
>> Kann es sein, dass du positiven Id gibst?
>
> Ich glaube nicht. Umso größer der Wert Id wird, umso schneller läuft der
> Motor im Leerlauf.

Ok, das ist schon mal gut. Dauerhaft negativer Id ist aber nicht 
zielführend.

Es gäbe da jetzt mehrere Methoden.

a) aus einer 1D-Lookuptabelle den benötigten Iq abhängig von

x = (Drehzahl * (Ubat_nom/Ubat_ist))

lesen und stellen

b) aus einer 2D-Lookuptabelle Id-Iq-Strompaare abhängig von

x = (Drehzahl * (Ubat_nom/Ubat_ist))

y = gefordertes Drehmoment

lesen und stellen

c) schauen, ob die Spannungsamplitude √(Ud²+Uq²) in die Nähe von Ubat 
kommt, daraufhin negativen Iq erhöhen. Das geht mit einem PI-Regler. 
Begrenzung des Id in beide Richtungen muss mit rein.

mfg mf

: Bearbeitet durch User
von Paul .. (paulederbaus)


Lesenswert?

Achim M. schrieb:
> den benötigten Iq

Achim M. schrieb:
> daraufhin negativen Iq erhöhen

Du sprichst mehrfach von Iq. Muss ich Iq für die Feldschwächung auch 
verändern?

Bisher habe ich zur Motorsteuerung, ähnlich auch wie in der originalen 
FW, Iq konstant mit dem gleichen Wert beschrieben.

Das gleiche habe ich auch mit Id versucht.


So wie ich dich verstehe, muss ich Id in Abhängigkeit von der 
Batteriespannung und der Motorspannung bringen. Sobald Ubat = √(Ud²+Uq²) 
ist, muss ich dann Id erhöhen.

Dabei würde ich dann aber wieder konstant einen negativen Wert zuweisen.

Verstehe ich das richtig?

von Achim M. (minifloat)


Lesenswert?

Paul .. schrieb:
> Du sprichst mehrfach von Iq. Muss ich Iq für die Feldschwächung auch
> verändern?

Na, ich hab teils Mist geschrieben. Sorry...nochmal.

a) aus einer 1D-Lookuptabelle den benötigten Id abhängig von

x = (Drehzahl * (Ubat_nom/Ubat_ist))

lesen und stellen

b) aus einer 2D-Lookuptabelle Id-Iq-Strompaare abhängig von

x = (Drehzahl * (Ubat_nom/Ubat_ist))

y = gefordertes Drehmoment

lesen und stellen

c) schauen, ob die Spannungsamplitude √(Ud²+Uq²) in die Nähe von Ubat 
kommt, daraufhin negativen Id erhöhen. Das geht mit einem PI-Regler. 
Begrenzung des Id in beide Richtungen muss mit rein.

Paul .. schrieb:
> So wie ich dich verstehe, muss ich Id in Abhängigkeit von der
> Batteriespannung und der Motorspannung bringen. Sobald Ubat = √(Ud²+Uq²)
> ist, muss ich dann Id erhöhen.

Du entscheidest dich also für c). Ok soweit, Ja. Besser Id erhöhen, kurz 
bevor der Spannungsvektor so groß wie Ubat wird, sonst hast du keine 
Reserve mehr.

Paul .. schrieb:
> Dabei würde ich dann aber wieder konstant einen negativen Wert zuweisen.
> Verstehe ich das richtig?

Nein, weil sich Uq abhängig von der Drehzahl (BEMF) und Iq resistiven 
Verlusten einstellt. BEMF aber abhängig von Id, ...

mfg mf

von HSc (Gast)


Lesenswert?

Die Leistung im AC-System ist (Uq*Iq+Ud*Id)*3/2, wenn die 
amplitudengleiche Transformation verwendet wird und das System 
dreiphasig ist. Wenn der Motor Oberflächenmagnete hat, erzeugt der Motor 
kein Reluktanzmoment, ansonsten erzeugt ein Motor mit vergrabenen 
Magneten auch mit -Id*Iq ein positives Drehmoment.
Im Leerlauf ist der Strom üblicherweise sehr klein, also auch die 
Spannung am Motor. Unter Last erzeugt Iq*omega*Lq ebenfalls eine 
Spannung, die mehr Feldschwächung nötig macht.

von Achim M. (minifloat)


Lesenswert?

HSc schrieb:
> ansonsten erzeugt ein Motor mit vergrabenen Magneten auch mit -IdIq ein
> positives Drehmoment.

Feldschwächung geht mit beiden, Oberflächen- als auch vergrabenen 
Magneten.

HSc schrieb:
> Im Leerlauf ist der Strom üblicherweise sehr klein, also auch die
> Spannung am Motor

Gemeint ist Iq der klein ist.

mfg mf

von Paul .. (paulederbaus)


Lesenswert?

Alles klar. Danke für euren Input.
Ich werde am Wochenende versuchen Id anhand von dieser Gleichung zu 
erhöhen:
Ubat = √(Ud²+Uq²)  (natürlich schon ein bisschen früher)

Bisher war mein Ansatz Id an der Geschwindigkeit zu orientieren:

Startgeschwindigkeit z.B. 25 km/h (bei 30 km/h regulärem Topspeed)

id = Basisstrom (z.B. 2A) + (Aktuelle Geschwindigkeit - 
Startgeschwindigkeit) * Multiplikator (0,3A)

Damit würde bei 30 km/h, wo der Batteriestrom ca. 15A groß ist, id ca. 
3,5 A groß sein. Reicht das vom Größenverhältnis nicht aus? Oder ist es 
töricht sich am Batteriestrom und nicht am Phasenstrom zu orientieren?

Danke nochmal für die Hilfe :)

Paul

von HSc (Gast)


Lesenswert?

Achim M. schrieb:
> HSc schrieb:
>
>> ansonsten erzeugt ein Motor mit vergrabenen Magneten auch mit -IdIq ein
>> positives Drehmoment.
>
> Feldschwächung geht mit beiden, Oberflächen- als auch vergrabenen

Ich habe nichts anderes behauptet, nur folgt daraus, das diese Motoren 
mit Feldschwächung mehr Drehmoment aus dem gleichen Strombetrag erzeugen 
und besser immer etwas -Id bekommen sollten.

Das auf der Straße nicht mehr Geschwindigkeit raus kommt könnte 
bedeuten, dass die Leistung nicht für mehr reicht oder das gewählte Id 
nicht reicht. Die Info über den Kurzschlussstrom ist hier wichtig. Ist 
der sehr groß, ist der Motor nicht so gut geeignet für den 
Feldschwächbetrieb

von Achim M. (minifloat)


Lesenswert?

Paul .. schrieb:
> Ubat = √(Ud²+Uq²)  (natürlich schon ein bisschen früher)

Ja, mehr vektorielle Zeigerlänge kommt halt nicht aus dem Inverter raus.
Musst ein bisschen aufpassen, wie HSc schon angedeutet hatte, ob und wie 
die Modulation bzw. die Clarke-inverse Transformation im Vorwärtspfad 
skaliert.

Wenn die ...

Ud = Amplitude Ua = Amplitude Uu

... machen, dann aber so tun als wäre der Motor im Stern verschaltet 
(ist üblich), kann die Amplitude bzw. Die Aussteurgrenze √(Ud²+Uq²) 
nicht Ubat, sondern nur Ubat/√3 werden. Was wir auch nicht wissen, ist, 
ob der Modulationsalgorithmus Übersteuerung verträgt.

Vielleicht machst du die Eingriffsgrenze des Feldschwächreglers auch 
einfach empirisch bedatbar und stellst es eben auf ein Optimum ein.

HSc schrieb:
> Ich habe nichts anderes behauptet, nur folgt daraus, das diese Motoren

"Diese" sind in dem Fall Oberflächen-Magnetmotoren. Kommt auch darauf 
an, in welcher Richtung man jetzt -Id versteht ;)

HSc schrieb:
> oder das gewählte Id nicht reicht.

Der Threadkaperer hatte Eingangs einen konstanten Id gestellt. Das hat 
gleich gezeigt, dass es so nicht geht. Schaun' wir mal was dabei herum 
kommt.

mfg mf

: Bearbeitet durch User
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.