搜索
bottom↓
回复: 8

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

[复制链接]

出0入0汤圆

发表于 2014-8-31 18:24:07 | 显示全部楼层 |阅读模式
单片机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变量值的方式,但发现同样情况下,误差更大。怀疑是不是定时器的问题,换了块板子,也是一样的情况。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2014-8-31 18:43:43 | 显示全部楼层
用示波器观察吧,定时器中断里让某个IO口翻转,看看电平保持的时间

出0入0汤圆

发表于 2014-8-31 19:09:16 | 显示全部楼层
2楼正解,好好看看你的2ms是否准确吧。

出0入0汤圆

 楼主| 发表于 2014-8-31 19:54:56 | 显示全部楼层
dswybs 发表于 2014-8-31 18:43
用示波器观察吧,定时器中断里让某个IO口翻转,看看电平保持的时间

嗯,示波器是个好东西啊

出0入0汤圆

 楼主| 发表于 2014-8-31 19:55:47 | 显示全部楼层
steaven2000 发表于 2014-8-31 19:09
2楼正解,好好看看你的2ms是否准确吧。

嗯,寻找示波器ing

出0入0汤圆

 楼主| 发表于 2014-9-2 08:33:19 | 显示全部楼层
steaven2000 发表于 2014-8-31 19:09
2楼正解,好好看看你的2ms是否准确吧。

示波器显示2ms是准的,到100ms的计时也是准的

出0入0汤圆

发表于 2014-9-2 08:56:26 | 显示全部楼层
yunmenghan 发表于 2014-9-2 08:33
示波器显示2ms是准的,到100ms的计时也是准的

(1)你如何得知实际2次发送串口指令的时间差,不要告诉我你是串口助手定时发送。要知道WINDOWS的这个定时误差是比较大的,你要通过示波器来确认指令发送的时间间隔。
(2)你的时间分辨率本来就只有0.1秒
(3)中断接收到指令,到任务中实际去处理指令时,中间有时间间隔,到底有多少要看你的程序结构设计。

出0入0汤圆

 楼主| 发表于 2014-9-2 17:17:47 | 显示全部楼层
steaven2000 发表于 2014-9-2 08:56
(1)你如何得知实际2次发送串口指令的时间差,不要告诉我你是串口助手定时发送。要知道WINDOWS的这个定 ...

(1)这是一个天康跑步测试仪(测跑800/1000米所用时间),它有控制台和前端组成,控制台设定要跑的圈数还有哪些跑道,然后告诉前台。前台有传感器,当规定的圈数跑完后,串口发送指令B到控制台,此时控制台显示该跑道所用时间,我是以这个显示出来的时间为准的,看单片机测出来的时间跟这个一不一样。控制台能记录年月日等时间信息,因此里面应该有时钟芯片(今天拆开来看了一下,确实有,是用的pf85163)
(2)试过用10ms的计时变量累加值,也试过20ms和50ms,结果都是相似的
(3)串口中断里有一个if语句,查询收到的字节是不是指令中的特有字节,是的话就将此时刻的变量累加值记录到数组里。不是串口收到数据,然后主函数里去查询是否收到指令的。一开始的时候是这样做的,但想了想还是放在中断里吧,实时性比较高一点。

用示波器观察定时器中断的执行时间只有10us(串口中断执行时间没看,应该也差不多吧),手头上没有示波器,示波器是跑到一个公司里去测试的,设备也带不过去,联调的时候就只能想象哪里出问题了,悲催。

出0入0汤圆

 楼主| 发表于 2014-9-4 20:14:37 | 显示全部楼层
解决了。
没用现在的这种方案。昨天用C#写了个上位机软件来模拟一下前台,圈数跑完指令中原先不确定代表什么意思的两个字节,竟然是时间的编码。还好及时的发现了这个秘密。要不然不知道什么时候才能弄完。
它是一个字节粗计时间,一个字节细计时间,总的时间是两部分时间的和。但不知道控制台依据的是什么策略,控制台显示屏上显示的时间有时候比用这两个字节计算出来的时间多0.1秒。
还有就是我想,单片机定时应该是准确的。不准确的是前台传来的时间,随着时间的延长,它的误差在逐渐的变大。不然的话,单片机没道理不准的(误差不可能到达1秒呀)

最后总结:厂家要把自己的设备校准好了啊,设备稳定性很重要啊(这个设备前台经常不合理的多传数据)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 10:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表