打印

求助高手用单片机做的时钟,如何减少程序本身累积误差

[复制链接]
7731|43
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
电子三极管|  楼主 | 2010-1-19 09:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 电子三极管 于 2010-1-19 09:13 编辑

请教高手关于用单片机做的时钟,如何减少程序本身累积误差:
  问题是这样子的,本人从事单片机开发 主要产品是马路路口的交通信号灯倒计时以及相关控制仪器。现在本人写了几个设备的C程序,问题1:几个倒计时一起测试时,感觉工作起来有点参差不齐(大概有几十ms),有那么一点的一前一后 不是很整齐的跑。问题2:我想我们用的是12M的晶振,计算延时程序Delay_1ms();感觉这延时也有问题,怎么才好让他达到最为精确的的一个延时程序,以减少累计误差。还有就是我们程序运行的每条语句都是需要时间的(虽然很短 几个us)但是程序长了 ,况且我们的设备又是常年都在工作的,这样月累月积,误差会不会更大。这也算是我最为刺手的难题了.敢请各位高手指点迷津,本人很是感激,在此谢过个位。

相关帖子

沙发
HWM| | 2010-1-19 09:45 | 只看该作者
用定时器做时基(初值采用自动重载)。如此做原则上误差完全由晶振确定。

使用特权

评论回复
板凳
电子三极管|  楼主 | 2010-1-19 11:04 | 只看该作者
自动重载? 是定时器的IE里面选择吗 还是? 2# HWM

使用特权

评论回复
地板
xinge3721| | 2010-1-19 11:18 | 只看该作者
有些单片机有重载,好像51的没有,要补偿

使用特权

评论回复
5
HWM| | 2010-1-19 11:31 | 只看该作者
自动重载? 是定时器的IE里面选择吗 还是? 2# HWM
电子三极管 发表于 2010-1-19 11:04

当定时器溢出产生中断的同时,自动将初值载入到定时器中。这个过程无须软件干预。

使用特权

评论回复
6
HWM| | 2010-1-19 11:32 | 只看该作者
有些单片机有重载,好像51的没有,要补偿
xinge3721 发表于 2010-1-19 11:18

MCS-51就有此功能。

使用特权

评论回复
7
river1972| | 2010-1-19 11:34 | 只看该作者
51的在重载的时候有误差,如果对定时要求高是不可以的,最好是选有RTC中断的

使用特权

评论回复
8
HWM| | 2010-1-19 11:43 | 只看该作者
51的在重载的时候有误差,如果对定时要求高是不可以的,最好是选有RTC中断的
river1972 发表于 2010-1-19 11:34

MCS-51利用自动重载的误差完全由晶体振荡器确定,RTC也类似(误差同样完全由晶体振荡器确定)。因此如果撇开晶体振荡器的因素,两者都是精确无误的。

使用特权

评论回复
9
river1972| | 2010-1-19 11:47 | 只看该作者
你的理解是错误的,51的自动重载过程中是需要时间来完成这个动作的,误差是这样产生的,RTC的中断是硬件从32768Hz中分频出来的,所以在同样的晶体的情况下,前者的误差远远大于后者

使用特权

评论回复
10
HWM| | 2010-1-19 11:55 | 只看该作者
你的理解是错误的,51的自动重载过程中是需要时间来完成这个动作的,误差是这样产生的,RTC的中断是硬件从32768Hz中分频出来的,所以在同样的晶体的情况下,前者的误差远远大于后者 ...
river1972 发表于 2010-1-19 11:47

建议好好看看MCS-51的定时器和计数器的相关内容再论不迟。

使用特权

评论回复
11
andy2003hu| | 2010-1-19 12:02 | 只看该作者
MARK

使用特权

