实验目的:采用单片机判定编码器旋转方向。
实验方法:外部中断法,对编码器输出的A、B两相进行判定,并由RS232串口控制查询
和输出结果。
硬件连接:编码器B相输入到外部中断0(INT0),A相输入到P3.3口。
实验原理:编码器输出的A、B两相相位相差90度,正转时A相领先B相90度,反转时B
相领先A相90度。B相下降沿触发外部中断,在外部中断服务程序中采样A相的电平,若
为高电平,则判定编码器是反向转动,若为低电平,则是正向转动。
实验现象:程序已经最简化,但是每次进入外部中断后,采样到的A相电平总是不定的,
所以判定出的编码器旋转方向总是不确定的。
程序关键部分:
......
acall uart_rx //接收串口字符
cjne a,#0cdh,error //查询串口,若收到“cd”则是判定方向指令,否则报错
acall CheckDIR
......
CheckDIR: //判定方向子程序,只做了一件事,就是打开外部中断0
setb EX0 //开外部中断0
ret
.......
EX_INT0: //外部中断服务程序
clr EX0 //只响应一次外部中断,下次外部中断等待串口输入"cd”再次开启
jb p3.3,setAntiCW //若p3.3为低,则改变LED1状态表示是正转
cpl LED1
reti
setAntiCW:
cpl LED2 //若p3.3为高,则改变LED2状态表示是反转
reti
实验手段:一开始用手转动编码器,发现判出的编码器旋转方向不定,表现为LED1和
LED2随机交替闪亮。怀疑是手转动编码器有抖动误差。后来用写了个测试程序,用另外
一块单片机口线模拟了A、B相的脉冲,用示波器观测波形正常,可模拟出要么A相超前B
相要么B相超前A相90度的稳定脉冲,但判出的旋转方向依然是不定态,无论怎样改变
A、B两相的周期,小到几us级,大到几ms级,现象相同。
判方向的单片机采用的是STC的11F01E的1T单片机,晶振22.1184M。
以上问题左思右想不得其解,望高人指点,谢谢! |