Forum: Mikrocontroller und Digitale Elektronik Encoder an Timer 5 entprellen STM32F4


von Ma B. (drumstick)


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

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.