Forum: Mikrocontroller und Digitale Elektronik Timer 5 Chanel 1 in capture Mode


von Ma B. (drumstick)


Lesenswert?

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
1
TIM1_CC_IRQn

Ich finde den Fehler einfach nicht! Weiss jemand Rat?
Besten Dank!

: Bearbeitet durch User
von Halb Blinder (Gast)


Lesenswert?

.... und warum zeigst du nicht deinen IRQ Handler
(der da vermutlich TIM5_IRQHandler heissen müsste)?

von Ma B. (drumstick)


Lesenswert?

Tag, ja klar hier!
1
void TIM5_IRQHandler(void)
2
{
3
  bool LEDrun = false;
4
  
5
  NVIC_DisableIRQ(TIM5_IRQn);
6
  
7
  if(TIM_GetITStatus(TIM5, TIM_IT_CC1) == 1)
8
  {
9
    TIM_ClearITPendingBit(TIM5, TIM_IT_CC1);
10
  
11
    if(LEDrun)
12
    {
13
      LED_On (LED_RUN);  // set the LED on                         
14
    }
15
    else
16
    {
17
      LED_Off(LED_RUN);    // set the LED off
18
    }
19
    LEDrun = !LEDrun;    // inverse the LED status, the LED flashes
20
  }
21
  NVIC_EnableIRQ(TIM5_IRQn);     
22
}

: Bearbeitet durch User
von Halb Blinder (Gast)


Lesenswert?

Hmmm... Vermutungen:

MC B. schrieb:
1
  if(TIM_GetITStatus(TIM5, TIM_IT_CC1) == 1)

Wenn du die SPL Calls verwendest musst du auch die Return-Werte
aus der SPL verwenden sonst kann das schief gehen.
1
typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;

Diese Zeile wir dir vermutlich schon den IRQ löschen:
1
  NVIC_DisableIRQ(TIM5_IRQn);

bevor du ihn direkt selbst löschst ....

von Ma B. (drumstick)


Lesenswert?

Hier noch die Init der GPIO
1
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);  // Enable the Clock for Port A
2
GPIO_InitStructure.GPIO_Pin         = GPIO_Pin_1;
3
  GPIO_InitStructure.GPIO_Mode      = GPIO_Mode_AF;
4
  GPIO_InitStructure.GPIO_Speed     = GPIO_Speed_100MHz;
5
  GPIO_InitStructure.GPIO_OType     = GPIO_OType_PP;
6
  GPIO_InitStructure.GPIO_PuPd      = GPIO_PuPd_NOPULL; 
7
  GPIO_Init(GPIOA, &GPIO_InitStructure);
8
9
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_TIM5);

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.