Skip to main content
Associate III
April 4, 2024
Solved

[SOLVED] Unable to retrieve the count from TIM1 in Encoder Mode

  • April 4, 2024
  • 1 reply
  • 1762 views

Hi, I'm using an STM32F439ZI (on a nucleo board) and connected a Zaber stage with its encoder to it. When disconnected, I can measure the A & B signals schanging from GND to 5V. I currently cannot paste an image from the scope but I've lookerd at them before and the quadrature output looks as expected with no pullups or pull downs required. I hooked the signals up to pins PE9 & PE11 and set TIM1 up to Encoder mode: 

debug_0-1712181677426.png 

and the TIM1_init() looks like this:

 

 

static void MX_TIM1_Init(void)
{
 /* USER CODE BEGIN TIM1_Init 0 */

 /* USER CODE END TIM1_Init 0 */

 TIM_Encoder_InitTypeDef sConfig = {0};
 TIM_MasterConfigTypeDef sMasterConfig = {0};

 /* USER CODE BEGIN TIM1_Init 1 */

 /* USER CODE END TIM1_Init 1 */

 htim1.Instance = TIM1;
 htim1.Init.Prescaler = 0;
 htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
 htim1.Init.Period = 65535;
 htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
 htim1.Init.RepetitionCounter = 0;
 htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
 sConfig.EncoderMode = TIM_ENCODERMODE_TI1;
 sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
 sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
 sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
 sConfig.IC1Filter = 10;
 sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
 sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
 sConfig.IC2Prescaler = TIM_ICPSC_DIV1;
 sConfig.IC2Filter = 0;
 if (HAL_TIM_Encoder_Init(&htim1, &sConfig) != HAL_OK)
 {
 Error_Handler();
 }
 sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
 sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
 if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
 {
 Error_Handler();
 }

 /* USER CODE BEGIN TIM1_Init 2 */

 /* USER CODE END TIM1_Init 2 */
}

 

yet, TIM1->CNT remains 0 as trhe encoder rotates.

Can someone here help me find where my problem might be at?

 

    This topic has been closed for replies.
    Best answer by debug

    This has been resolved, I was just missing to start time timer:

    HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL);

    1 reply

    debugAuthorBest answer
    Associate III
    April 4, 2024

    This has been resolved, I was just missing to start time timer:

    HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL);