初级会员

- 积分
- 63
- 金钱
- 63
- 注册时间
- 2016-3-27
- 在线时间
- 17 小时
|
我目前做一个小车需要用到正交码盘,使用stm32通用定时器的码盘模式对正交码盘的A、B两相的脉冲个数进行计数。码盘是1000线的,上下沿都计数,正转的话应该是定时器计数到2*2*1000-1=3999个脉冲时在来一个脉冲发生更新中断,计数器预装0;反转的话是减到0再来一个脉冲发生更新中断,计数器预装载3999。每次触发更新中断时,在中断服务函数里面对小车转过的圈数+1或-1。大家都知道正交码盘还有一个Z相信号,是每圈转到一个特定的位置(称为硬件零点),码盘硬件自动发出一个脉冲,一般我们把它接stm32外中断,对计数器清零,可以防止累积误差。那么问题来了:假设我的码盘正转,计数器对脉冲进行计数,且计数值不断增加,按理说我计数到3999就会触发更新中断。但是现在stm32由于某种原因少计了1、2个脉冲,也就是到硬件零点时我才计数到3997、3998吧,马上我就要触发更新中断了,突然来了一个Z相信号触发外中断把我计数器清零了。这样的话,我又得从0重新计数了,软件层面就无法触发更新中断,对小车的圈数+1了,但小车在硬件层面确实实在在是转了一圈,这样的话岂不是会产生很大误差?请问大家是怎么解决的,是不是直接定时读取计数器的值,不用Z相信号也行?这样的话就算有累积误差,但累积误差在总的里程里面所占的比重应该也是很小的,也就是相对误差很小?
|
|