stm32 F103 tim3 Encoder mode 模式奇怪的问题?诡异

和如 2021-03-20 06:16:33
stm32 tim3 Encoder mode 模式奇怪的问题,这里按网上的配置,在STM32CubeMX配置了TIM3的编码器模式。编码器用的是EC11现在的情况是 编码器转动可以检测出来,数据也可以读取,但是显示的数据完全没有根据需要进行变化,数字完全是跳动的显示。而且没有规律,请前辈指导一下,
主程序里面的代码:
uwICValue2=LL_TIM_GetCounter(TIM3);
LCD_ShowIntNum(73, 60,uwICValue2,sizeof(uwICValue2),RED,BLACK, 24);

TIM3的初始化代码:
void MX_TIM3_Init(void)
{

/* USER CODE BEGIN TIM3_Init 0 */

/* USER CODE END TIM3_Init 0 */

LL_TIM_InitTypeDef TIM_InitStruct = {0};

LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

/* Peripheral clock enable */
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM3);

LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA);
/**TIM3 GPIO Configuration
PA6 ------> TIM3_CH1
PA7 ------> TIM3_CH2
*/
GPIO_InitStruct.Pin = LL_GPIO_PIN_6|LL_GPIO_PIN_7;
GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

/* USER CODE BEGIN TIM3_Init 1 */

/* USER CODE END TIM3_Init 1 */
LL_TIM_SetEncoderMode(TIM3, LL_TIM_ENCODERMODE_X4_TI12);
LL_TIM_IC_SetActiveInput(TIM3, LL_TIM_CHANNEL_CH1, LL_TIM_ACTIVEINPUT_DIRECTTI);
LL_TIM_IC_SetPrescaler(TIM3, LL_TIM_CHANNEL_CH1, LL_TIM_ICPSC_DIV1);
LL_TIM_IC_SetFilter(TIM3, LL_TIM_CHANNEL_CH1, LL_TIM_IC_FILTER_FDIV1_N2);
LL_TIM_IC_SetPolarity(TIM3, LL_TIM_CHANNEL_CH1, LL_TIM_IC_POLARITY_RISING);
LL_TIM_IC_SetActiveInput(TIM3, LL_TIM_CHANNEL_CH2, LL_TIM_ACTIVEINPUT_DIRECTTI);
LL_TIM_IC_SetPrescaler(TIM3, LL_TIM_CHANNEL_CH2, LL_TIM_ICPSC_DIV1);
LL_TIM_IC_SetFilter(TIM3, LL_TIM_CHANNEL_CH2, LL_TIM_IC_FILTER_FDIV1_N2);
LL_TIM_IC_SetPolarity(TIM3, LL_TIM_CHANNEL_CH2, LL_TIM_IC_POLARITY_RISING);
TIM_InitStruct.Prescaler = 3;
TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
TIM_InitStruct.Autoreload = 100;
TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;
LL_TIM_Init(TIM3, &TIM_InitStruct);
LL_TIM_DisableARRPreload(TIM3);
LL_TIM_SetTriggerOutput(TIM3, LL_TIM_TRGO_RESET);
LL_TIM_DisableMasterSlaveMode(TIM3);
/* USER CODE BEGIN TIM3_Init 2 */

/* USER CODE END TIM3_Init 2 */

}

STM32CubeMX配置

视频地址:
https://v.youku.com/v_show/id_XNTEyNDM3MDE4MA==.html
...全文
608 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
hhhh63 2021-03-22
  • 打赏
  • 举报
回复
按我的经验,两种可能性,一是频率太高,不能正常计数;还有可能都是干扰信号。 先用单片机模拟一个正交信号输出到编码器试试。 STM32实战九 编码器 https://blog.csdn.net/hhhh63/article/details/93379527 STM32实战六 PWM加移相正交 https://blog.csdn.net/hhhh63/article/details/93372639
STM32F103是意法半导体(STMicroelectronics)生产的基于ARM Cortex-M3内核的微控制器,广泛应用于嵌入式系统设计。在工业自动化、机器人控制、电机驱动等领域,编码器捕获功能是必不可少的,它可以精确地测量电机转速、位置和方向。在这个项目中,我们将探讨如何使用STM32F103的硬件定时器(TIM)配合HAL库实现编码器捕获。 编码器通常分为增量型和绝对型两种。增量型编码器通过检测脉冲数量来计算旋转角度,而绝对型编码器则能直接提供当前位置信息。STM32F103的编码器捕获主要针对增量型编码器,通过检测A、B两相信号的边沿变化来计算电机转动信息。 在STM32F103中,编码器捕获主要依赖于定时器的输入捕获功能。例如,我们可以使用TIM1、TIM2、TIM3或TIM4等支持多通道输入捕获的定时器。在HAL库中,这些功能可以通过`HAL_TIM_IC_Init()`函数初始化,并使用`HAL_TIM_IC_Start()`开启捕获。 编码器捕获的基本步骤如下: 1. 初始化定时器:配置定时器的工作模式为输入捕获,选择捕获通道(例如,TIMx_CH1和TIMx_CH2分别对应编码器的A、B相),并设置计数器预分频和更新事件周期。 2. 配置编码器模式:通过`HAL_TIM_ConfigClockSource()`函数设置编码器模式,如TIM_ENCODER_MODE_TI1或者TIM_ENCODER_MODE_TI2,这取决于A、B相信号与定时器通道的映射。 3. 设置中断:编码器的捕获通常需要中断来实时处理脉冲。可以使用`HAL_TIM_IC_ConfigChannel()`配置捕获中断,并通过`HAL_TIM_IC_Start_IT()`启动中断服务。 4. 处理中断:在中断服务程序中,`HAL_TIM_IRQHandler()`会处理捕获事件。通过`HAL_TIM_IC_GetCaptureValue()`获取捕获到的脉宽,然后根据A、B相的边沿变化计算电机的旋转方向和增量。 5. 位置和速度计算:根据捕获到的脉冲,可以计算出电机的实时位置和速度。位置通常是脉冲数乘以一个转换系数,速度则是单位时间内脉冲数的变化。 在压缩包中的"YSF1_HAL-068. TIM-编码器(捕获中断)"文件,可能是包含示例代码和配置文件,用于演示上述步骤的具体实现。这个项目可能包含了工程配置、头文件、源代码以及中断处理函数等内容,可以帮助开发者快速理解和应用STM32F103的编码器捕获功能。 STM32F103的编码器捕获功能利用了其强大的定时器模块,通过HAL库的抽象层简化了编码器接口的编程工作,使得开发者能够轻松实现高精度的电机控制。对于需要进行电机控制或位置检测的项目,理解并掌握这个功能至关重要。

27,515

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