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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Ma B. (drumstick)


Bewertung
0 lesenswert
nicht 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)


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

von Ma B. (drumstick)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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);

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.