打印
[STM32F1]

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

[复制链接]
2463|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;    //向上计数
改成上下计数

使用特权

评论回复
5
jiashijiang|  楼主 | 2014-11-26 13:26 | 只看该作者
huzi2099 发表于 2014-11-26 13:03
你改改这个试试
  TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;    //向上计数
改成上下计 ...

改成上下计数,也就是中央对齐模式,不行的。我先在用的是编码器模式,按道理说,根据编码器的正反转,应该能自动向上向下计数的,但我的实验结果是,CNT减到0后就不动了,奇怪得很!

使用特权

评论回复
6
jiashijiang|  楼主 | 2014-11-26 13:30 | 只看该作者
在网上看到所有的例程都是我这样配置的,唯一的区别是我没有用实际的编码器脉冲接收,我用的是芯片端口模拟编码器输出的正交脉冲信号

使用特权

评论回复
7
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

粉丝