www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP drehzahlerfassung mit QEP


Autor: tequila Ga Gia (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich hab eine frage für quadrature encode pulse (QEP) , für 
drehgeschwindigkeitserfassung.
Mein  Encoder hat 500 lines , und 3 signal A;B und Index. Mein DSP ist 
ezdsp f28335

Mit abtastfrequenz von 10khz , und  maximal drehzahl ist 50 Umdrehung/s 
, dann mein PI-Drehzahlregler funktioniert, aber wenn w_ref kleiner ist 
(zum beispiel w_ref = 10 Umdrehung/s) kommt mein regler instabil. Ich 
hab da asynchronmaschinen,  ich glaube es liegt an Drehzahlerfassung. 
Aber mir nicht sicher.

Mit 500 lines encoder, wmax = 50hz, fabtast = 10Khz, dann in einer 
Abtastperiode ist die maximal Impuls_counts_differenz  : Aus  w[1/s]  = 
[delta_counts/(4*500 lines)]* fabtast.
---> wmax = 50 = delta_counts_max/(4*500 lines)]* 10000
---> delta_counts_max  = 10 counts.

Der code sieht so aus :
  EQep1Regs.QDECCTL.bit.QSRC=00;  // QEP quadrature count mode
  EQep1Regs.QEPCTL.bit.FREE_SOFT=2;  //unaffected by emulation suspend
  EQep1Regs.QEPCTL.bit.PCRM=00;  // PCRM=00 mode - QPOSCNT reset on 
            ///index event
  EQep1Regs.QEPCTL.bit.UTE=1;     // Unit Timeout Enable 
  EQep1Regs.QEPCTL.bit.QCLM=1;   // Latch on unit time out
  EQep1Regs.QEPCTL.bit.IEL = 1;     // IEL_RISING
  EQep1Regs.QEPCTL.bit.IEI = 2;     // IEL_RISING
  EQep1Regs.QPOSMAX=4*500 - 1;
  EQep1Regs.QEPCTL.bit.QPEN=1;     // QEP enable
    
      EALLOW;   // Enable EALLOW
     GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 1;  // GPIO20 is EQEP1A
     GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 1;  // GPIO21 is EQEP1B
    GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 1;  // GPIO23 is EQEP1I
   EDIS;    


In interrupt routine mit 10khz = fabtast

interrupt void main_isr(void)
 {
float Tmp1;
//……………
//…………….
//………………



if (SpeedMessungcount == SpeedMessungAbtast)
// damit kann ich drehzahl_abtastfrequenz kleiner
// machen , drehzahl_abtastfrequenz = fabtast/ SpeedMessungAbtast
  {
// Check the position counter for EQEP1 
       RawTheta = (Uint16)EQep1Regs.QPOSCNT ;// QPOSCNT 32 bit
       
// Compute the mechanical angle 
       MechTheta = RawTheta/(4*500);

// erste verfahren, da  MechTheta leigt im interval (0 - 1), dann es gibt unableitbaren Bereich

    if ((MechTheta < 0.95)&&(MechTheta > 0.05)) // ableitbar Bereich
      Tmp1 = fabtast*(MechTheta - OldMechTheta)*60;//rpm 
    else Tmp1 = Speed;//rpm




/*
// zeite verfahren,

  if (DirectionQep == 0)        // POSCNT is counting down
          {
      if (MechTheta  >  OldMechTheta)
         Tmp1 = -(1.0  - MechTheta + OldMechTheta)*fabtast; 
               //x2-x1 should be negative  
      else
      Tmp1 = (v->MechTheta - v->OldMechTheta)*v->K1;
      }
  else if (DirectionQep ==1 ) // POSCNT is counting up
     {
      if (MechTheta  < OldMechTheta)
      Tmp1 = (1.0 + MechTheta - OldMechTheta)* fabtast;
      else 
      Tmp1 = (MechTheta - OldMechTheta)* fabtast; 
               // x2-x1 should be positive
      }

  Tmp1 *= 60; //rpm
 
*/


// Low-pass filter 
 Tmp1 = K2*Speed + K3*Tmp1; // e.g. fc = 50hz  , 1. Order

     if (Tmp1 > BaseRpm) // BaseRpm = 3000 rpm
       Speed = BaseRpm;
     else if (Tmp1 < - BaseRpm)
       Speed = - BaseRpm;      
     else
       Speed = Tmp1;

// Update the electrical angle
   OldMechTheta = MechTheta;
    
        SpeedMessungcount = 1;
  } 
  else SpeedMessungcount++;
}


Könnt Ihr mir empfehlen, wie ich die speedmessung besser machen kann?

Vielen dank im voraus!

Tequila Ga Gia

Autor: tequila Ga Gia (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es fehlt noch :

In code :
[c]

//....
if (SpeedMessungcount == SpeedMessungAbtast)
// damit kann ich drehzahl_abtastfrequenz kleiner
// machen , drehzahl_abtastfrequenz = fabtast/ SpeedMessungAbtast
  {
// Check the position counter for EQEP1
       RawTheta = (Uint16)EQep1Regs.QPOSCNT ;// QPOSCNT 32 bit

// Compute the mechanical angle
       MechTheta = RawTheta/(4*500);

// erste verfahren, da  MechTheta leigt im interval (0 - 1), dann es 
gibt unableitbaren Bereich

    if ((MechTheta < 0.95)&&(MechTheta > 0.05)) // ableitbar Bereich
      Tmp1 = SpeedMessungAbtast*fabtast*(MechTheta 
-OldMechTheta)*60;//rpm
    else Tmp1 = Speed;//rpm




/*
// zeite verfahren,

  if (DirectionQep == 0)        // POSCNT is counting down
          {
      if (MechTheta  >  OldMechTheta)
         Tmp1 = -(1.0-MechTheta 
+OldMechTheta)*fabtast*SpeedMessungAbtast;
               //x2-x1 should be negative
      else
      Tmp1 = (MechTheta - OldMechTheta)*fabtast*SpeedMessungAbtast;
      }
  else if (DirectionQep ==1 ) // POSCNT is counting up
     {
      if (MechTheta  < OldMechTheta)
      Tmp1 = (1.0 + MechTheta - OldMechTheta)* 
fabtast*SpeedMessungAbtast;
      else
      Tmp1 = (MechTheta - OldMechTheta)* fabtast*SpeedMessungAbtast;
               // x2-x1 should be positive
      }

  Tmp1 *= 60; //rpm

*/

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.