Forum: Mikrocontroller und Digitale Elektronik STM32 quadrature encoder


von Anton (Gast)


Angehängte Dateien:

Lesenswert?

Hallo allerseits, ich mache grade meine ersten, wackeligen Schritte mit 
dem 32f3 discovery-board. Da ist ein STM32F303 verbaut. Ich habe einen 
Drehencoder (ddm 427) an PC6/PC7 und GND angeschlossen. Ich möchte die 
Schritte mit dem „encoder interface mode“ von Timer 8 zählen.

Das funktioniert nicht und ich finde den Fehler nicht. Vielleicht sieht 
ihn ja einer von euch und kann mir einen Hinweis geben? Das wäre super!

Hier der Code zum initialisieren:
1
void EncoderInterfaceInit(void) {
2
3
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
4
5
    GPIO_InitTypeDef GPIO_InitStructure;
6
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
7
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
8
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
9
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
11
12
    GPIO_Init(GPIOC, &GPIO_InitStructure);
13
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_4);
14
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_4);
15
16
    RCC_AHBPeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
17
18
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
19
    TIM_TimeBaseStructure.TIM_Period = 0x0008;
20
    TIM_TimeBaseStructure.TIM_Prescaler = 0;
21
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
22
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
23
24
    TIM_EncoderInterfaceConfig(TIM8, TIM_EncoderMode_TI12, TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);
25
    TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);
26
    TIM_Cmd(TIM8, ENABLE);
27
}

Liebe Grüße
Anton

von m.n. (Gast)


Lesenswert?

Ich spiele gerade mit dem ..F411 und habe auf die Schnelle einfach 
direkt in die Register geschrieben: Timer2 mit PA0 und PA1 als Eingang. 
Vielleicht kannst Du das auf Timer8 umschreiben, den es beim F411 nicht 
gibt. Oder Du nimmst T2, um überhaupt eine Funktion zu sehen.
Ohne es zu überprüfen, sollten die Register beim ..F303 doch sehr 
ähnlich sein.

void init_t2(void)
{
  RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;  // GPIOA freigeben
  GPIOA->MODER |= 0x0a;         // AF PA0 und PA1
  GPIOA->PUPDR |= 0x05;         // pullup PA0 und PA1
  GPIOA->AFR[0] |= 0x11;        // AF PA0 und PA1 TIM2_CH1/TIM2_CH2

  RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;   // Timer2 freigeben
  TIM2->SMCR |= 0x03;           // Encode mode 3
  TIM2->CCMR1 |= 0x05;          // CH1 + CH2 -> Encoder
  TIM2->CR1 |= TIM_CR1_CEN;     // T2 starten
}

Das Ergebnis steht in TIM2->CNT.

von holger (Gast)


Lesenswert?

RCC_AHBPeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
        ^^^                   ^^^^
        |||                   ||||

von holger (Gast)


Lesenswert?

Verdammt verrutscht;)

RCC_AHBPeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
    ^^^                   ^^^^
    |||                   ||||

von Anton (Gast)


Lesenswert?

Danke, Holger das wars. ;)

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.