Ich verstehe eigentlich das Problem nicht. Diese Timer konnen so konfiguriert werden das ein kwadratuur encoder eingelesen werd. Der counter wird dan eindeutig die Flanken zaehlen und abhangig das A oder B erst kommt in die richtige Richtung zaehlen. So hat der Counter immer die exacte Position von Drehgeber. Einen Input Capture muss nicht gemacht werden. Ich habe diese Function schon getestet mit das Discovery board, und das functioniert. Für eine Geschwindigkeitsmessung kan ess Sinn machen von die Abstand zwischen Zwei Flanken zu erfassen. In Prinzip muss das auch moglich sein, aber dan mussen sie eine extra Timer verwenden. Das ist dan eine standard ICP Ablauf. Functioniert auch bei mir, aber standard wird oder die Steigende Flanke, oder die Fallende flanke captiert. Zwie moglichkeiten um beide zu captieren : Zwei Kanalen verwenden (ein Timer hat 4 Kanalen) oder das register in ISR selbst togglen.
Sie mussen naturlich auch noch die ISR programmieren. Da werd bei jeden capture ein TIM2_IRQHandler aufgerufen. In diesen ISR muss dan getestet werden in welches Kanal das passiert ware. Forbild von so einen ISR (steht bei mir in die c-file: stm32f10x_it.c (IAR compiler)
Code:
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2, TIM_IT_CC3) == SET) //stijgende flank : stroom> 10 mA
{
kanaal[i]= TIM_GetCapture3(TIM2)-ICP_old;
ICP_old=TIM_GetCapture3(TIM2);
/* Clear TIM3 Capture compare interrupt pending bit */
TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);
}
if(TIM_GetITStatus(TIM2, TIM_IT_CC4) == SET) //dalende flank : stroom< 10 mA
{
kanaal[i]= TIM_GetCapture4(TIM2)-ICP_old;
ICP_old=TIM_GetCapture4(TIM2);
/* Clear TIM4 Capture compare interrupt pending bit */
TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);
}
}
Lesezeichen