转自21ic,具体链接木有了...
常见的错误观点:
1.我需要用单片机实现精确定时
2.通过各种技巧来修正或避免定时器中断误差的产生
3.用定时器可以获得比软件定时更高的定时精度
破题:
1.指标不明
世界上没有绝对的精确,只有具体的需求。80年代,一块每天误差30秒的机械手表叫“精确”,90年代,一块每年误差10分钟的石英手表叫“精确”,现在的CDMA系统离开了GPS系统授时就会崩溃——没有定义的精确是没有意义的。要求精确的人自己都说不清楚需要精确到什么程度,所以这个讨论本身就是没有意义的。
解决方案:分析自己的具体系统需要多高的定时精度,给出指标。典型的现代RTC系统误差是10分钟/年。其实很少有应用需要高精度的时钟。
2.方向错误
[a]单片机的所有时间基准来源于主时钟,典型地,主时钟有片内RC振荡器和片外石英晶体。
RC振荡器的典型精度为5%,不可能精确。
石英晶体的输出频率与温度和负载电容(晶体旁边接到地的那两个电容)有很大关系,石英晶体的误差包括初始误差、温度漂移和年老化3种,初始误差是在规定的激励功率下,石英晶体配合厂家规定的负载电容(常见值为16pF)和室温下测定,市面普通晶体的初始误差约为20ppm;负载电容包括晶体的封装寄生电容、电路板上焊接的两个电容,电路板的寄生电容、单片机输入引脚的寄生电容组成,当这些电容的和与厂家的测定条件不同时,晶体的输出频率还将发生偏移(pull),漂移值约为十几到二十几ppm每pF;当温度偏移时,晶体的输出频率也将发生类似sin曲线的漂移,该漂移可达数十ppm;晶体每年另存在约5ppm的老化漂移,漂移方向不定。
综上:很多人在使用晶体时根本没有注意这些影响频率的因数,综合一般人的使用习惯,晶体的实际误差约在100-200ppm左右。
解决方案:不了解晶体精度的人,没有权利谈“精确定时”,对于确实需要足够精度晶体频率的应用,应与晶体供应厂家仔细核对设计指标,使用温补晶体,对负载电容使用NPO的第一类电介质电容完成,对晶体部分加屏蔽,严格电路板设计等方式保证足够的时钟源精度。
单片机基于程序运行,当其为多个中断源服务时,特别是当存在这非周期中断时(例如按键),中断服务时间就有可能延迟定时器中断的相应。然而这几乎是一个权衡,如果一个单片机只为定时服务,其会退化为一个ASIC而失去灵活性,这种情况下最佳的解决方案是使用功耗更低、功能更单一和更便宜的RTC芯片。
另一方面,任何振荡频率不能被2整除的晶体,用于秒定时时都会存在误差,若非其他应用条件的限制,应优先考虑使用32768的RTC晶体,软件修正属万不得已的方法,会导致软件复杂度增加。
解决方案:尽量使用32768的晶体作为“秒”相关应用的时钟源,使用该晶体直接驱动定时器,并且使用定时器的溢出自装载功能以减轻软件负担,减少其他中断影响所带来的定时偏差。
3.思路问题
上已述及,单片机的所有行为都是基于主时钟的,除非是带有预取指流水线的系统(例如NXP ARM中的MAM),程序的运行时间都是确定的,并且与定时器处于同一精度级别。由于中断需要现场保护和恢复,其时间对初学者较为复杂;当禁止中断时,软件演示反而更容易得到“高确定度”的延时。
解决方案:尽量减少中断源,让定时器处于高中断优先级,对于简单的局部短延时,使用软件延时完成,对有流水线加速的单片机,尽量使用定时器。
4.结论
综上所述,所有的争论来源于没有给出具体的指标和应用要求,需要多精确的时钟?有哪些资源可用?有哪些设计的限制条件需要考虑?在这些问题没有指明的情况下,讨论任何方案都是没有意义的,“精确定时”本身就是一个伪命题。
解决方案:没有通吃天下的方案,只有最适合当前系统的方案,任何方案都是在权衡利弊后作出的选择。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
从51来说,当执行一个LJMP指令的时候如果产生了定时中断,单片机会等到指令执行完成时才会进入中断服务程序.所以在进入中断服务程序以后读取一下TH0 TL0的数值然后可以避免这个产生的误差.
关于被其他中断打断,这个问题就直接把定时服务设置为最高优先级的中断吧,哈哈.
关于lz说的晶振不准和温漂以及老化漂移
初始误差可以第一次运行的时候测定一下,温漂的话可以曲线拟合或者查表写入eeprom 老化漂移这个真心不知道.
一周热门 更多>