Hallo Community, ich bin gerade am verzweifeln ich versuche mit dem Timer 3 und dem entsprechenden Encoder Interface meinen Drehencoder auszuwerten. Die Init. rufe ich wie folgt auf..
1 | TIMEREncoderInit( TIM3, TIMER_ENC_MODE_3, 100 ); |
Die internen PullUps an PB4 / PB5 sind auch aktiviert und auch gemessen. Mein Enc. sollte also auf fallende Flanken reagieren. Die beiden ALT Modes für die entsprechenden Pins wurden auch gewählt. (TIM3_CH1, TIM3_CH2). Wenn ich jetzt in der while(1) das Zählregister von meinem Timer auf gemessene Impulse abfrage kommt gefühlt nur Mist bei raus..
1 | if ( TIM3->CNT > 10 ) |
2 | {
|
3 | GPIOTogglePin( GPIOC, PIN_9 ); |
4 | TIM3->CNT = 0; |
5 | }
|
Bei einem RASTPUNKT geht er direkt in die if Abfrage. Habe ich etwas falsches initalisiert?! Hier mal die Init.
1 | TIMER_ERROR_CODE_t TIMEREncoderInit( TIM_TypeDef *pTim, TIMER_ENCODER_MODE_t eEncMode, TIMER_ENCODER_EDGES_t eEdge, uint32_t uiMaxCount ) |
2 | {
|
3 | if ( TIMERHasTimer( pTim ) != TIMER_OK ) |
4 | {
|
5 | return TIMER_UNKNOWN; |
6 | }
|
7 | |
8 | pTim->CCMR1 |= ( TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0 ); // TI1FP1 mapped to TI1, TI2FP2 mapped to TI2 |
9 | pTim->CCER &= ~( TIM_CCER_CC1NP | TIM_CCER_CC2NP | TIM_CCER_CC1P | TIM_CCER_CC2P ); |
10 | |
11 | |
12 | switch ( eEdge ) |
13 | {
|
14 | case TIMER_ENCODER_FALLING_EDGE: |
15 | {
|
16 | pTim->CCER |= ( TIM_CCER_CC1P | TIM_CCER_CC2P ); |
17 | }break; |
18 | |
19 | case TIMER_ENCODER_RISING_EDGE: |
20 | {
|
21 | // pTim->CCER &= ~( TIM_CCER_CC1NP | TIM_CCER_CC2NP );
|
22 | }break; |
23 | |
24 | case TIMER_ENCODER_BOTH_EDGE: |
25 | {
|
26 | pTim->CCER |= ( TIM_CCER_CC1P | TIM_CCER_CC1NP ); |
27 | pTim->CCER |= ( TIM_CCER_CC2P | TIM_CCER_CC2NP ); |
28 | }break; |
29 | |
30 | case __TIMER_ENCODER_EDGE_MAX__: |
31 | {
|
32 | return TIMER_ENCODER_EDGE_UNKNOWN; |
33 | }break; |
34 | }
|
35 | |
36 | |
37 | switch ( eEncMode ) |
38 | {
|
39 | case TIMER_ENC_MODE_1: |
40 | {
|
41 | pTim->SMCR &= ~( TIM_SMCR_SMS_1 ); |
42 | pTim->SMCR |= ( TIM_SMCR_SMS_0 ); |
43 | }break; |
44 | |
45 | case TIMER_ENC_MODE_2: |
46 | {
|
47 | pTim->SMCR &= ~( TIM_SMCR_SMS_0 ); |
48 | pTim->SMCR |= ( TIM_SMCR_SMS_1 ); |
49 | }break; |
50 | |
51 | case TIMER_ENC_MODE_3: |
52 | {
|
53 | pTim->SMCR |= ( TIM_SMCR_SMS_0 | TIM_SMCR_SMS_1 ); |
54 | }break; |
55 | |
56 | case __TIMER_ENC_MODE_MAX__: |
57 | {
|
58 | return TIMER_ENC_MODE_UNKNOWN; |
59 | }break; |
60 | }
|
61 | |
62 | pTim->ARR = uiMaxCount; |
63 | |
64 | return TIMER_OK; |
65 | }
|