|
发表于 2013-7-29 19:21:35
|
显示全部楼层
本帖最后由 fastweb 于 2013-7-29 19:28 编辑
YATAOME 发表于 2012-9-22 20:16
求增量式编码器的程序啊
首先AB相正交编码器如果直接进入管脚不用XOR门处理的话,MCU管脚必须支持上升沿和下降沿中断模式。光下降沿中断的MCU无法使用。
其次如果使用2倍频计数的话,只要有一个管脚支持上升下降沿中断就可以了。另外一相用状态读入的方式运行。
最后提醒:信号很重要,要快而准确,不能用OC门加上拉之类的输入方式,要推挽方式,远距离的话,要差分驱动,到板后差分转换。
下面是一个例子,使用C8051F3xx的PCA的CEX3输入通道(x相关注释已经修改掉)此程序经久耐用,在纺织机上一年四季不停电工作,不出错
(用来绝对值定位的,出错就打掉机器了。)
- //定义编码器输入脚:其中一根必须能分配到PCA的某个通道上
- sbit BIT_IN09 = P2^0; //这个脚引起中断
- sbit BIT_IN10 = P2^1; //这个脚位置任意
- I32 RealCnt; //光电编码器反馈实时的脉冲计数:计算实际绝对位置
- bit Encoder_Dir;
- //初始化时,将编码器的一个输入脚配置为沿变化中断,并配到此管脚上。
- PCA0CPM3 = 0x31; //沿变化捕获,中断允许:分配A相输入到P2.0
- /******************************************************************************
- *功能:PG光电编码器A-B相线的触发沿中断处理
- *A相=BIT_IN09,A相=1/P20=0;B相=BIT_IN10
- ×内部分配:A=CEX3(P2.0),B=CEX4(P2.1)
- 2010-11-9:A相上升沿和下降沿触发中断,B相不中断,只在中断中用于判断方向
- 编码器计数器每个脉冲周期计两次(倍频)
- 每次中断耗时约2.5uS(@24.5Mhz),10%CPU强度时,A相频率=1000000/2.5*10%=40000Hz
- *****************************************************************************/
- void PCA_ISR(void) interrupt 11
- {
- if (CCF3){ //A相电平变化中断
- CCF3 = 0;
- //检测到A变化后,A和B反相则:反向CCW;A和B同相则:正向CW
- Encoder_Dir = !(BIT_IN09^BIT_IN10);//Encoder_Dir=1为CCW,=0为CW
- if(Encoder_Dir) //反向中
- RealCnt++;
- else //正向中
- RealCnt--; //
- }
- }
复制代码 |
|