自己明明知道的一个事情,在一个使用中却犯了错。
我的意图是用高计计算编码器的速度的。在定时中断中计算先后两次高计值,得到当前增量。
程序大概是这样的:(初始化不写了)
LD SM0.0
MOVD HC0 VD4
-D VD0 VD4\\当前值减旧值。
MOVD HC0 VD0\\当前值保存为旧值。
这样VD4得到的是增量。
可是,这就有错发生了。
第二行读一次高计。第四行又读一次高计。其实两次的读取已经不是同一个数的高速计数器的工作频率很高,在一个指令的执行过程中已经在后台中加了不少数量的脉冲了。然后在第二次读取的话当前值已经变化了。
可能有人有个疑问,其实两次中断之间的两个“MOVD HC0 VD0”指令的时差仍然是固定时间啊。这个说法是对的。当用于速度控制的话这个事情的确可以忽略。因为速度再新鲜毕竟已经是一个历史数据。而用到位置控制的话这个影响就会凸现。每个周期下来脉冲量差了几个脉冲,这个不是精度问题,而是变成了对错问题。
为了得到正确的值,要把高速计数器当前值先保存起来,然后在以后的过程中只使用保存的这个值。这样就会统一起来。不出现差错。
LD SM0.0
MOVD HC0 LD0
MOVD LD0 VD4
-D VD0 VD4\\当前值减旧值。
MOVD LD0 VD0\\当前值保存为旧值。
凡是对高计的读取操作都要注意到实时更新的问题。最经常看见的错误还有是复位高计的操作。复位动作的过程中难保没有一个脉冲漏掉,最好是尽量别复位。