发表于:2006-07-20 22:50:00
28楼
"双字节变量计数"
最基本的代码量如下:
int0_interrupt:
PUSH ACC
PUSH PSW
JNB P1.7 DEC_PROG
MOV A,gCounterA_L
ADD A,#1
MOV gCounterA_L,A
MOV A,gCounterA_H
ADDC A,#0
MOV gCounterA_H,A
POP PSW
POP ACC
RETI
DEC_PROG:
CLR C
MOV A,gCounterA_L
SUBB A,#1
MOV gCounterA_L,A
MOV A,gCounterA_H
SUBB A,#0
MOV gCounter_H,A
POP PSW
POP ACC
REIT
包括AJMP int0_interrupt在内,最大共20个机器周期,才10微秒。如果你用TIMER来扩展中断,最糟糕的情况是三个编码器方波跳变几乎同时发生,而CPU只有一个,中断只能顺序响应,CPU要在任一个轴的下一个跳变来的时候处理完三个中断。所以,中断处理时间最少=10+0.5+10+0.5+10=31.5微秒。理论上最大脉冲频率=30K,仍然支持151转/秒的速度。
以上只是理论分析,具体还要看你的中断程序如何编了,还有没有其他事情要做,如果你想要对时间控制准确,最好用汇编来编中断,编程偏重速度而不是代码长度。
几个问题,你能确定200线的编码器而且还不四倍频,能满足分辨率要求吗?对于长线传输引起的信号反射、引入的杂讯干扰你有很好的处理了吗?朝一个方向的运转超过了327转时UINT型变量溢出处理要在中断中进行的话,所支持的最大转速至少要除以3,=51转/秒。
如果客户要求分辨率提高一个数量级,那你……冷汗如雨下!
如果你试验研究一下,那倒没什么,顶多不成功,要是作商业化的产品,该方案还是舍弃罢!