评论回复
12
84335262| | 2010-1-19 12:03 | 只看该作者
1.如上所说,精确的计时应该用定时器,特别你用C写的,更加要用计时器。
2.你是多个产品之间的比较。如果是同一个产品(同一个程序),几个样品之间比较还会出现这样大的误差(几十MS),检查晶振的电路,没问题的话更换晶振厂家。用普通晶振应该可以做到一天最多相差1S。需要再精确的话用表的晶振。
3.两个产品之间会积累误差,但是你交通灯控制的,本身就是一个循环,积累只在单个循环里,应该没多大的关系(相当于你拿一个破瓢舀水到一个桶里,流失掉的水的数据会在桶里积累,但是不会在每一瓢水上积累。瓢的容积10升,会漏掉1升,第一瓢水是9升,第十瓢水还是9升而不是0升。)。
4.如果觉得不能忍受这么大误差,那就用加校准的方式去做:做一标准时间的校准机,在开始时间和结束时间发出高电平信号给从机做时间校准。从机用中断接收对应的时间段内的定时数并保存。这样,理论上可以只差中断接收时间及记时误差。要这还不能接受,那就各个芯片联机,过一个小时对一次时间,这样就不会有时间差了。

使用特权

评论回复
13
何工| | 2010-1-19 12:05 | 只看该作者
把自重装花掉的周期补偿回来,再选个高稳定,精准的晶振就可以了.

使用特权

评论回复
14
kili_cn| | 2010-1-19 13:50 | 只看该作者
本帖最后由 kili_cn 于 2010-1-19 13:52 编辑

是不是可以用32.768k 这样2进制整数倍的的晶振  再配合8位或16位定时器的自动溢出时产生的中断 来得到比较准的时基呢

自动溢出是零耗时吧

使用特权

评论回复
15
一级菜鸟| | 2010-1-19 14:34 | 只看该作者
MCS-51利用自动重载的误差完全由晶体振荡器确定,RTC也类似(误差同样完全由晶体振荡器确定)。因此如果撇开晶体振荡器的因素,两者都是精确无误的。 ...
HWM 发表于 2010-1-19 11:43


你忽略了一件事,在执行长机器周期的与短机器周期指令中,中断的响应速度是不一的,这个误差是累积的。

这个问题争论过很多次,太多的人相信自动重载是无误差的,本菜提示过多次就是没人信,连你这个老鸟都这么认为。

使用特权

评论回复
16
因特网用户| | 2010-1-19 14:35 | 只看该作者
用52的话 用定时器即可
用51的话 用11.0592  重载高位 不重载地位即可
用其他51内核的单片机吧   定时器功能强大得很

使用特权

评论回复
17
一级菜鸟| | 2010-1-19 14:40 | 只看该作者
请教高手关于用单片机做的时钟,如何减少程序本身累积误差:
  问题是这样子的,本人从事单片机开发 主要产品是马路路口的交通信号灯倒计时以及相关控制仪器。现在本人写了几个设备的C程序,问题1:几个倒计时一起测 ...
电子三极管 发表于 2010-1-19 09:10


教你个方法,整数频率晶振分频后输入中断,在中断内开计数器。

使用特权

评论回复
18
5880527| | 2010-1-19 15:09 | 只看该作者
15# 一级菜鸟
自动重装会有误差,不是吧,个人感觉那纯粹是靠硬件来完成的,你说响应中断有误差我还相信

使用特权

评论回复
19
HWM| | 2010-1-19 16:00 | 只看该作者
呵,都没明白“时基”是什么。

使用特权

评论回复
20
yewuyi| | 2010-1-19 16:35 | 只看该作者
不要折腾了,现在的红绿灯控制器都要求具备通绿带功能,这就必然要求每个分机都是互联互通的,单机版的红绿灯控制器几乎不可能中标。

呵呵,即使自动重载,晶体本身的误差也无法消除,依然有累计误差,依然是不符合要求的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:承接采集设备运行参数,如温度、速度、压力、浓度、流量、节拍、湿度、重量等。采用PIC 51 AVR等类单片机 59467837(杭州单片机开发技术交流QQ群)

116

主题

530

帖子

2

粉丝