Forum: Mikrocontroller und Digitale Elektronik Raumzeigermodulation, PWM


von Mitleser (Gast)


Lesenswert?

Ahoi, ich möchte eine Raumzeigermodulation implementieren.
Wie kann ich aus dem Real- und Imaginärteil des gewünschten Vektors die 
beiden Zeiten berechnen für die auszugebenden Spannungsvektoren?
Des Weiteren verfügt mein Microcontroller über eine PWM-Einheit, welche 
im 'center aligned mode' arbeitet, wie komme ich am einfachsten auf den 
duty cycle für die 3 Kanäle?

von Sebastian K. (sek)


Lesenswert?

ftp://ftp.analog.com/pub/www/marketSolutions/motorControl/applicationCod 
e/admc401/pdf/svpwm.pdf

Da werden die Zusammenhänge ganz gut hergeleitet.

von Axel R. (Gast)


Lesenswert?

Leerzeichen und Zeilenumbruch bei "Cod e" im Link entfernen...

StromTuner

von Al3ko -. (al3ko)


Lesenswert?

Mitleser schrieb:
> Des Weiteren verfügt mein Microcontroller über eine PWM-Einheit, welche
> im 'center aligned mode' arbeitet, wie komme ich am einfachsten auf den
> duty cycle für die 3 Kanäle?

Es gibt zwei Möglichkeiten, Raumzeigermodulation auf einem uC zu 
implementieren.

1. Du berechnest die nötigen Zeiten mithilfe der benachbarten 
Grundspannungsvektoren (jene, welche den entsprechenden Sektor 
definieren). Die berechneten Zeiten gibst du dann einfach als Ausgang an 
den Pin deines uC, der den jeweiligen IGBT triggert. Totzeiten werden 
hardwareseitig realisiert (z.B. bereits integriert in einigen 
MOSFET/IGBT Treiber ICs)

2. Du berechnest den gewünschten Raumzeiger in Amplitude und Winkel, und 
führst ihn direkt mittels inverser Clark-Park Transformation in dein ABC 
System (oder UVW oder 123 oder wie auch immer du dein dreiphasiges 
System nennen magst). Nun hast du deine drei gewünschten 
Phasenspannungen, die du direkt in das PWM Registers deines uCs geben 
kannst, der entsprechend die passenden Tastgrade für deine MOSFETs/IGBTs 
ausgibt. Je nachdem, welchen uC du verwendest, kannst du die Totzeit 
sogar elegant softwareseitig realisieren (z.B. die DSPs von TI oder 
Microchip).

Beide Varianten führen zum selben Ergebnis, lediglich über zwei 
unterschiedliche Wege. Da du bereits entsprechende PWM Register hast mit 
Center Aligned Mode Funktionalität, gehe ich davon aus, dass du 
ebenfalls integrierte Totzeitmodule in deinen PWM Registern setzen 
kannst. Ich würde an deiner Stelle zu Variante 2 raten, da du mehrere 
Fliegen mit einer Klappe schlagen kannst und sogar Berechungen (bzw. 
if-Anweisungen) einsparen kannst.

Melde dich, wenn weiterer Klärungsbedarf vorhanden ist.

von Mitleser (Gast)


Lesenswert?

