[STM32F1] 定时器编码器模式反转时,CNT减为0后停止为0

[复制链接]
3118|12
 楼主| jiashijiang 发表于 2014-11-25 22:16 | 显示全部楼层 |阅读模式
    本来打算用定时器的编码器模式计数编码器正反转脉冲数,向上计数,TI1的边沿计数,重载寄存器ARR的值设为399。
当编码器正转时,计数器CNT能从0向上计数增加至399后,CNT置为0,同时产生跟新中断,然后再计数计数。
   
    但是,当编码器反转,CNT由当前值减为0后,就一直为0,不跳变为399继续减小。应该跳变至ARR中的399才对呀,
为什么会这样,请教高人!
下面是编码器模式配置代码
void TIM5_Mode_Config(void)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  //时基结构
        TIM_ICInitTypeDef TIM_ICInitStructure;           //脉冲输入结构体
       

        TIM_TimeBaseStructure.TIM_Prescaler=0;          //定时器时钟设为72M
  TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;    //向上计数
        TIM_TimeBaseStructure.TIM_Period=0X2CF;         //设置重载寄存器的值,周期设为720个脉冲
        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;   //频率给滤波器用,频率对外部时钟滤波
       
        TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);
       

  TIM_EncoderInterfaceConfig(TIM5, TIM_EncoderMode_TI1,                          //调用库函数中的编码器接口模式函数
                             TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);


        TIM_ICStructInit(&TIM_ICInitStructure);
        TIM_ICInitStructure.TIM_ICFilter = 6;      //ICx_FILTER;
        TIM_ICInit(TIM5, &TIM_ICInitStructure);
       
        TIM_ClearFlag(TIM5, TIM_FLAG_Update);
  TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE);
       
        TIM5->CR1|=0x01;   //使能CR1计数器中的CNT位
        TIM5->CNT = 0;
       
  TIM_Cmd(TIM5, ENABLE);
}


    编码器反转的时候,CNT减为0后就停止不变了,为什么?难道编码器在改变转动方向时,把计数方向也要改了?
 楼主| jiashijiang 发表于 2014-11-26 09:28 来自手机 | 显示全部楼层
还是不对,参照例程来的,配置没有问题呀!!!
 楼主| jiashijiang 发表于 2014-11-26 11:57 来自手机 | 显示全部楼层
自己顶一下,没人遇到过这样的问题吗?
huzi2099 发表于 2014-11-26 13:03 | 显示全部楼层
你改改这个试试
  TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;    //向上计数
改成上下计数
 楼主| jiashijiang 发表于 2014-11-26 13:26 | 显示全部楼层
huzi2099 发表于 2014-11-26 13:03
你改改这个试试
  TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;    //向上计数
改成上下计 ...

改成上下计数,也就是中央对齐模式,不行的。我先在用的是编码器模式,按道理说,根据编码器的正反转,应该能自动向上向下计数的,但我的实验结果是,CNT减到0后就不动了,奇怪得很!
 楼主| jiashijiang 发表于 2014-11-26 13:30 | 显示全部楼层
在网上看到所有的例程都是我这样配置的,唯一的区别是我没有用实际的编码器脉冲接收,我用的是芯片端口模拟编码器输出的正交脉冲信号
huzi2099 发表于 2014-11-28 10:06 | 显示全部楼层
本帖最后由 huzi2099 于 2014-11-28 10:12 编辑
jiashijiang 发表于 2014-11-26 13:26
改成上下计数,也就是中央对齐模式,不行的。我先在用的是编码器模式,按道理说,根据编码器的正反转,应 ...


比较了一下以前用过的和你这个是一样的,是up.

我的没有这段,你要开up做什么呢?
        TIM_ClearFlag(TIM5, TIM_FLAG_Update);
   TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE);
         
         TIM5->CR1|=0x01;   //使能CR1计数器中的CNT位
        TIM5->CNT = 0;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

44

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部