打印

还是**那句话:实事求是

[复制链接]
楼主: icmap
手机看帖
扫描二维码
随时随地手机跟帖
21
5880527| | 2008-11-18 22:33 | 只看该作者 回帖奖励 |倒序浏览

不会有累计误差的

你在计算重装值的时候把那用于消除中断响应影响所浪费的时间考虑进去就是了。它可以消除因为每次中断响应不同而造成的执行时刻不同的问题,比如你用这个定时器做一个10ms的脉冲,程序能保证你每一个脉冲的宽度绝对一致,而自动重装如果不这样处理就解决不了这个问题,除非你用硬件PWM

使用特权

评论回复
22
NE5532| | 2008-11-18 22:36 | 只看该作者

帮你算算

60/3600*24*365=1.9ppm

拆开你的计算机看一下,晶体是哪一种。

我前天刚买了1颗1ppm精度的温补晶体,150元1只,谁下血本做这个呀?

使用特权

评论回复
23
5880527| | 2008-11-18 22:39 | 只看该作者

18楼

TL0装到TL的值不会太大,我没仔细去研究过,但由于只有它一个是最高级别,十来个NOP就足够了,不会跳出去

使用特权

评论回复
24
5880527| | 2008-11-18 22:43 | 只看该作者

我不用keil

大部分的网友都是用它的吧,可以模拟一下,看看实际效果就知道那程序是怎么回事了,把那定时器中断级别设置到唯一的一个最高级

使用特权

评论回复
25
天雨粟| | 2008-11-18 22:50 | 只看该作者

就便请问19楼的行家

温补晶振的成本,是否恐怖?
用测温芯片补偿,DS18B20要7元,补偿公式是否易求得?是否有成功案例?
内置温补晶振芯片,成本在多少?

PC及手机是采用的上述方案吗?汗,问得太多了!

使用特权

评论回复
26
ljm810010| | 2008-11-18 22:51 | 只看该作者

哦,看明白了,确是一个好方法

可惜要占用dptr,如果可以不占用就更好了,很多中断不一定要到dptr,还有,那个mov dptr,#tab 是否可改成  mov dptr,#tab-10?  这样后面可以少10个NOP了,免得浪费。

使用特权

评论回复
27
5880527| | 2008-11-18 22:56 | 只看该作者

如果你有把握中断的时候TLO不太大可以适当减去几个

其实就浪费几个us,完全消除了中断响应不一致的影响,还没见书本上这样写过,真是佩服前人设计单片机时的精明。这程序给人的感觉有点悬,但我一直这样用还从没说跳出去的时候。隔壁技术交流里讨论PWM我就说要贴这个的,这个方法应该可以达到和硬件PWM一样无误差吧^_^

使用特权

评论回复
28
icmap|  楼主 | 2008-11-18 23:12 | 只看该作者

回复 4 楼和 7 楼


计时误差分为“硬件误差”和“软件误差”。
以上二者又分别都可分为“累积误差”和“瞬时误差”。

硬件误差不是软件造成的,我就不说了。下面说说软件误差。

软件计时误差分为“累积误差”和“瞬时误差”
我们平常要求的计时误差是对二者的的综合结果进行评价。

对计时误差的要求有两种:
一种是绝对值要求,例如要求计时误差不大于 0.4ms 等等,这一般出现在短时间计时的情况中。
另一种是比例要求,例如要求计时误差不大于 1ppm 等等,这一般出现在长时间计时的情况中。

对于小于 0.4ms 的计时误差要求,一般都不考虑长时间计时的可能,这时可以使用指令延时,或定时器中断,
如果还想更精确,可以使用 PCA 的高速输出功能或 PWM 功能(1us级精确输出),或者捕捉功能(1us级精确输入)。

对于长时间的计时(例如 1 秒以上),软件瞬时误差做到 1ms 就足够了(不会累积的误差称为“瞬时误差”),
关键是累积误差要小,尤其是软件造成的累积误差更应该要小,因为这不是很难的问题。

为什么我反对定时器重装?就是因为这个方法要考虑指令的执行时间,这会造成软件上较大的累积误差,约为 1/65536,即 15ppm。

