打印
[STM32F1]

[求助]关于定时器接增量式编码器的问题

[复制链接]
3079|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sonicll|  楼主 | 2015-11-17 16:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在调试步进电机,关于定时器读取编码器的值,有点不太明白,求指点:

TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);

这个函数我个人的理解是在编码器的A相和B相的上升沿,TIM3都进行计数,那么电机转一圈,TIM3的计数增量应该是编码器线数乘以2,相当于编码器分辨率变成2倍,是这样吧?但是A相和B相的相位差是90度而不是180度,所以这样的2倍分辨率其实是不准确的吧?那怎么网上例子基本都是这么用的?应该只有单相单边沿计数的1倍分辨率和双相双边沿计数的4倍分辨率才是准确的吧,还是我根本就没理解对?

TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI1, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);     //单相单边沿计数,1倍
TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_BothEdge, TIM_ICPolarity_BothEdge);  //双相双边沿计数,4倍


另外我有个板子,TIM3读出的编码器值总是实际值的2倍,而另一个板子改用TIM2,同样的设置,读数正常,大家有遇到过吗?附上TIM3的设置

        TIM_TimeBaseStructure.TIM_Period = 65535;
        TIM_TimeBaseStructure.TIM_Prescaler = 0;                           
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;   
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);       
                                                                                                                                                                                
        TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI1, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);

        TIM_ICStructInit(&TIM_ICInitStructure);   
        TIM_ICInitStructure.TIM_ICFilter = 6;  //ICx_FILTER;   
        TIM_ICInit(TIM3, &TIM_ICInitStructure);
       
        TIM_ClearFlag(TIM3, TIM_FLAG_Update);
//        TIM_ITConfig(TIM3, TIM_IT_Trigger, ENABLE);

        TIM_ARRPreloadConfig(TIM3, ENABLE);

        TIM_SetCounter(TIM3, 0);                                                        
        TIM_Cmd(TIM3, ENABLE);        



沙发
wahahaheihei| | 2015-11-17 17:05 | 只看该作者
该应用难点不是在如何写代码,而是如何处理的方法,方法很重要,就是如何识别。

使用特权

评论回复
板凳
sonicll|  楼主 | 2015-11-17 17:25 | 只看该作者
wahahaheihei 发表于 2015-11-17 17:05
该应用难点不是在如何写代码,而是如何处理的方法,方法很重要,就是如何识别。 ...

请教一下,我上面关于编码器读数2倍4倍的理解,到底对不对?

使用特权

评论回复
地板
sonicll|  楼主 | 2015-11-18 09:03 | 只看该作者
自己顶一下

使用特权

评论回复
5
wahahaheihei| | 2015-11-21 09:23 | 只看该作者
sonicll 发表于 2015-11-17 17:25
请教一下,我上面关于编码器读数2倍4倍的理解,到底对不对?

如果软件一模一样,结果效果不同,请检查电路是不是哪儿有什么跳线设置的不同。

使用特权

评论回复
6
sonicll|  楼主 | 2020-9-15 18:49 | 只看该作者
回复一下我N年前的老坑吧:
TIM_EncoderInterfaceConfig()这个函数,极性设置参数只能选择TIM_ICPolarity_Rising或者TIM_ICPolarity_Falling,不能使用TIM_ICPolarity_BothEdge。在编码器模式,计数始终是双边沿的,极性设置只影响计数的方向。选择TIM_EncoderMode_TI1或者TIM_EncoderMode_TI2模式,计数值是编码器周期数的2倍,选择TIM_EncoderMode_TI12模式,计数值是编码器周期数的4倍,不存在1倍的情况

使用特权

评论回复
评论
MCOMEBACK 2020-9-16 17:59 回复TA
楼主,我用cubeMX设置完生成代码然后在调试里面看到的cnt数值是对的,是可以向上向下计数的,所以我的编码器应该没有问题。 
MCOMEBACK 2020-9-16 15:15 回复TA
身边没有示波器,我用两个LED灯测试了编码器,亮灭变化是符合波形图的(之前换过编码器上的光电开关,会不会是电路噪声的问题) 
sonicll 2020-9-16 14:01 回复TA
@MCOMEBACK :GPIO就是配置成浮空输入,你可以先示波器看看编码器的波形在正转和反转是否有区别,确认信号没问题了,再找软件程序的问题 
MCOMEBACK 2020-9-16 12:25 回复TA
楼主你好,我现在也在学习编码器,想请教你几个问题,我按照网上的代码设置完成后,编码器只向下计数很奇怪。我看到很多人将编码器的GPIO口设置成浮空状态,这不影响编码器信号采集吗? 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

883

帖子

3

粉丝