智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1889|回复: 7
打印 上一主题 下一主题

编码器精度软件提高方式

[复制链接]

19

主题

298

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3383

优秀会员奖章活跃会员奖章

威望
1657
贡献
1078
兑换币
281
注册时间
2011-6-8
在线时间
324 小时
跳转到指定楼层
1#
发表于 2014-4-8 21:08:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
增量式旋转编码器(见图1)是一种控制系统中常见的转角测量装置,常见的转角测量装置,常被安装在各种旋转轴末端,以测量轴转角。它输出如图2所示的两路相位差90°的脉冲(以下简称A路、B路)指示位置。旋转编码器每转过一定角度,就输出一个脉冲。当旋转编码器顺时钟旋转时,A路脉冲超前B路脉冲90°;当旋转编码器逆时针旋转时,A路脉冲滞后B路脉冲90°。计算脉冲个数可以获知转角,根据相位差可以知道旋转方向,从而计算出旋转轴相对角度的变化。
                                                                      


         旋转编码器内部一般由极细的光栅条纹与光电检测装置构成。通常将一圈内光栅条纹数目称为“线”来表示分辨率,例如“1000线”的编码器,旋转一圈能输出1000个脉冲。受到光线衍射效应的影响,光栅条纹上限一般是每2500条左右。这限制了旋转编码器的分辨率,很难超过2500线。
                                                                                                                                                                                                

         为了提高编码器的分辨率,普通采用电子4细分方法。两路脉冲相差90°,一个周期内两路信号共会出现两次上升沿与两次下降沿,4个沿均匀分布在一个周期内。取4个沿作为旋转检测判据,可以将分辨率提高4倍。在2500线的旋转编码器上,能够实现1/10000圈的角度检测分辨率。图3是对编码器输出波形进行细分的原理,编码器顺时针旋转,输出两个脉冲,再逆时针旋转,输出两个脉冲。4细分后能检测出编码器顺时针旋转8步,再逆时针转8步。
                                                     

         早期控制系统中,4细分常用硬件电路来实现。为了节省成本与电路板面积,本例要求在MSP430单片机上用软件来实现旋转编码器4细分逻辑,并将转角值保存在全局变量内。
         这是典型的时序逻辑问题,可以很方便地用状态机建模。先分析状态。一个脉冲周期内,脉冲A与脉冲B的电平总共有4种组合:“A=1  B=0”、“A=0  B=0”、“A=0  B=1”、“A=1  B=1”。将这4种组合分别称为状态1、2、3、4(见图4)。编码器旋转时,依次在这4种状态之间跳变。引发状态转移共有4种事件:A下降沿、A上升沿、B下降沿、B上升沿。根据时序图,先用语言描述状态变化规律:
       在状态1时,遇到A下降沿,变为状态2,同时角度计数加1
       在状态2时,遇到B上升沿,变为状态3,同时角度计数加1
       在状态3时,遇到A上升沿,变为状态4,同时角度计数加1
       在状态4时,遇到B下降沿,变为状态1,同时角度计数加1
       在状态4时,遇到A下降沿,变为状态3,同时角度计数减1
       在状态3时,遇到B下降沿,变为状态2,同时角度计数减1
       在状态2时,遇到A 上升沿,变为状态1,同时角度计数减1
       在状态1时,遇到B上升沿,变为状态4,同时角度计数减1
再根据语言描述,画出状态转移图(见图4),可以发现当编码器顺时钟旋转时,状态也按照顺时针方向转移,每次状态转移时让角度变量增加。反之逆时针转移时,让转角变量递减。
                                                                                                                                                                                                               

MSP430单片机的I/O口能设置为上升沿或下降沿中断,用两个I/O口(P1.4、P1.5)检测A脉冲,用两个I/O口(P1.6、P1.7)检测B脉冲。如图5所示。其中P1.4与P1.6设为下降沿中断、P1.5与P1.7设为上升沿中断。首先初始化4个I/O口:
P1IES  |= BIT4+BIT5 ;             //P1.4、P1.6设为下降沿中断
P1IES  &=~(BIT4+BIT5);           //P1.5、P1.7设为上升沿中断
P1IE |=BIT4+BIT5+BIT6+BIT7;       //允许P1.4567中断
P1IFG = 0;                       //避免第一次误动作
_EINT();                         //总中断允许

在4个中断内进行状态转移处理与计数即可实现4细分程序。利用中断触发也同时保证了检测的实时性:

Int EncoderCnt= 0;                //旋转角度计数值,全局变量,供其他程序访问
Unsigned charEncoderStatus = 1;   //旋转时序状态变量

