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 | }
|