如果不对定时器重装,在使用 4 个字节的存储器时,软件累积误差可以做到 1/(2^32)至1/(2^24),即小于 0.06ppm,这完全足够了,
因为晶振的硬件误差很难有小于 1ppm 的。

大家先讨论,我的方法晚几天发表。

使用特权

评论回复
29
天雨粟| | 2008-11-18 23:18 | 只看该作者

回NE5532老师

我的办公室也是实验室,温度较恒定,这可能也是一个原因罢!
年误差十分的话,日差约两秒,试试用有源晶振,能否达到这个要求。

使用特权

评论回复
30
ljm810010| | 2008-11-18 23:39 | 只看该作者

对icmap这句不理解,还望赐教

“为什么我反对定时器重装?就是因为这个方法要考虑指令的执行时间,这会造成软件上较大的累积误差,约为 1/65536,即 15ppm。”

为何重装就有误差?又为何是1/65536?
5880527已给出修正方法,我认为已经可以完全消除软件误差了。

使用特权

评论回复
31
天雨粟| | 2008-11-18 23:55 | 只看该作者

楼上,恐怕是时序问题即量化误差罢!

例如TR0=0这条。一周期,六状态,它具体在其间的那个地方起作用——即停止计数呢呢?应该不是S6P2之后罢,如在中间,比如S3P2间呢,总之在不同的地方,结果即有细微的不同,我以为是量化误差,误差大小是一个机器周期。这个理解对不对呢?

使用特权

评论回复
32
icmap|  楼主 | 2008-11-19 00:00 | 只看该作者

回复 30 楼

你说的那个程序的可移植性不好,如果换了一个 MCU,即使还是 51 系列的 MCU,也很有可能就要重新计算指令时间,因为 51 系列的 MCU 有 12 周期的,还有 6 周期、4 周期、1 周期的。
此外,如果使用 C 语言,那更是头大。

1/65536 是估计值,是这样算来的:
假设指令误差 1 个时钟周期(实际上有可能为 0,1,2,等等),假设中断周期为 65536 个时钟周期(实际上小于 65536,误差会更大),
则造成误差为 1/65536。
当然,如果你能确保没有指令执行时间上的偏差,软件累积误差就是0。

使用特权

评论回复
33
ljm810010| | 2008-11-19 00:17 | 只看该作者

呵呵,原来icmpa所说的是不修正方式重装。

不修正方式重装,肯定会有误差,且一般都比1/65536大,这个我理解了,谢谢!
但是“如果不对定时器重装,在使用 4 个字节的存储器时”这句又是什么意思?定时器只有两个字节,何来4个字节?
还有的是,假如定时时间要求是1000个时钟周期,不重装定时器,又怎能实现定时中断?还望赐教!

使用特权

评论回复
34
icmap|  楼主 | 2008-11-19 00:27 | 只看该作者

睡觉去了,明天晚上再上来。

使用特权

评论回复
35
耕在此行| | 2008-11-19 08:38 | 只看该作者

计时还考虑重载与不重载影响精度?

既然是单片机,你不能用软件补吗?
误差来自什么?是你无法控制的不确定性影响才会是真正的根源.

使用特权

评论回复
36
呆板书生| | 2008-11-19 08:57 | 只看该作者

13楼的算法

太菜了,

和 TL0 += CON_TIME_L; //(CON_TIME_L 是一个自定义的常数)

的效果其实是一样,但那个简洁?

使用特权

评论回复
37
ljm810010| | 2008-11-19 09:50 | 只看该作者

楼上未免太自信了,你试试CON_TIME_L=0xFF时,是否出错?

使用特权

评论回复
38
Jacksult| | 2008-11-19 09:52 | 只看该作者

13楼的方法很好

13楼的方法很好,只要10个 NOP 就够了,只要它的中断优先级最高,应该没什么问题.

使用特权

评论回复
39
5880527| | 2008-11-19 10:31 | 只看该作者

哈哈

普通51真正意义上的软件无误差定时器中断产生了!

使用特权

评论回复
40
ljm810010| | 2008-11-19 11:26 | 只看该作者

楼上别高兴,脉宽为十来个机器周期的PWM,你的定时就无能

使用特权

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

本版积分规则