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