Guten Tag
Ich habe einen BLDC-Motor mit einem FG Signal. Dieses Signal habe ich am
Pin PA1 meines STM32F405RGT Controllers. Ich möchte die Geschwindigkeit
und den zurückgelegten Weg ermitteln, in dem ich den Timer 5 Channel 1
im capture Mode einsetze. So kann ich die Zeit zwischen zwei Positiven
Flanken messen und die Anzahl Pulse erfassen in dem ein Interrupt
ausgelöst wird.
Init des Timers
1 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
|
2 |
|
3 | TIM_PrescalerConfig(TIM5, 4, TIM_PSCReloadMode_Immediate);
|
4 |
|
5 | TIM_ICInitTypeDef TIM_ICInitStructure;
|
6 |
|
7 | TIM_ICStructInit(&TIM_ICInitStructure);
|
8 | TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
|
9 | TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
|
10 | TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
|
11 | TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
|
12 | TIM_ICInitStructure.TIM_ICFilter = 0x03;
|
13 |
|
14 | TIM_ICInit(TIM5, &TIM_ICInitStructure);
|
15 | }
|
16 |
|
17 |
|
18 | TIM_UpdateRequestConfig(TIM5, TIM_UpdateSource_Global);
|
19 | TIM_SetAutoreload (TIM5, 0x000F);
|
20 | TIM_SetCounter (TIM5, 0x0);
|
21 |
|
22 | TIM_ITConfig(TIM5, TIM_IT_CC1, ENABLE);
|
23 |
|
24 | TIM5->EGR |= (1 << TIM_EGR_UG);
|
25 | /* TIM enable counter */
|
26 | TIM_Cmd(TIM5, ENABLE);
|
Init des Interrupts
1 | NVIC_InitTypeDef NVIC_InitStructure;
|
2 |
|
3 | NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
|
4 | NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
|
5 | NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
|
6 | NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
7 | NVIC_Init(&NVIC_InitStructure);
|
8 | NVIC_EnableIRQ(TIM5_IRQn);
|
Der Interrupt wird nur einmal ausgelöst. Wenn ich aber im Debugmode den
GPIOA betrachte, sehe ich, wie der Zustand von PA1 alterniert, wenn ich
am Motor drehe.
1 | NVIC_EnableIRQ(TIM5_IRQn);
|
Ich finde kein Interrupt-Number für den capture Interrupt Timer 5.
Wie z.B. für Timer1
Ich finde den Fehler einfach nicht! Weiss jemand Rat?
Besten Dank!