搜索
bottom↓
回复: 13

怎样精确延时1ms?有没有什么好的方法,使代码效率高?

[复制链接]

出0入0汤圆

发表于 2006-6-30 14:49:41 | 显示全部楼层 |阅读模式
环境:ICCAVR

MCU:mega8

晶振:3.6864

有没有什么好的方法,使代码效率高?

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2006-8-18 15:02:28 | 显示全部楼层
使用了3.6864,精确1ms的延时做不到。



用4M、定时中断、用汇编。

出0入0汤圆

发表于 2006-9-9 02:18:34 | 显示全部楼层
请问马老师,晶振的振荡频率是有个误差范围的,即使是按你说的“用4M、定时中断、用汇编”,长期工作下来,累积的时间误差也会逐步加大,再说中断处理指令以及响应中断也需要时间。我想问一下如何才能比较有效的消除象这样的累积误差,使程序在长时间工作仍能保持相当高的定时精度?

晶振的实际振荡频率有分散性,即便是相同标称频率的晶振,其实际振荡频率也不可能完全相同。再有就是晶振的实际工作频率(似乎:)容易受到温度变化(请问马老师,还有哪些因素:)的影响,似乎很难做到在长期运行而保持时间误差不随着继续增长:(

出0入0汤圆

发表于 2007-10-19 10:11:06 | 显示全部楼层
使用外部晶振32.768KHZ,內部系統時鐘8MHZ.用外部時鐘分頻來計時.內部時鐘為系統時鐘.完全可以精確計時.

出0入0汤圆

发表于 2007-10-19 19:36:36 | 显示全部楼层
to 2 楼:

这个问题要从2方面分析。

首先是源。使用任何晶体都有漂移的现象,只不过32768的表用晶体偏差小一点。要求高的话,应该使用好一点的RTC时钟器件,因为它是专用的芯片,有温度补偿等。

其次是你自己的程序设计。不管使用4M的晶体,还是使用专用的RTC,中断是必须的。你的中断如何设计要看你的本事了。如果程序设计不好,使用再好的源,你也的不到精确的1MS定时。

对于使用4M晶体,可以得到1MS的定时,能够满足大多数的应用。我在这里只是提醒,在定时器的使用上,应该使用CTC方式(对于51则是自动重载方式)。这样从定时器本身工作方式讲是不会产生累积误差的。至于为什么,请你自己分析,这也是我讲义中的思考题之一。至于中断程序的编写,需要自己不断的磨练了。我讲义的第11章中有频率和周期的测量,这就要求定时器的定时要精确,这样测量的频率和周期才能正确。里面的中断程序你可以自己分析。

出0入0汤圆

发表于 2009-6-23 16:30:43 | 显示全部楼层
ddddddddddddddddddddddd

出0入0汤圆

发表于 2009-6-23 17:55:10 | 显示全部楼层
nop

出0入0汤圆

发表于 2009-6-24 07:24:28 | 显示全部楼层
单纯1mS精确定时是很简单的,开中断,设定时器值,等待中断,具体使用什么样的晶振我觉得不重要,最大误差仅仅1两个指令周期。

如果是时钟计量,那就不简单了,即便是使用带恒温槽2ppm的晶振,连续工作下来1年也有数十秒的误差。何况现大部分晶振都是10-20ppm呢!

出0入0汤圆

发表于 2009-6-24 09:20:09 | 显示全部楼层
楼上,直接这么干误差不一定是1两个周期吧。
进入中断 会有断点地址保护,寄存器保护,这就多少个周期。如果需要非常精确的话,1是CTC模式,不用你再自己写初值,浪费几个指令周期。2是嵌入汇编,同时关闭编译器的自动生成断点保护功能。让发生中断到中断代码执行的时间可控,便于计时器初值的修正。

出0入0汤圆

发表于 2009-6-24 09:34:29 | 显示全部楼层
计时器初值修正不可靠,从sleep唤醒,需多几个T
AVR的话CTC就好了...
精度取决于晶振 ...

出0入0汤圆

发表于 2009-6-24 11:53:33 | 显示全部楼层
lz的问题是“怎样精确延时1ms?有没有什么好的方法,使代码效率高?”

这里有2个要求:精确延时1ms和代码效率高

精确的概念还是比较模糊的,精确到什么程度?当然是以符合和满足实际应用为准了。

从精确的角度分析,下面的办法可以保证比较好的“精确”

1。使用精度高的振荡源。对于要求非常高的应用,这个就需要考虑了,因为它是根本。以下方法是建立在系统时钟是精确的,如何得到精确的延时。
2。通常应该使用定时器,不需要延时代码(代码效率高)。软件延时会被中断打断,这样就谈不到精确了,CPU的效率也低。
3。系统的时钟频率选择,要选择能精确分频到1ms,比如4M。使用3.6864就不行了,这个是用于产生标准USART波特率的。
4。采用CTC方式。这样可以保证每隔1ms就能申请中断,但还是不意味着你1ms一次任务能精确的执行。
5。以下就复杂了:但首先要保证你的1ms中断服务执行时间必须小与1ms
  5.1 如果系统当中只有这一个定时中断,那么你1ms中断服务执行的间隔就是最精确的了,误差是AVR执行一条指令的时间,最多4个T。
      具体分析:中断产生是精确的每隔1ms一次。尽管中断响应需要4-7T。一旦程序完成,确定了语句,这个是响应时间是固定的,比如7T,那么开始执行1ms中断服务的时间比中断产生晚了7T,但是其2次间隔还是精确的1ms,因为下次中断产生,也是7T后才执行服务程序。那么误差出现在什么地方?就是中断发生时,CPU当前的指令是否执行结束。如果中断发生时正好CPU执行完指令,那么7T后执行中断服务;而中断发生时CPU当前正在执行指令,那么要等CPU执行完当前指令后才能响应中断,进入7T后执行中断服务。这个误差不可避免,但不是累加的。
   5.2 如果系统当中有多个断,情况就复杂了。首先你必须使1ms中断优先级最高,并使用中断嵌套技术,才能最大可能的保证精度。但就是这样,误差也比上一种情况大。比如1ms中断发生时,CPU正在进入另一个中断的过程中,那么这个1ms中断的响应延误就大多了,而且还于其它中断服务程序的编写有关(主要是进入中断服务后什么时候开全局中断)。


只有你真正明白这些,你才能知道什么是代码效率高,如何使代码效率高。

===================================================================
我的解释回答基本上不是LZ需要的,他还不到这个深度。主要针对一些回贴的人,他们有一定的基础和概念,但分析的不全面,不到家。

出0入0汤圆

发表于 2009-12-10 22:21:59 | 显示全部楼层
马老师分析得太好了!

出0入0汤圆

发表于 2011-4-14 14:24:01 | 显示全部楼层
我想做个万年历 不用时钟芯片 但还要用串口通信 那怎么办呢?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-29 21:58

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

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