Hallo!
Ich hab' mir mal den entsprechenden Codeteil der AN1078 angesehen - wie es scheint wird die inverse Clarke-Transformation doch noch ausgeführt, d.h. ins 3-Achsen-System zurückgerechnet.
Die Gleichungen zur Berechnung der PWM-Werte aus den Werten für die 3 Phasen scheinen sehr sehr einfach zu sein und enthalten keine Winkelfunktionen. So ganz verstehe ich den Lösungsweg aber noch nicht
Der folgende Code ist eine C-Übersetzung des eigentlichen Codeteils, der in Assembler geschrieben ist. Alle verwendeten Variablen scheinen global zu sein.
Code:
void CalcRefVec( void )
{
if( Vr1 >= 0 )
{
// (xx1)
if( Vr2 >= 0 )
{
// (x11)
// Must be Sector 3 since Sector 7 not allowed
// Sector 3: (0,1,1) 0-60 degrees
T1 = Vr2
T2 = Vr1
CalcTimes();
dPWM1 = Ta
dPWM2 = Tb
dPWM3 = Tc
}
else
{
// (x01)
if( Vr3 >= 0 )
{
// Sector 5: (1,0,1) 120-180 degrees
T1 = Vr1
T2 = Vr3
CalcTimes();
dPWM1 = Tc
dPWM2 = Ta
dPWM3 = Tb
}
else
{
// Sector 1: (0,0,1) 60-120 degrees
T1 = -Vr2;
T2 = -Vr3;
CalcTimes();
dPWM1 = Tb
dPWM2 = Ta
dPWM3 = Tc
}
}
}
else
{; // (xx0)
if( Vr2 >= 0 )
{
// (x10)
if( Vr3 >= 0 )
{
// Sector 6: (1,1,0) 240-300 degrees
T1 = Vr3
T2 = Vr2
CalcTimes();
dPWM1 = Tb
dPWM2 = Tc
dPWM3 = Ta
}
else
{
// Sector 2: (0,1,0) 300-0 degrees
T1 = -Vr3
T2 = -Vr1
CalcTimes();
dPWM1 = Ta
dPWM2 = Tc
dPWM3 = Tb
}
}
else
{
// (x00)
// Must be Sector 4 since Sector 0 not allowed
// Sector 4: (1,0,0) 180-240 degrees
T1 = -Vr1
T2 = -Vr2
CalcTimes();
dPWM1 = Tc
dPWM2 = Tb
dPWM3 = Ta
}
}
}
void CalcTimes(void)
{
T1 = PWM*T1
T2 = PWM*T2
Tc = (PWM-T1-T2)/2
Tb = Ta + T1
Ta = Tb + T2
}
Der Teil, in dem der Sektor bestimmt wird ist ja noch verständlich, die drei ersten Gleichungen von CalcTimes() ja auch - die beiden nächsten verstehe ich aber überhaupt nicht, vor allem, da anscheinend die Zeitwerte der vorhergehenden Berechnung ebenfalls eine Rolle spielen...
Schöne Grüße!
Lesezeichen