Forum: Digitale Signalverarbeitung / DSP / Machine Learning motor control mit floating point format hilfe


von tequila (Gast)


Lesenswert?

hallo,
dringend hilfe brauche ich.
ich benutze ezdsp f28335 für meine masterarbeit um AC motor zu regeln.
auf homepage von TI gibts sowas "F280x ACI3_3:Sensored Indirect Flux 
Vector Control of Three-Phase ACI Motor -SPRC207" .Das ist mir sehr 
hilfreich.aber da benutzt man IQ-Math.Ich vermute mal,in meinem 
Fall,also f28335 floating point DSP brauche ich nicht IQ-Math zu 
benutzen(?).
Z.b. In literatur "svgen_dq.pdq" wird erklärt wie man mit µC 
Raummodulation erzeugen kann, würde ich sagen :Ta, Tb und Tc MÜSSEN 
innerhalb von [0 ,1] bleiben.Deswegen schreibe ich in C-code mit 
floating point format:
1
void svgendq_calc(SVGENDQ *v)
2
{
3
  float32 Va,Vb,Vc,t1,t2;
4
  Uint16 Sector = 0;
5
  
6
//Inverse clarke transformation
7
  Va = v->Ubeta;
8
  Vb = (-v->Ubeta + 1.73205081*v->Ualpha)/2;//1.73205081 = sqrt(3), Ualpha ist float32
9
  Vc = (-v->Ubeta - 1.73205081*v->Ualpha)/2;
10
11
//60 Grad Sector determination with Sector = 4*c + 2*b + a
12
  if (Va > 0)
13
    Sector = 1;
14
  if (Vb > 0)
15
    Sector = Sector + 2;
16
  if (Vc > 0)
17
    Sector = Sector + 4;
18
19
// X,Y,Z (Va,Vb,Vc) calculations
20
  Va = v->Ubeta;
21
  Vb = (v->Ubeta + v->Ualpha*1.73205081)/2;
22
  Vc = (v->Ubeta - v->Ualpha*1.73205081)/2;
23
24
  if (Sector == 0) //(Ualpha,Ubeta) = (0,0)
25
  {
26
    v->Ta = 0;
27
    v->Tb = 0;
28
    v->Tc = 0;
29
  }  
30
  else if 
31
  //......
32
}
Diese bestimmten Werte Ta,Tb,Tc gebe ich PWM_update Compare Register 
über:
1
EPwm1Regs.CMPA.half.CMPA = (Uint16)(v->Ta*PWM_periode);//ich erwarte:
2
 // 0<= Ta <= 1 ,dann 0<= CMPA =<  PWM_periode
3
EPwm2Regs.CMPA.half.CMPA = (Uint16)(v->Tb*PWM_periode);
4
EPwm3Regs.CMPA.half.CMPA = (Uint16)(v->Tc*PWM_periode);


Ich hab versucht mit Abtastfrequenz 20Khz, es scheint zu funktionieren, 
aber wenn ich schaue in WatchWindow wundere ich mich dass Ta,Tb,Tc nicht 
innerhalb von [0,1] bleiben sondern gibts auch werte wie 14.254 und so 
weiter.Und deswegen Compare register wert ist größer als PWM_periode 
(maximal counter von UP_DOWN counter).

