www.mikrocontroller.net

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


Autor: tequila (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
void svgendq_calc(SVGENDQ *v)
{
  float32 Va,Vb,Vc,t1,t2;
  Uint16 Sector = 0;
  
//Inverse clarke transformation
  Va = v->Ubeta;
  Vb = (-v->Ubeta + 1.73205081*v->Ualpha)/2;//1.73205081 = sqrt(3), Ualpha ist float32
  Vc = (-v->Ubeta - 1.73205081*v->Ualpha)/2;

//60 Grad Sector determination with Sector = 4*c + 2*b + a
  if (Va > 0)
    Sector = 1;
  if (Vb > 0)
    Sector = Sector + 2;
  if (Vc > 0)
    Sector = Sector + 4;

// X,Y,Z (Va,Vb,Vc) calculations
  Va = v->Ubeta;
  Vb = (v->Ubeta + v->Ualpha*1.73205081)/2;
  Vc = (v->Ubeta - v->Ualpha*1.73205081)/2;

  if (Sector == 0) //(Ualpha,Ubeta) = (0,0)
  {
    v->Ta = 0;
    v->Tb = 0;
    v->Tc = 0;
  }  
  else if 
  //......
}
Diese bestimmten Werte Ta,Tb,Tc gebe ich PWM_update Compare Register 
über:
EPwm1Regs.CMPA.half.CMPA = (Uint16)(v->Ta*PWM_periode);//ich erwarte:
 // 0<= Ta <= 1 ,dann 0<= CMPA =<  PWM_periode
EPwm2Regs.CMPA.half.CMPA = (Uint16)(v->Tb*PWM_periode);
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:
void svgendq_calc(SVGENDQ *v)
{  

  _iq Va,Vb,Vc,t1,t2;
  Uint32 Sector = 0;  // Sector is treated as Q0 - independently    //with global Q
                                  
// Inverse clarke transformation
    Va = v->Ubeta;
    Vb = _IQmpy(_IQ(-0.5),v->Ubeta) + _IQmpy(_IQ(0.8660254),v->Ualpha);  // 0.8660254 = sqrt(3)/2 
    Vc = _IQmpy(_IQ(-0.5),v->Ubeta) - _IQmpy(_IQ(0.8660254),v->Ualpha);  // 0.8660254 = sqrt(3)/2

// 60 degree Sector determination
    if (Va>_IQ(0))
       Sector = 1; 
    if (Vb>_IQ(0))
       Sector = Sector + 2;
    if (Vc>_IQ(0))   
       Sector = Sector + 4;
     //  .....

// Convert the unsigned GLOBAL_Q format (ranged (0,1)) -> signed GLOBAL_Q format (ranged (-1,1))
    v->Ta = _IQmpy(_IQ(2.0),(v->Ta-_IQ(0.5)));
    v->Tb = _IQmpy(_IQ(2.0),(v->Tb-_IQ(0.5)));
    v->Tc = _IQmpy(_IQ(2.0),(v->Tc-_IQ(0.5)));

}        

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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: tequila (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
EPwm1Regs.CMPA.half.CMPA = (Uint16)(v->Ta*PWM_periode);//ich erwarte:
 // 0<= Ta <= 1 ,dann 0<= CMPA =<  PWM_periode
EPwm2Regs.CMPA.half.CMPA = (Uint16)(v->Tb*PWM_periode);
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)
   Ta = 2(Ta - 0.5);
   Tb = 2(Tb - 0.5);
   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:
   Ta = 2(Ta - 0.5);
   Tb = 2(Tb - 0.5);
   Tc = 2(Tc - 0.5);

und wie berechnet man dann CompareRegister?


vielen dank im voraus!

Tequila

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.