Rotatory Encoder + OutputCompare mit STM32F446RE

Gast #5745427
Lesenswert?
• ▲
▼
Guten Tag,

ich versuche seit geraumer Zeit einen Drehgeber mit A/B Spur mittels des 
Timer3 auszuwerten. Dies läuft auch soweit ganz gut, es gibt ja einige 
Beispiele im Netz.

Jedoch schaffe ich es aktuell noch nicht, das ich mit der OutputCompare 
Funktion des Channel3 einen Interrupt auslöse, wenn ein bestimmter Wert 
erreicht ist. Ich möchte bei einem bestimmten Winkel immer wieder einen 
Interrupt auslösen.

Hier mal mein aktueller InitCode bisher (aus dem Netz zusammen kopiert)

1
void CEncoder::initEnc()
2
{
3
  //activate clocks for Timer and GPIOs
4
  __HAL_RCC_TIM3_CLK_ENABLE();
5
  //Encoder Mode only possible with CH1+CH2 (== PA6/PA7)
6
  __HAL_RCC_GPIOA_CLK_ENABLE();
7
  __HAL_RCC_GPIOB_CLK_ENABLE();
8

9

10
  GPIO_InitTypeDef sGPIO;
11

12
  sGPIO.Pin = GPIO_PIN_6 | GPIO_PIN_7;
13
  sGPIO.Mode = GPIO_MODE_AF_PP;
14
  sGPIO.Alternate = GPIO_AF2_TIM3;
15
  sGPIO.Speed = GPIO_SPEED_FREQ_LOW;
16
  sGPIO.Pull = GPIO_NOPULL;
17
  HAL_GPIO_Init(GPIOA, &sGPIO);
18

19

20

21
  htim3.Instance = TIM3;
22
  htim3.Init.Prescaler = 0;
23
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
24
  htim3.Init.Period = 2048 * 4;
25
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
26

27
  TIM_Encoder_InitTypeDef sEncoderConfig;
28

29

30
  sEncoderConfig.EncoderMode = TIM_ENCODERMODE_TI12;
31

32
  sEncoderConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
33
  sEncoderConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
34
  sEncoderConfig.IC1Prescaler = TIM_ICPSC_DIV1;
35
  sEncoderConfig.IC1Filter = 0;
36

37
  sEncoderConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
38
  sEncoderConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
39
  sEncoderConfig.IC2Prescaler = TIM_ICPSC_DIV1;
40
  sEncoderConfig.IC2Filter = 0;
41

42
  //Set IRQ Prio
43
  HAL_NVIC_SetPriority(TIM3_IRQn, 5, 3);
44
  //Init Timer in Encoder Mode
45
  HAL_TIM_Encoder_Init(&htim3, &sEncoderConfig);
46

47

48
  TIM_MasterConfigTypeDef sMasterConfig;
49
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
50
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
51
  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
52
  {
53
     // _Error_Handler(__FILE__, __LINE__);
54
  }
55

56

57

58
  TIM_OC_InitTypeDef sConfigOC;
59

60
  sConfigOC.OCMode = TIM_OCMODE_TIMING;  //no external GPIO use
61
  sConfigOC.Pulse = 500; //first compare value
62
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
63
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
64
  HAL_TIM_OC_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3);
65

66
  //__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 357 );
67

68

69
}
70

71
void CEncoder::startHW_Encoder(void)
72
{
73

74
  __HAL_TIM_CLEAR_IT(&htim3, TIM_IT_CC3);
75

76
  HAL_TIM_OC_Start_IT(&htim3 , TIM_CHANNEL_3);
77

78

79
  HAL_TIM_Encoder_Start_IT(&htim3, (TIM_CHANNEL_1 | TIM_CHANNEL_2) );
80

81

82
}


Danke schonmal für eure Tipps.

Gruß Dani

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.