so sample-code in IQ-math von TI:
1
void svgendq_calc(SVGENDQ *v)
2
{  
3
4
  _iq Va,Vb,Vc,t1,t2;
5
  Uint32 Sector = 0;  // Sector is treated as Q0 - independently    //with global Q
6
                                  
7
// Inverse clarke transformation
8
    Va = v->Ubeta;
9
    Vb = _IQmpy(_IQ(-0.5),v->Ubeta) + _IQmpy(_IQ(0.8660254),v->Ualpha);  // 0.8660254 = sqrt(3)/2 
10
    Vc = _IQmpy(_IQ(-0.5),v->Ubeta) - _IQmpy(_IQ(0.8660254),v->Ualpha);  // 0.8660254 = sqrt(3)/2
11
12
// 60 degree Sector determination
13
    if (Va>_IQ(0))
14
       Sector = 1; 
15
    if (Vb>_IQ(0))
16
       Sector = Sector + 2;
17
    if (Vc>_IQ(0))   
18
       Sector = Sector + 4;
19
     //  .....
20
21
// Convert the unsigned GLOBAL_Q format (ranged (0,1)) -> signed GLOBAL_Q format (ranged (-1,1))
22
    v->Ta = _IQmpy(_IQ(2.0),(v->Ta-_IQ(0.5)));
23
    v->Tb = _IQmpy(_IQ(2.0),(v->Tb-_IQ(0.5)));
24
    v->Tc = _IQmpy(_IQ(2.0),(v->Tc-_IQ(0.5)));
25
26
}
zweite frage ist es: wieso muss man die letzten zeilen 
implementieren,(also liegen dann Ta,Tb,Tc innerhalb[-1.1])?

vielen dank im voraus!
Tequila

von Ralf (Gast)


Lesenswert?

Hallo Tequilla,

es ist bei mir zwar schon etwas her, als ich mit diesen Themen (TI, 
DSP's) konfrontiert war:

kann mich aber entsinnen, dass es mit Type-Vereinbarungen und Typecasts 
in structs und Zeigern auf float-Variablen immer etwas hakelig war; das 
WatchFenster hatte nicht unbedingt das angezeigt, was wirklich Sache 
war. Ich hatte das zum Beobachten testweise erst mal in eine globale 
Variable umgespeichert. (Bevor man am Programmcode zweifelt ...).

Gruß
Ralf Schlegelmilch

von tequila (Gast)


Angehängte Dateien:

Lesenswert?

danke Ralf erstmal für deinen Antwort.

ich hab noch mal geschaut, und in meinem fall zeigt CCS richtig 
an.Problem habe ich gefunden, es liegt an meinen space_vector_modulation 
algorithmus.Ich hab vergessen,Alpha und Beta Kodinaten auf den Maximal 
wert (Umax = Uvcd/sqrt(3)) zu norminieren.Dann wie erwartet ,Ta,Tb,Tc 
bleiben innerhalb (0,1).

Aber wie ich nach svgendq reference (bitte siehe Anhang)verstehe,für 
PWM-Compare Register brauche ich nur noch:
1
EPwm1Regs.CMPA.half.CMPA = (Uint16)(v->Ta*PWM_periode);//ich erwarte:
2
 // 0<= Ta <= 1 ,dann 0<= CMPA =<  PWM_periode
3
EPwm2Regs.CMPA.half.CMPA = (Uint16)(v->Tb*PWM_periode);
4
EPwm3Regs.CMPA.half.CMPA = (Uint16)(v->Tc*PWM_periode);

Aber es funktioniert nicht!

Ich hab dann einzelne Modul getestet.

1. Erstmal nur  IPARK modul : funktioniert wie erwartet, also Vd,Vq = 
const
   ----> Valpha,Vbeta sind sinusförmig.

2. IPARK + SVGENDQ:
   Vd,Vq = const.
   Ta,Tb,Tc bleiben innerhalb (0,1) aber nicht in form von (sinus + 
dritte hamonic) bitte siehe anhang.

   Wenn ich aber erzwingen dass Ta,Tb,Tc innerhalb (-1,1) bleiben 
müssen,also nach Umformung:(so sieht das aus in samplecode von TI)
1
   Ta = 2(Ta - 0.5);
2
   Tb = 2(Tb - 0.5);
3
   Tc = 2(Tc - 0.5);

dann sieht man auf CCS Graphtool dass Ta,Tb,Tc sind in form von (sinus + 
dritte hamonic).

Kann Jemand mir erklären, wieso man umformen muss:
1
   Ta = 2(Ta - 0.5);
2
   Tb = 2(Tb - 0.5);
3
   Tc = 2(Tc - 0.5);

und wie berechnet man dann CompareRegister?


vielen dank im voraus!

Tequila

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.