用51单片机实现的具体方法:将A信号连接至外部中断INTO,冉将其反向后连接至外部中断INT1将B信号作为方向信号连接至某一输入端口(P30),这样在信号A的上升沿和与下降沿都会产生中断。由 于在不同转向时,信号A的下降沿所对应的方向信号电平正好相反,单片机在中断服务程序中先检测B信号的状态,根据不同的状态进行不同的处理(计数值增加还是减小),这样能够有效的防止反转产生的误差,从而实现精确计数,相应的C程序段如下; sbitDIR=P3.0; intcnt; /计数器数值变量 void IntOISR(void)interrupt 0using 1{if(DIR)cnt++; else cnt--;} void Int1ISR(void)interrupt 2 using2{if(DIR)cnt--; else cnt++;) 上述方法虽然能够实现精确计数,但需要占用两个外部中断源,在一些应用中受到限制。目前的新型 单片机都具有增强的功能,如输入捕捉,输入比较等;利用输入捕捉功能能够更容易的实现编码器的接口。一个可编程计数器阵列模块PCA,有一个专用的计数器和5个工作通道所组成。5个通道可以工作于4种方式之一:软件定时器方式,输入捕捉方式,输出比较方式和PWM方式。输入捕捉方式可以在脉冲的上升 沿或者下降沿捕捉,并同时产生中断请求。利用这个功能可以很容易的实现编码器的信号检测与处理。 为了消除反转误差,同时也增加了分辨率,将PCA设置成上升沿和下降沿捕捉方式。在PCA中新服 务程序中,首先检测信号A的状态,以判别其是上升沿中断还是下降沿中断。无论是上升沿还是下降沿。 信号B都有两种可能(正传和反转)。因此像前面一样,还需要再根据不同的情况进行相反的处理。具体的 C程序如下:采用PCA通道4 sbitDIR=P3.0; sbitPLS=P1.6;//PCA输入通道4 int cnt; //计数器数值变量 void PcaISR(void)interrupt6using2 if(PLS){ if(DIR)cnt--; else cnt++; Else{ if(DIR)cnt++else cnt--}} |