Ja, Variante 2 interessiert mich. Deine Annahme bzgl. Totzeit etc. ist 
korrekt, ich habe das alles in Hardware. Aber wie ich aus dem Raumzeiger 
auf die abc PWM-Werte komme, ist mir definitiv nicht klar :-( kannst du 
mir das genauer erläutern?

von Al3ko -. (al3ko)


Lesenswert?

Mitleser schrieb:
> Aber wie ich aus dem Raumzeiger
> auf die abc PWM-Werte komme, ist mir definitiv nicht klar :-( kannst du
> mir das genauer erläutern?

Wie hast du denn deinen Raumzeiger (bzw. deinen gewünschten Vektor mit 
Real- und Imaginäranteil) bestimmt?

Beantworte bitte die Frage, damit man dir gezielt helfen kann.

Gruß,

von temp (Gast)


Lesenswert?

eventuell hilft dir das:

Beitrag "SVPWM mit LPC1769"

von Vincent H. (vinci)


Angehängte Dateien:

Lesenswert?

Ich persönlich finde Microchips AN955 am verständlichsten.

Die dort verwendeten Formeln hab ich mal in ein kleines MATLAB GUI 
gepackt, weil ich persönlich Schwierigkeiten mit der Vorstellung hatte, 
wie aus dem Zeiger 3x Werte für die center-aligned PWM werden.

Das Tool gibts hier:
https://de.mathworks.com/matlabcentral/fileexchange/51322-vf-control-of-3-phase-induction-motor-using-svpwm-embedded-design-help

von Al3ko -. (al3ko)


Lesenswert?

Hi,
ich glaube, dass es oftmals ein grundsätzliches Verständnisproblem 
bezüglich des Raumzeigers gibt.

Der Trick dabei heißt: Clark-Park Transformation

Die Theorie:
In einem Dreiphasensystem (Dreileiter, d.h. ohne explizieten Rückleiter) 
mit drei 120° verschobenen Phasen beträgt der Summenstrom 0A 
(entsprechend die Summenspannung 0V oder der magnetische Flußdichte 0T). 
Das heißt, dass man das System mit lediglich 2 Phasen beschreiben kann, 
da gilt:
I1+I2+I3=0 -> I1+I2 = -I3

Nun kann man also ein 3 Phasensystem in ein 2 Phasensystem überführen. 
Das ist reine Mathematik, die sich der Clark Transformation bedient. 
Mathematisch bedeutet das also
Iabc -> Ialphabeta
Das ist reine Mathematik, und das resultierende Ialphabeta System ist 
nun ein rechtwinkliges Koordinatensystem.
Anders ausgedrückt:
Das Dreiphasensystem mit 3 um 120° versetzten Phasen kann in ein 
Zweiphasensystem überführt werden, bei dem die beiden Phasen 90° 
zueinander versetzt sind.

Da wir jetzt von einem rechtwinkligen Koordinatensystem sprechen, können 
wir uns der komplexen Rechnung bedienen, und entsprechend einen Zeiger 
aufstellen, der einen Real- und Imaginäranteil besitzt.

Dieser Zeiger ist im Zweiphasensystem äquivalent zu den drei 
Phasenspannungen im Dreiphasensystem.

Um auf vom Zweiphasensystem wieder ins Dreiphasensystem zu kommen, muss 
man die Mathematik einfach nur umkehren, und nennt sich "Inverse Clark 
Transformation".

Soll heißen:
Der Raumzeiger ist eine reine mathematische Beschreibung des 
Dreiphasensystems. Heißt also, dass es für jeden Raumzeiger mit 
gewünschter Amplitude und Winkel drei fest definierte Phasenspannungen 
gibt.

Die Übersetzung zwischen Raumzeiger und Dreiphasensystem geschieht 
mittels Clark-Transformation:
Iabc -> Clark-Transformation -> Ialphabeta
Ialphabeta -> Inverse Clark-Transformation -> Iabc

Die Park-Transformation ist lediglich ein weiterer Schritt, das 
rotierende Zweiphasensystem in ein ruhendes Zweiphasensystem zu 
überführen, damit der PI Regler anschließend sauber arbeiten kann. 
Darauf muss zu diesem Zeitpunkt aber nicht eingegangen werden.

Fazit, um damit die vom TO gestellte Frage zu beantworten:
Wie kommt man auf die drei Phasenspannungen?
Indem man den Raumzeiger mittels der Inversen-Clark-Park Transformation 
multipliziert.

Bei weiteren Fragen einfach melden.

Gruß,

von Mitleser (Gast)


Lesenswert?

Also meiner Meinung nach erhalte ich ja einen Raumzeiger, indem ich

cos(omega*t) + j*sin(omega*t)

rechne, wobei omega meine gewünschte Kreisfrequenz ist, mit der der 
Raumzeiger rotieren soll.

Und es ist dann tatsächlich so einfach, aus diesem einen komplexwertigen 
Raumzeiger mittels Clarke-Transformation die drei Phasenspannungen zu 
erhalten?

von temp (Gast)


Angehängte Dateien:

Lesenswert?

Man kann die Sache auch anders versuchen zu erklären. Es geht ja erst 
mal nur um die Erzeugung eines 3Phasensystems. Unser Bezugspunkt ist GND 
und die PWM erzeugt im übertragenen Sinne 3 Spannungsverläufe gegen GND 
die in der Regel alles andere als Sinus sind. Misst man aber zwischen je 
2 Ausgängen der PWM ergibt das einen reinen Sinus. In der verschiedenen 
Veröffentlichungen trifft man mehrere unterschiedliche Varianten an. Ich 
hänge mal die Bilder von 3 gängigen an sowie einer Sinus-PWM. Da sieht 
man auch das Problem mit der Aussteuerung bei der Sinus-PWM. Es wird da 
nicht der max. Hub erreicht. Allerdings kann das bei einen 3 
Phase-Wechselrichter zwingend sein, wenn man einen belastbaren 
Sternpunkt braucht. Der Sternpunkt gegen GND ist in den Bildern immer 
die violette Linie.

Rechnet man die Veröffentlichungen mit Clark und Park Transformationen 
ergibt sich immer sowas wie pwm-popofull.jpg. Man sieht auch, dass die 
Kurven schon relativ verzerrt sind. Besser geht das mit der Methode 
einem Sinus noch einen Teil seiner 3. Harmonischen dazu zu addieren 
pwm-sin3h.jpg. Da kommen am Ende wesentlich weniger Verzerrungen raus 
was sicher in einer besseren EMV endet. Die Variante pwm-popohalf.jpg 
hält jeder der 3 Brücken für 1/3 der Zeit auf konstanten Pegel was 
einerseits die Schaltverluste senkt dafür aber noch mehr Verzerrungen in 
den Kurven hat. Wolhgemerkt, es geht hier um Verzerrungen gegen GND. Die 
Spannungen zwischen den Phasen sind immer Sinus.

Mich würde selbst mal interessieren, welche Varianten es noch so gibt 
und mit welchen Vor- und Nachteilen.

Die o.g. PI-Regler ergeben eigentlich 2 Werte einmal die Höhe der 
Effektivspannung die die Brücke liefern soll (q) sowie einen Wert für 
den Phasenversatz des gesamten Zieldrehfeldes zum gemessenen. Man könnte 
damit auch zum aktuellen Winkel den Drehfeldversatz (der sich hinter d 
verbirgt) dazurechnen und mit diesem neuen Winkel die Werte der PWM aus 
einer Tabelle holen und mit q scalieren. So hab ich das allerdings noch 
nirgends gesehen.

von temp (Gast)


Lesenswert?

Muss die Bilder noch erklären:
Das obere Diagramm der 3. Bilder sind die Spannungen (oder PWM-Werte) 
gegen GND. Hier auf einen Bereich von 0-2048 scaliert. Unten die 
Spannungen Phase gegen Phase. Sollte Bedarf bestehen an Code für die 
Generierung der Tabellen, bitte melden.

von Al3ko -. (al3ko)


Lesenswert?


von Al3ko -. (al3ko)


Lesenswert?

temp schrieb:
> Mich würde selbst mal interessieren, welche Varianten es noch so gibt
> und mit welchen Vor- und Nachteilen.

Es gibt noch weitere abgewandelte Varianten der Raumzeigermodulation.

Einmal eine Discontinuous PWM (DPWM), die die Schaltverluste weiter 
reduziert, weil die Phase mit der höchsten Amplitude auf DC+ geklemmt 
wird, während die anderen beiden Phasen schalten.

https://www.google.dk/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwiRvIC1qbnVAhXB1RQKHWv4DcMQFggmMAA&url=http%3A%2F%2Fe2e.ti.com%2Fcfs-file%2F__key%2Fcommunityserver-discussions-components-files%2F38%2F7444.DPWM2.pdf&usg=AFQjCNHBnYKdah2c_oXGlDVhZS9co1AJ2w

https://www.researchgate.net/profile/Federico_Barrero/publication/224224279/figure/fig2/AS:302718733307905@1449185178075/Fig-4-Modulating-and-zero-sequence-signals-for-continuous-TIPWM-and-discontinuous.png

Und dann gibt es noch Raumzeigermodulationen, die die Common Mode 
Voltage reduzieren. Ist im Prinzip die gewöhnliche Raumzeigermodulation, 
jedoch mit klugen Zwischenschaltzeiten.

Gruß

EDIT:
Hier ein schöner Artikel zu diesem Thema:
https://pdfs.semanticscholar.org/dc33/cefd155f4f2a645d8d9b1ecd2d354b4535ae.pdf?_ga=2.203973651.2080309764.1501703882-1578205473.1501703882

Letztendlich lassen sich alle Raumzeigermodulationen auf Carrier 
basierte Modulationsverfahren zurückführen.

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Al3ko -. schrieb:
> Es gibt zwei Möglichkeiten, Raumzeigermodulation auf einem uC zu
> implementieren.

Einspruch :-P
Es gibt die dritte Methode, bei der eine Tabelle benutzt wird. Für 
Motorantrieb synchronisiert man den Pointer mit den Hallsensoren - 
dieses Verfahren findet sich z.B. in der Application Note AVR447 von 
Atmel. Vorteile ergeben sich aus dem völligen Verzicht auf 
trigonometrische Berechnungen.

von Mitleser (Gast)


Lesenswert?

Danke für eure Hilfe.
Die Popokurven kenne ich, aber wenn ich mit

ialpha = cos(omega*t)
ibeta = sin(omega*t)

einen rotierenden Raumzeiger konstander Länge erzeuge, dann erhalte ich 
mit der Clarke-Transformation 
(https://en.m.wikipedia.org/wiki/Alpha%E2%80%93beta_transformation 
Abschnitt 'simplified transformation') keine solchen Popokurven. Wie 
auch? also wie muss ich die Clarke-Trafo anders rechnen, um auf die 
Popokurven zu kommen?

von temp (Gast)


Angehängte Dateien:

Lesenswert?

Ich hänge mal etwas Code an mit dem ich meine Tabellen erzeuge. 
Zielplattform ist bei mir STM32F334 mit FPU. Deshalb mache ich auch im 
Controller die Berechnungen in float. Die calctables.cpp kann unter 
Linux oder Windows übersetzt werden. Sie erzeugt float-Tabellen für 
meine 4 Kurven. Wenn man sie mit "calctables 360" aufruft werden die 
Tabellen mit 360 Stützstellen erzeugt.

Für die spätere PWM Erzeugung benutze ich die Tabellen um mit einer 
liniare Interpolation, wie sie auch so ähnlich in der dsplib zu finden 
ist, die Werte fuer die PWM Register zu berechnen. Die Hauptfunktion 
dabei ist
1
void CalcPwm(float Theta, float value);
Sie erzeugt aus dem Winkel Theta (in radians) und dem Value 
(Aussteuerung von 0-1.0f) die Werte fuer die PWM. Das Testprogramm 
spwm.cpp verdeutlicht das und erzeugt csv-Dateien mit denen man in Excel 
sich die Liniendiagramme anzeigen lassen kann. Auf die Art und Weise 
kann man sich aber auch feste Tabellen berechnen lassen, da bracht man 
dann zur Laufzeit keine Berechnung mehr.

von Al3ko -. (al3ko)


Lesenswert?

Hi Mitleser,
Mitleser schrieb:
> Wie
> auch? also wie muss ich die Clarke-Trafo anders rechnen, um auf die
> Popokurven zu kommen?

hast du bereits die Lösung für dein Problem finden können oder besteht 
nach wie vor Klärungsbedarf?

Gruß,

von Mitleser (Gast)


Lesenswert?

Nö, bisher nicht. Wenn du einen Vorschlag hast?

von Al3ko -. (al3ko)


Lesenswert?

Mitleser schrieb:
> Nö, bisher nicht. Wenn du einen Vorschlag hast?

Einfach nach deiner Rücktransformation den entsprechenden Offset 
hinzuaddieren:

Der gibt dir die gewünschten Popokurven.

Gruß,

von T.U.Darmstadt (Gast)


Lesenswert?

Matthias S. schrieb:
> Es gibt die dritte Methode, bei der eine Tabelle benutzt wird. Für
> Motorantrieb synchronisiert man den Pointer mit den Hallsensoren -
> dieses Verfahren findet sich z.B. in der Application Note AVR447 von
> Atmel. Vorteile ergeben sich aus dem völligen Verzicht auf
> trigonometrische Berechnungen.

Das ist dann aber eine Frage der Auflösung der Tabelle und der richtigen 
Ansteuerung und wie man mit den Unsymmetrien im System umgehen möchte. 
Alle Regelfälle auf einen Tabelle zu projizieren halte Ich für nicht 
machbar.

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


Lesenswert?

Thomas U. schrieb:
> Alle Regelfälle auf einen Tabelle zu projizieren halte Ich für nicht
> machbar

Na, biste gerade beim Rundumschlag nach langer Abwesenheit? Warum sollte 
die Regelung was mit der Sinustabelle zu tun haben?

von T.U.Darmstadt (Gast)


Lesenswert?

Ich bin aus einem anderen Thema hierher gelinkt worden und habe das 
zufällig gelesen. Ich wollte nur drauf hinweisen, dass in der Realität 
eine Regelung der PWM erfolgen muss, die über das starre ausgeben der 3 
Phasenwerte hinaus geht und damit nicht alles durch die Tabelle selbst 
vorgezeichnet werden kann.

Darüber hinaus sehe Ich keinen echten Bedarf für Sinustabellen, weil 
sich ein Sinus in der Praxis einfach berechnen lässt.

Wo siehst Du den Vorteil von Tabellen? Ich nehme an low cost apps?

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


Lesenswert?

Thomas U. schrieb:
> Wo siehst Du den Vorteil von Tabellen? Ich nehme an low cost apps?

Das ist nur ein Aspekt. Motorkontrolle besteht zum weitaus grössten Teil 
aus der Überwachung und muss dafür Rechenzeit zur Verfügung haben. Da 
ist Gleitkomma und Trigonometrie ein unnötiger Ballast.
Da die Ausgabe dann meist eh nur mit 8 oder 16bit erfolgt, ist eine 
Tabelle im nativen Format in der Genauigkeit mehr als ausreichend.

Und nochmal:
Matthias S. schrieb:
> Warum sollte
> die Regelung was mit der Sinustabelle zu tun haben?

: Bearbeitet durch User
von Al3ko -. (al3ko)


Lesenswert?

Die fixed point DSPs von TI haben eine in-built Sinus- und 
Kosinustabelle. Es wird insgesamt 1,25 Sinusse abgebildet (ein ganzer 
Sinus plus 90°, um noch einen ganzen Kosinus abzudecken). Insgesamt hat 
besteht ein voller Sinus aus 512 Einträgen.

Die DSPs sind u.A. auf Motorapplikationen maßgeschneidert, siehe 
controlSUIT.

Eine Lookup Tabelle auf fixed point finde ich schon sinnvoll. Die 
Tabelle ist normiert (p.u.). Wieso sollte das negativen Einfluss auf die 
Regelung haben?

Gruß,

von T.U.Darmstadt (Gast)


Lesenswert?

Matthias S. schrieb:
> Und nochmal:
> Matthias S. schrieb:
>> Warum sollte
>> die Regelung was mit der Sinustabelle zu tun haben?

Weil eine solche Sinustabelle eine endliche Auflösung hat und somit 
Fehler produziert.

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


Lesenswert?

Thomas U. schrieb:
> Weil eine solche Sinustabelle eine endliche Auflösung hat und somit
> Fehler produziert.

Jede Berechnung hat endliche 'Auflösung'. Und spätestens beim Umwandeln 
deiner berechneten Werte in eine PWM hast du die Auflösung begrenzt.
Wenn man sich also beim Erstellen der Tabelle nach der verfügbaren 
Auflösung der PWM richtet, dann hast du die volle mögliche Auflösung. 
Besser gehts sowieso nicht, wäre also verschwendete Mühe. Und natürlich 
kann ich die 6 Sektoren so fein auflösen, wie ich will. Es ist nur 
sinnlos, das weiter zu treiben, als der Motor überhaupt zulässt oder es 
erforderlich ist.
Und natürlich hat es keine Auswirkung auf eine Regelung, wo ich die 
Sinuswerte herhole.

: Bearbeitet durch User
von T.U.Darmstadt (Gast)


Lesenswert?

Matthias S. schrieb:
> Jede Berechnung hat endliche 'Auflösung'. Und spätestens beim Umwandeln
> deiner berechneten Werte in eine PWM hast du die Auflösung begrenzt.

Schon, aber dies wäre ja eigentlich der letzte Schritt.

von Joe F. (easylife)


Lesenswert?

Der Raumzeiger der Richtung in die der Motor stellen soll beinhaltet 
schon sin und cos. Es ist keine Tabelle nötig. Man benötigt nur noch 3 
um 120 Grad versetzte (normierte) Vektoren und bildet 3x das 
Vektorprodukt dieser Vektoren mit dem Richtungsvektor. Das ergibt direkt 
die 3 PWM Werte.
Über das Vektorprodukt errechnet man quasi auf sehr einfache Weise die 
Länge eines Vektors in Richtung des 2. Vektors.

: Bearbeitet durch User
von Joe F. (easylife)


Angehängte Dateien:

Lesenswert?

Korrektur:
Man berechnet nicht das Vektorprodukt, sondern das Skalarprodukt

S*A = S_r * A_r + S_i * A_i
S*B = S_r * B_r + S_i * B_i
S*C = S_r * C_r + S_i * C_i

Anbei eine Visualisierung, bei der die Motorwicklungen bei 45°, 165° und 
285° angenommen wurden (damit man besser sieht, wie sich die Phasen A, 
B, C gegenüber dem Eingangsvektor S verschieben).

: Bearbeitet durch User
von T.U.Darmstadt (Gast)


Lesenswert?

Joe F. schrieb:
> Der Raumzeiger der Richtung in die der Motor stellen soll beinhaltet
> schon sin und cos. Es ist keine Tabelle nötig.

Das Huhn enthält bereits ein Ei. Es sind keine Eier nötig, um Hühner zu 
erzeugen.

Oder anders: woher kommt der Sinus, mit dem der Raumzeigerwert gebildet 
wird? ... bzw genauer:  ... der Sinus, auf dessen Basis der Raumzeiger 
moduliert wird?

von Joe F. (easylife)


Lesenswert?

Thomas U. schrieb:
> Oder anders: woher kommt der Sinus, mit dem der Raumzeigerwert gebildet
> wird?

Das weiss ich nicht. So wie der Thread begann ist der (drehende) 
Raumzeiger als Eingangsgröße vorhanden.
Der Raumzeiger kann ja z.B. aus einem Steuergerät kommen, das einen 
Sinus genauer berechnen/erzeugen kann als es mit einer Tabelle in einem 
uC möglich wäre.

Mir ging es darum zu zeigen, dass die Transformation in 3 neue 
Richtungsvektoren für die PWM mit dem Skalarprodukt sehr einfach zu 
bewerkstelligen ist (2 Multiplikationen, 1 Addition pro Vektor).

: Bearbeitet durch User
von T.U.Darmstadt (Gast)


Lesenswert?

Joe F. schrieb:
> Mir ging es darum zu zeigen, dass die Transformation in 3 neue
> Richtungsvektoren für die PWM mit dem Skalarprodukt sehr einfach zu
> bewerkstelligen ist (2 Multiplikationen, 1 Addition pro Vektor).

Ich glaube die Umrechnung auf drei Vektoren mit Drehfaktor ist in 
heutigen Prozessoren ein Leichtes und beliebig genau. Die Problem hocken 
in anderen Ecken.

von Joe F. (easylife)


Lesenswert?

Thomas U. schrieb:
> Ich glaube die Umrechnung auf drei Vektoren mit Drehfaktor ist in
> heutigen Prozessoren ein Leichtes und beliebig genau. Die Problem hocken
> in anderen Ecken.

Achso, wie geht denn das auf "den heutigen Prozessoren", wenn man nicht 
weiss wie? Gibt es da ein Hardwaremodul? Eine Library?
Ich werde aus deinen Beiträgen nicht schlau. Worauf willst du hinaus?

: Bearbeitet durch User
von T.U.Darmstadt (Gast)


Lesenswert?

Nein, einfach komplexe Rechnung. 3 Vektoren mit beliebigem Winkel, 
meistens 120 Grad, als X + jY und auf den I + jQ des Zeigers 
aufmultiplizieren.

von Joe F. (easylife)


Lesenswert?

Thomas U. schrieb:
> 3 Vektoren mit beliebigem Winkel,
> meistens 120 Grad, als X + jY und auf den I + jQ des Zeigers
> aufmultiplizieren.

= Skalarprodukt ;-)

: Bearbeitet durch User
von Ingo L. (corrtexx)


Lesenswert?

Hier ein Auszug aus meiner RZM, auf das Wesentliche gekürzt:
1
#define L1_H  1
2
#define L1_L  0
3
4
#define L2_H  1
5
#define L2_L  0
6
7
#define L3_H  1
8
#define L3_L  0
9
10
#define L1  0
11
#define L2  1
12
#define L3  2
13
14
const uint32_t SwitchSate_R [7][3]={
15
  { L1_L , L2_L , L3_H },    // Sektor 0
16
  { L1_H , L2_L , L3_H },    // Sektor 1
17
  { L1_H , L2_L , L3_L },    // Sektor 2
18
  { L1_H , L2_H , L3_L },    // Sektor 3
19
  { L1_L , L2_H , L3_L },    // Sektor 4
20
  { L1_L , L2_H , L3_H },    // Sektor 5
21
  { L1_L , L2_L , L3_H },    // Sektor für Überlauf = Sektor 0
22
};
23
24
uint32_t RZMTable[] ={
25
    0  ,
26
    45  ,
27
    91  ,
28
    137  ,
29
    183  ,
30
    228  ,
31
    274  ,
32
    319  ,
33
    365  ,
34
    410  ,
35
    455  ,
36
    500  ,
37
    545  ,
38
    590  ,
39
    635  ,
40
    679  ,
41
    723  ,
42
    767  ,
43
    811  ,
44
    854  ,
45
    897  ,
46
    940  ,
47
    983  ,
48
    1025  ,
49
    1067  ,
50
    1109  ,
51
    1150  ,
52
    1191  ,
53
    1232  ,
54
    1272  ,
55
    1312  ,
56
    1351  ,
57
    1391  ,
58
    1429  ,
59
    1467  ,
60
    1505  ,
61
    1542  ,
62
    1579  ,
63
    1616  ,
64
    1651  ,
65
    1687  ,
66
    1722  ,
67
    1756  ,
68
    1790  ,
69
    1823  ,
70
    1856  ,
71
    1888  ,
72
    1919  ,
73
    1950  ,
74
    1981  ,
75
    2010  ,
76
    2040  ,
77
    2068  ,
78
    2096  ,
79
    2123  ,
80
    2150  ,
81
    2176  ,
82
    2201  ,
83
    2226  ,
84
    2250  ,
85
    2273
86
};
87
88
uint32_t RZMTableInv[] ={
89
    2273  ,
90
    2250  ,
91
    2226  ,
92
    2201  ,
93
    2176  ,
94
    2150  ,
95
    2123  ,
96
    2096  ,
97
    2068  ,
98
    2040  ,
99
    2010  ,
100
    1981  ,
101
    1950  ,
102
    1919  ,
103
    1888  ,
104
    1856  ,
105
    1823  ,
106
    1790  ,
107
    1756  ,
108
    1722  ,
109
    1687  ,
110
    1651  ,
111
    1616  ,
112
    1579  ,
113
    1542  ,
114
    1505  ,
115
    1467  ,
116
    1429  ,
117
    1391  ,
118
    1351  ,
119
    1312  ,
120
    1272  ,
121
    1232  ,
122
    1191  ,
123
    1150  ,
124
    1109  ,
125
    1067  ,
126
    1025  ,
127
    983  ,
128
    940  ,
129
    897  ,
130
    854  ,
131
    811  ,
132
    767  ,
133
    723  ,
134
    679  ,
135
    635  ,
136
    590  ,
137
    545  ,
138
    500  ,
139
    455  ,
140
    410  ,
141
    365  ,
142
    319  ,
143
    274  ,
144
    228  ,
145
    183  ,
146
    137  ,
147
    91  ,
148
    45  ,
149
    0
150
};
151
152
//Timer für Frequenz ISR
153
if (++Omega >= 60) {
154
 Omega = 0;
155
 if (++Sektor > 5){
156
  Sektor = 0;
157
 }
158
}
159
160
Anfangsvektor = (RZMTableInv[Omega] * Amplitude.ist) / 100;
161
Endvektor = (RZMTable[Omega] * Amplitude.ist) / 100;
162
Nullvektor = (RZM_PERIOD-Anfangsvektor-Endvektor) / 2;
163
164
TIM_SetCompare1(TIM1, ((SwitchSate_R[Sektor][L1]) * Anfangsvektor) + ((SwitchSate_R[Sektor+1][L1]) * Endvektor) + Nullvektor);
165
TIM_SetCompare2(TIM1, ((SwitchSate_R[Sektor][L2]) * Anfangsvektor) + ((SwitchSate_R[Sektor+1][L2]) * Endvektor) + Nullvektor);
166
TIM_SetCompare3(TIM1, ((SwitchSate_R[Sektor][L3]) * Anfangsvektor) + ((SwitchSate_R[Sektor+1][L3]) * Endvektor) + Nullvektor);
Die PWM läuft Center Aligned

: Bearbeitet durch User
von Al3ko -. (al3ko)


Lesenswert?

Hi Ingo,
vielen Dank für deinen Code. Eine Frage aus reiner Neugier:

Ingo L. schrieb:
> TIM_SetCompare1(TIM1, ((SwitchSate_R[Sektor][L1]) * Anfangsvektor) +
> ((SwitchSate_R[Sektor+1][L1]) * Endvektor) + Nullvektor);
> TIM_SetCompare2(TIM1, ((SwitchSate_R[Sektor][L2]) * Anfangsvektor) +
> ((SwitchSate_R[Sektor+1][L2]) * Endvektor) + Nullvektor);
> TIM_SetCompare3(TIM1, ((SwitchSate_R[Sektor][L3]) * Anfangsvektor) +
> ((SwitchSate_R[Sektor+1][L3]) * Endvektor) + Nullvektor);

Wieviel Rechenzeit wird für diesen Codeausschnitt benötigt?

Gruß,

von Ingo L. (corrtexx)


Lesenswert?

Al3ko -. schrieb:
> Wieviel Rechenzeit wird für diesen Codeausschnitt benötigt?
Das kann ich dir nicht sagen, habe mir die Zeiten nicht notiert. Viel 
ist es jedoch nicht, es ist ja kaum etwas zu tun. Es sind ja nur 3 
Additionen.

: Bearbeitet durch User
von Al3ko -. (al3ko)


Lesenswert?

Hi Ingo,
vielen Dank. Ich frage deshalb, weil ich selbst immer die Carrier Based 
Variante verwendet habe, in dem ich den Wert des Sinus direkt in Compare 
Register gegeben habe.

Das ist eine andere Implementationsweise als die "übliche" 
Raumzeigermodulation, in der die On-Zeiten der IGBTs berechnet werden.
1
PWMRegister = sine(Winkel)+RMZ_offset;
Wobei RMZ_offset die Spannung angibt, die letztendlich für die 
"Popo"Kurven zuständig ist.
Die übliche Raumzeigermodulation erfolgt über das Berechnen der 
On-Zeiten der IGBTs in Abhängigkeit von den Vektoren (Anfangsvektor, 
Endvektor und Nullvektor).

Jetzt würde mich mal interessieren:
In deinem Code berechnest du die "übliche" Raumzeigermodulation mittels 
Anfangsvektor, Endvektor und Nullvektor.
Das Ergebnis scheinst du aber ebenfalls in ein PWM Register zu geben.

Verstehe ich das richtig?

Ingo L. schrieb:
> TIM_SetCompare1(TIM1, ((SwitchSate_R[Sektor][L1]) * Anfangsvektor) +
> ((SwitchSate_R[Sektor+1][L1]) * Endvektor) + Nullvektor);
> TIM_SetCompare2(TIM1, ((SwitchSate_R[Sektor][L2]) * Anfangsvektor) +
> ((SwitchSate_R[Sektor+1][L2]) * Endvektor) + Nullvektor);
> TIM_SetCompare3(TIM1, ((SwitchSate_R[Sektor][L3]) * Anfangsvektor) +
> ((SwitchSate_R[Sektor+1][L3]) * Endvektor) + Nullvektor);

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.