STM32F4 Timer2 im Encoder Mode plus Capture Compare

OP #3994251
Lesenswert?
• ▲
▼
Hallo

Ich habe Timer2 als Encoder Timer konfiguriert, was auch super 
funktioniert. Jetzt möchte ich zusätzlich einen TimerWert als Compare 
Wert setzen, der mir einen Interrupt auslöst sobald die Encoder-Position 
diesen Wert erreicht, der Timer soll aber weiterzählen.
Geht das überhaupt? Mit der Konfiguration unten geht es leider nicht.
Beispiel:
Encoder Timer Werte steht auf 1000, sobald ich den Encoder drehe, wird 
der Timerstand erhöht bis 10000 usw. Wird die Position von 5000 erreicht 
möchte ich einen Interrupt, der Zähler soll aber normal weiterlaufen.

void PositionEncoder_Config(void)
{
    GPIO_InitTypeDef   GPIO_InitStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_5;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_TIM2);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_TIM2);

    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_TimeBaseStructure.TIM_Period = 0xffff;
    TIM_TimeBaseStructure.TIM_Prescaler = 0;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;

    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
    /* Configure the timer */
    TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, 
TIM_ICPolarity_Rising, TIM_ICPolarity_Falling);

    TIM_SetCounter (TIM2, (uint32_t) Encoder_Position_Default); 
//set the Timer to the default init value (middle)

    /* TIM2 counter enable */
    TIM_Cmd(TIM2, ENABLE);

    //TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
  TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);
  TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);

  /////////////////////
  // configure PWM mode and duration
  TIM_OCStructInit (&TIM_OCInitStructure);
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing; 
//TIM_OCMode_Timing
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable; 
//TIM_OutputState_Enable
  //TIM_OCInitStructure.TIM_Pulse = PulseDurationInMicroSeconds; // set 
the duty cycle / pulse here!
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  TIM_OC1Init(TIM2, &TIM_OCInitStructure);
  TIM_OC2Init(TIM2, &TIM_OCInitStructure);
}
Gast #3994261
Lesenswert?
• ▲
▼
1
void PositionEncoder_Config(void)
2
{
3
    GPIO_InitTypeDef   GPIO_InitStructure;
4
    TIM_OCInitTypeDef  TIM_OCInitStructure;
5

6
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
7
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
8

9
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
10
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
11
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
12
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_5;
13

14
    GPIO_Init(GPIOA, &GPIO_InitStructure);
15

16
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_TIM2);
17
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_TIM2);
18

19
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
20
    TIM_TimeBaseStructure.TIM_Period = 0xffff;
21
    TIM_TimeBaseStructure.TIM_Prescaler = 0;
22
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
23

24
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;
25

26
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
27
    /* Configure the timer */
28
    TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, 
29
TIM_ICPolarity_Rising, TIM_ICPolarity_Falling);
30

31
    TIM_SetCounter (TIM2, (uint32_t) Encoder_Position_Default); 
32
//set the Timer to the default init value (middle)
33

34
    /* TIM2 counter enable */
35
    TIM_Cmd(TIM2, ENABLE);
36

37
    //TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
38
  TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);
39
  TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);
40

41
  /////////////////////
42
  // configure PWM mode and duration
43
  TIM_OCStructInit (&TIM_OCInitStructure);
44
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing; 
45
//TIM_OCMode_Timing
46
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable; 
47
//TIM_OutputState_Enable
48
  //TIM_OCInitStructure.TIM_Pulse = PulseDurationInMicroSeconds; // set 
49
the duty cycle / pulse here!
50
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
51
  TIM_OC1Init(TIM2, &TIM_OCInitStructure);
52
  TIM_OC2Init(TIM2, &TIM_OCInitStructure);
53
}

ich hab das mal in "c" "/c" Brackets gesetzt

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.