Skip to main content
ferhatyol-23
Senior
January 3, 2019
Solved

STM32F103 TIM Encoder mode not working

  • January 3, 2019
  • 1 reply
  • 1033 views

Hello

I am trying to read the Quadrature optical encoder using TIM2 with STM32F103. I've done the Timer settings. But the TIM2->CNT Always zero. I measured the Timer channels with the oscilloscope. The encoder signals reach TIM_CH1 and TIM_CH2.(PA0, PA1)

This is my init code

void ENCODER_TIM_Init(void){
 TIM_Encoder_InitTypeDef TIM_Encoder_Init;
 GPIO_InitTypeDef GPIO_InitStruct;
	
	__HAL_RCC_TIM2_CLK_ENABLE();
	__HAL_RCC_GPIOA_CLK_ENABLE();
	
	/**TIM2 GPIO Configuration 
	PA0-WKUP ------> TIM2_CH1
	PA1 ------> TIM2_CH2 
	*/
	GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
	GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
 TIM_Handle.Instance = TIM2;
 TIM_Handle.Init.Prescaler = 0;
 TIM_Handle.Init.CounterMode = TIM_COUNTERMODE_UP;
 TIM_Handle.Init.Period = 0;
 TIM_Handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
 
 TIM_Encoder_Init.EncoderMode = TIM_ENCODERMODE_TI12;
 TIM_Encoder_Init.IC1Polarity = TIM_ICPOLARITY_RISING;
 TIM_Encoder_Init.IC1Selection = TIM_ICSELECTION_DIRECTTI;
 TIM_Encoder_Init.IC1Prescaler = TIM_ICPSC_DIV1;
 TIM_Encoder_Init.IC1Filter = 0x00;
 TIM_Encoder_Init.IC2Polarity = TIM_ICPOLARITY_RISING;
 TIM_Encoder_Init.IC2Selection = TIM_ICSELECTION_DIRECTTI;
 TIM_Encoder_Init.IC2Prescaler = TIM_ICPSC_DIV1;
 TIM_Encoder_Init.IC2Filter = 0x00;
	
 if (HAL_TIM_Encoder_Init(&TIM_Handle, &TIM_Encoder_Init) != HAL_OK)
 {
 _Error_Handler(__FILE__, __LINE__);
 }
	
	if(HAL_TIM_Encoder_Start(&TIM_Handle, TIM_CHANNEL_ALL) != HAL_OK)
	{
		Error_Handler();
	}
}

What could be the problem?

This topic has been closed for replies.
Best answer by ferhatyol-23

I solved the problems. I made a mistake timer settings. The TIM period should not be zero.

1 reply

ferhatyol-23
ferhatyol-23AuthorBest answer
Senior
January 3, 2019

I solved the problems. I made a mistake timer settings. The TIM period should not be zero.