Forum: Mikrocontroller und Digitale Elektronik Rotatory Encoder + OutputCompare mit STM32F446RE


von Daniel (Gast)


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

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.