串口中断读取定时器中断变量值来计算事件时间不准咋办?

2020-01-22 12:14发布

单片机C8051F020,设置:晶振是22.11814MHZ,串口1波特率是9600,定时器4是每隔2ms中断一次,每到100ms的时候,定时器中的变量T++;16位自动重装模式,串口1的中断优先级标志位置1。
  如题,在串口中断里面当检测到传来了指令A后,就将此时刻的变量T的值记录下来,收到指令B后将此时刻的变量T的值记录下来(A指令只来一次,B指令有多次)。在主函数里面处理串口收到的数据的时候再计算两个记录值的差,得到AB间的时间。在1分钟左右的时候,误差在0.3秒左右,但到了2分钟的时候误差就到了0.6秒左右,3分钟误差是0.9秒左右,4分钟误差在1秒左右了。不知道这是为什么,按照我想的,当进入串口有数据的时候,会马上进入中断,并读取变量值,因此误差不应该这么大呀。
  按照我的分析,既然误差逐渐偏大, 且时间差都是以以A指令记录的变量值为基准,那么造成误差逐渐偏大的原因就是进入串口中断的时间在逐渐变长或者是定时器的误差在逐渐的变大,但我用手机秒表跟定时器计时1分钟进行比对,定时器1分钟还是挺准的。也试过在中断函数中利用using关键字,但没什么效果。
  试着改变两个中断的优先级,误差依然有,不知道该怎么办了,求助!

我试过用定时器0,16位定时,也是同样的采用读取100ms变量值的方式,但发现同样情况下,误差更大。怀疑是不是定时器的问题,换了块板子,也是一样的情况。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
9条回答
yunmenghan
2020-01-23 07:02
解决了。
没用现在的这种方案。昨天用C#写了个上位机软件来模拟一下前台,圈数跑完指令中原先不确定代表什么意思的两个字节,竟然是时间的编码。还好及时的发现了这个秘密。要不然不知道什么时候才能弄完。
它是一个字节粗计时间,一个字节细计时间,总的时间是两部分时间的和。但不知道控制台依据的是什么策略,控制台显示屏上显示的时间有时候比用这两个字节计算出来的时间多0.1秒。
还有就是我想,单片机定时应该是准确的。不准确的是前台传来的时间,随着时间的延长,它的误差在逐渐的变大。不然的话,单片机没道理不准的(误差不可能到达1秒呀)

最后总结:厂家要把自己的设备校准好了啊,设备稳定性很重要啊(这个设备前台经常不合理的多传数据)

一周热门 更多>