ST意法半导体
直播中

刘满贵

8年用户 1565经验值
私信 关注
[问答]

stm32f103c8t6编码器模式在keil的debug调试时遇到的问题求解

STM32f103c8t6编码器模式在keil的debug调试时,手动把编码器的计数器置为一个数500(比如计数器溢出值是4000),然后在在让编码器继续开始输出,此时计数器的计数变为原来正常的两倍了,直到计数器溢出一次就变正常了

回帖(2)

klysa

2025-3-3 11:56:31

在STM32F103C8T6的编码器模式下,手动修改计数器值后出现计数速度加倍的问题,可能是由于方向状态未同步导致。以下是逐步解决方案:


问题分析


当手动设置计数器(TIMx_CNT)为500时,定时器的方向状态位(DIR)可能与实际编码器信号方向不匹配。编码器模式下,计数器方向由输入信号相位决定,但手动修改CNT后,硬件可能未正确更新方向状态,导致每个脉冲被错误计数两次,直至溢出后方向被重置。


解决方案




  1. 停止定时器后修改CNT

    在Debug过程中,先停止定时器,修改CNT后再重新启动,使硬件同步方向:


    TIM_Cmd(TIMx, DISABLE);  // 停止定时器
    TIMx->CNT = 500;         // 手动修改CNT
    TIM_Cmd(TIMx, ENABLE);   // 重新启动定时器

    这确保定时器在重启时根据当前信号重新初始化方向。




  2. 手动更新方向状态位

    若需保持定时器运行,修改CNT后,通过以下方式强制更新方向:


    TIMx->CNT = 500;
    // 若实际方向应为向上计数(DIR=0)
    TIMx->CR1 &= ~TIM_CR1_DIR;  // 强制设置方向为向上
    // 或根据编码器信号相位手动设置DIR

    需结合编码器实际旋转方向设置CR1.DIR位。




  3. 检查编码器模式配置

    确认定时器的编码器模式分频设置(TIMx_SMCR.SMS):



    • SMS=001:仅在TI1边沿计数(1倍频)

    • SMS=011:在TI1和TI2边沿计数(2倍频)

    • SMS=011:4倍频模式

      确保配置与实际硬件信号匹配,避免软件配置错误导致倍频异常。




  4. 验证自动重载值(ARR)

    检查TIMx_ARR是否设置为4000,并确认在手动修改CNT时未意外改动ARR值:


    TIMx->ARR = 4000;  // 确保ARR正确



  5. 溢出后恢复正常的机制

    当计数器溢出时,硬件自动触发更新事件,重新加载预置值并同步方向状态。因此,在溢出后计数恢复正常。可通过以下方式模拟溢出同步:


    TIM_GenerateEvent(TIMx, TIM_EventSource_Update);  // 手动触发更新事件



调试建议



  • 观察方向位(DIR)

    在Debug过程中,监控TIMx_CR1.DIR的值,确保修改CNT后方向与实际信号一致。

  • 检查计数器响应

    使用逻辑分析仪或Debug实时监控CNT变化,确认每个编码器脉冲是否触发预期步数(如2倍频下每刻线触发2次计数)。

  • 捕获信号相位

    验证编码器A/B相信号是否正常,排除硬件接触不良导致的抖动或额外边沿。


总结


该问题主要由手动修改CNT后方向状态未同步导致。通过停止定时器再修改CNT,或强制更新方向位,可确保计数器方向与编码器信号匹配,从而避免计数速度异常。同时需检查编码器模式配置,确保倍频设置正确。

举报

肖东菁

2025-3-14 16:37:27
你是使用TIMER作为正交编码计数器吧。


你手动把编码器的计数值设置为500,是指修改TIMx->CNT的值吗? 如果是,


不是很明白你所说的ARR=4000,计数器初始值为500,计数器的计数变为正常的两倍是什么意思?


计数快慢是正常的两倍 还是计数周期变为原来两倍? 另外你的两倍是怎么统计出来的,还是说只是大概感觉?


CNT的确可以手动修改,不过当TIMER对编码信号做向上计数时,如果你给定的初始CNT值比ARR大的话,是会发生


计数器要一直计数到硬件默认满量程,比如16位TIMER的话就是记到0xffff才会调头,不过这个时间段跟正常计数时


间段就未必一定是两倍关系,这点你要注意。 
举报

更多回帖

发帖
×
20
完善资料,
赚取积分