Encoder an Timer 5 entprellen STM32F4

OP #3900274
Lesenswert?
• ▲
▼
Hallo

Ich arbeite mit dem STM32F405RGT6 und mit dem yVision mdk5 von keil.

Ich hab einen Antrieb der eine gerade Strecke hin und zurück fährt. Nur 
mit Bedienung der Schalter (Öffnen, Schliessen).

Der Signale A und B des Encoders habe ich am Timer 5 CH1 u. CH2 
angeschlossen.

Mit einem Timer Interrupt ermittle ich all 25ms die Differenz des CNT 
Registers des Timer 5 der ja im Encodermodus läuft. Da der Antrieb immer 
ganz an den Anschlag fahren muss, halte ich erst an, wenn der Antrieb 
eine Geschw. von weniger als 1mm/s über eine dauer von 0.75s aufweist.

Linker Anschlag = Nullpunkt; rechter Anschlag = Max.Wert (z.B.57000).

Der Encoder prellt aber nun am linken Anschlag, bzw. ich habe ständig 
einen underflow/overflow. --> TIM_FLAG_Update.

Das Problem ist nun, gibt es eine Möglichkeit den underflow vom overflow 
zu unterscheiden? Negative Werte ergeben sich ja nicht.

Da ich ja mit der Differenz die Geschw. ermittle, ergeben sich im 
Nullpunkt plötzlich sehr hohe Geschwindigkeiten.

Wenn ich den underflow erfassen könnte, würde ich dann das 2er 
Komplement bilden und die Differenz würde wieder passen.

Ich hoffe ich konnte mich einigermassen klar ausdrücken? Vielleicht ist 
mein Lösungsansatz auch nicht der richtige?

Ermittlung der Differenz mit mit einem Timer 3 Interrupt alle 25ms:
1
void TIM3_IRQHandler(void)
2
{
3
  float     v;
4
  uint32_t Mot_Pulses_Current  = get_MotorDistCounter();
5
        
6
  TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
7
  
8
  NVIC_DisableIRQ(TIM3_IRQn);
9
  
10
  if(Mot_Pulses_Last < Mot_Pulses_Current)
11
  {
12
    MotPulseDiff      = Mot_Pulses_Current - Mot_Pulses_Last;
13
  }
14
  else
15
  {
16
    MotPulseDiff      = abs(Mot_Pulses_Current - Mot_Pulses_Last);
17
  }
18
  
19
  resultPPSEncode = ((float)MotPulseDiff);// * cfMilliSecsPerSec);  
20
  v = (resultPPSEncode * 40) * (mm_perpulse);
21
  set_Motor_speed_mm_s(v);
22
  Mot_Pulses_Last = Mot_Pulses_Current;
23
    
24
  NVIC_EnableIRQ(TIM3_IRQn);     
25
}

Vielen Dank und Grüsse

MC Bu

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.