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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren