2024-10-21 01:39 AM
Hello,
I am trying to use the quadrature encoder mode of the TIM in the STM32U585VITx, for positioning purposes of a stepper motor movement.
According to DS13086, page 79, the general purpose timers (TIM2, TIM3, TIM4, TIM5, TIM15, TIM16, TIM17) support quadrature encoders.
However, according to RM0456 Rev 5, page 2083, TIM 1.8 has support for quadrature encoders.
Could you please clarify which TIMs support this encoder?
Also, I am currently trying to use TIM8 for this purpose (not sure if it is the right timer), but when I move the motor and read the timer, I just get a bunch of zeros.
Any help would be greatly appreciated,
Thank you
2024-10-21 01:58 AM
@Elham wrote:According to DS13086, page 79, the general purpose timers (TIM2, TIM3, TIM4, TIM5, TIM15, TIM16, TIM17) support quadrature encoders.
It also says that TIM1 & TIM8 share many features with the GP Timers - so that could include encoder support
The datasheet is really just giving a quick overview - the Reference Manual gives the complete description
2024-10-21 02:16 AM
Thanks for your quick reply Andrew,
But just saying "Many features are shared with the general purpose TIMx timers" is not enough for me.
Also, on the 2nd page of the DS13086 it says that only two of the timers support this feature:
Up to 17 timers and 2 watchdogs:
- 2 16-bit advanced motor control
Which I think is inconsistent with the explanations in 3.42.2.
Thank you
2024-10-21 02:22 AM
Again, the datasheet is really just giving a quick overview - the Reference Manual is the place to find complete details.
The datasheet is focussed on physical specifications - electrical, mechanical, thermal, etc.
The RM describes the internal workings of the peripherals.
2024-10-21 02:53 AM
Hello @Elham,
TIM8 can indeed be used for quadrature encoder mode!
>> I just get a bunch of zeros.
check the TIMx_SMCR register, TI1 and TI2 configuration and ensure that the counter is enabled by setting the CEN bit in the TIMx_CR1 register.
Otherwise, you can share some code snippet to try and figure out what's not working or misconfigured..
To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.
2024-10-21 07:14 AM
> According to DS13086, page 79, the general purpose timers (TIM2, TIM3, TIM4, TIM5, TIM15, TIM16, TIM17) support quadrature encoders.
Well that's not true, partially because ST's nomenclature is not quite right.
TIM15/16/17 are not the same kind than TIM2/3/4/5 (which in turn form 2 groups themselves, 16-bit and 32-bit) and they don't have encoder mode.
As @Andrew Neil said above, the definitive guide here is the Reference Manual - for each timer, have a look at its TIMx_SMCR.SMS description - if it does have encoder mode, it is listed there.
JW
2024-10-21 08:25 PM
Hi,
You can also look at the Timer diagram.
Also, the TIMx_ARR register needs to be set to a non-zero value for it to count... Usually, set it to max 0xFFFF (16 bit), or 0xFFFFFFFF (32 bit)...
Kind regards
Pedro
2024-10-22 01:19 AM
Thanks all for your hints and help :)
I am using STM32CubeIDE to configure TIM. I have posted my settings here. I have also included the auto generated tim.c. I have also tried to add some user code to this file, but no difference and I still get a bunch of zeros when I read the encoder like this:
uint32_t motor_ctl_get_encoder_value()
{
return (uint32_t)htim8.Instance->CNT;
}
void MX_TIM8_Init(void)
{
/* USER CODE BEGIN TIM8_Init 0 */
/* USER CODE END TIM8_Init 0 */
TIM_Encoder_InitTypeDef sConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
/* USER CODE BEGIN TIM8_Init 1 */
/* USER CODE END TIM8_Init 1 */
htim8.Instance = TIM8;
htim8.Init.Prescaler = 0;
htim8.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED3;
htim8.Init.Period = 65535;
htim8.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim8.Init.RepetitionCounter = 0;
htim8.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
sConfig.EncoderMode = TIM_ENCODERMODE_TI12;
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 = 10;
if (HAL_TIM_Encoder_Init(&htim8, &sConfig) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim8, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM8_Init 2 */
uint32_t tmp = TIM8->CR1;
tmp = tmp | 0x00000001;
TIM8->CR1 = tmp;
sConfig.IC2Selection = TIM_CCMR1_CC2S_0;
/* USER CODE END TIM8_Init 2 */
}
2024-10-22 01:27 AM
Please also show a schematic of how you are connecting the encoder, etc
2024-10-22 01:44 AM
Thank you Andrew,
I attached that part of schematic. Pins numbers 63, 64 of the MCU are used for this.