Pragma vector =PORT1_VECTOR     //P1口中断源
__interruptvoid P1_ISR( void )       //声明一个中断服务程序,名为P1_ISR();
{
    _BIC_SR(SCG0);               //如果从LPM3唤醒,恢复时钟准确性
   If(P1IFG&BIT4)       //-------------------A 下降中断(P1.4中断入口)-------------//
                   {
                            If (EncoderStatus ==1) { EncoderStatus = 2; EncoderCnt++ ;} //A 下沿,1->2
                            If (EncoderStatus == 4) { EncoderStatus= 3; EncoderCnt-- ;}  //A 下沿,4->3
                   }
   If(P1IFG&BIT5)       //-------------------A 上升中断(P1.5中断入口)-------------//
                   {
                            If (EncoderStatus ==3) { EncoderStatus = 4; EncoderCnt++ ;} //A 上沿,3->4
                            If (EncoderStatus == 2) { EncoderStatus= 1; EncoderCnt-- ;}  //A 上沿,2->1
                   }
   If(P1IFG&BIT6)       //-------------------B 下降中断(P1.6中断入口)-------------//
                   {
                            If (EncoderStatus ==4) { EncoderStatus = 1; EncoderCnt++ ;} //B 下沿,4->1
                            If (EncoderStatus == 3) { EncoderStatus= 2; EncoderCnt-- ;}  //B 下沿,3->2
                   }
   If(P1IFG&BIT7)       //-------------------B 上升中断(P1.7中断入口)-------------//
                   {
                            If (EncoderStatus ==2) { EncoderStatus = 3; EncoderCnt++ ;} //B 上沿,2->3
                            If (EncoderStatus == 1) { EncoderStatus= 4; EncoderCnt-- ;}  //B 上沿,1->4
                   }
   P1IFG = 0;                                    //清楚P1口中断标志位
   __low_power_mode_odd_on_exit();            //退出唤醒CPU(如果主程序需要唤醒)
}

在每个中断内,根据当前状态处理状态转移,并改变EncoderCnt变量的值。在软件的其他任何位置,只要访问EncoderCnt变量即可获知被测量转轴的当前转角。



回复

使用道具 举报

32

主题

3009

帖子

0

精华

杰出人士

学期班的来卖萌?

Rank: 12Rank: 12Rank: 12

积分
14832

在线王奖章活跃会员奖章优秀会员奖章论坛元老奖章资源大师奖章

威望
5952
贡献
3172
兑换币
4257
注册时间
2013-11-26
在线时间
2854 小时
2#
发表于 2014-4-8 21:52:37 | 只看该作者
考虑过频繁中断这个问题没?
回复 支持 反对

使用道具 举报

47

主题

1053

帖子

1

精华

功勋会员

Rank: 10Rank: 10Rank: 10

积分
30566

优秀会员奖章活跃会员奖章论坛元老奖章在线王奖章优秀版主奖章资源大师奖章

威望
19719
贡献
7191
兑换币
2325
注册时间
2012-2-1
在线时间
1828 小时
3#
发表于 2014-4-8 22:14:49 | 只看该作者
顶一下!K60正交解码 A相B相模式和这类似,只不过硬件解决了。
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

注册会员

Rank: 2

积分
58
威望
22
贡献
30
兑换币
15
注册时间
2014-8-14
在线时间
3 小时
毕业学校
哈理工
4#
发表于 2014-8-16 23:40:17 | 只看该作者
收藏学习了
回复 支持 反对

使用道具 举报

2

主题

350

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2298
威望
1172
贡献
736
兑换币
772
注册时间
2014-7-8
在线时间
195 小时
5#
发表于 2014-9-16 10:34:56 | 只看该作者
回复 支持 反对

使用道具 举报

10

主题

463

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2134
威望
1053
贡献
523
兑换币
693
注册时间
2014-1-10
在线时间
279 小时
6#
发表于 2014-9-17 09:37:28 | 只看该作者
mark,回去慢慢看
回复 支持 反对

使用道具 举报

56

主题

4914

帖子

3

精华

顶级版主

北京科技大学智能汽车队公共主页管理员

Rank: 11Rank: 11Rank: 11Rank: 11

积分
56131

特殊贡献奖章资源大师奖章论坛骨干奖章推广达人奖章优秀版主奖章热心会员奖章论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章

威望
19568
贡献
13933
兑换币
3365
注册时间
2010-7-22
在线时间
11315 小时
7#
发表于 2014-9-17 10:31:03 | 只看该作者
还不如用硬件呢……74xx系列
回复 支持 反对

使用道具 举报

19

主题

2430

帖子

0

精华

跨届大侠

这并没有什么卵用.

Rank: 10Rank: 10Rank: 10

积分
6595

论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章

威望
3611
贡献
1592
兑换币
1425
注册时间
2014-7-14
在线时间
696 小时
8#
发表于 2014-10-13 20:49:28 | 只看该作者
路过
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-11-6 13:49 , Processed in 0.064550 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表