STM32 quadrature encoder

Gast #4223417
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
Angehängte Dateien:
Gast #4223481
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.

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.