|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
参考书上看到精确定时的概念不理解,就拿来让大虾给我讲解下了 |
作者:lh9865 栏目:单片机 |
引书中原文: 在嵌入式应用系统中,一般是按晶振标称值设置晶振的预分频系数和定时器的固定时间常数,对晶振频率预分频后的输出进行计数,当定时器产生溢出中断时得到时间信号。这种传统的定时方法有以下缺点: 1. 晶体实测频率并不与标称值相符(有的误差较大,超过万分之一),导致定时时间误差。 2. 即使晶体实测频率与标称值接近,采用固定时间常数也存在分频余数问题,同样影响定时精度。 3. 为提高定时精度,预分频档次不能太粗,即预分频系数要适当小些,以降低分频余数产生的误差。但这样导致定时时间短,要取得较长定时信号(如秒号)须对短定时(中断)信号计数获得,致使累计误差变大。 。。。。。 精确定时实现的方法是先测出晶体的实际频率,对经过预分频后的脉冲频率设定两个时间常数----主常数和补偿常数(TCC),在重装时间常数时对常数进行补偿;还可以定时效果修正时间常数,达到精确定时的目的。 设晶体实测频率为fi,选AVR单片机定时期/计数器TCNT1为定时器,其定时输入为fct1信号(主频经分频器的输出),精确定时设定2个时间好常数:一个为主常数,为方便起见,设为65536,该常数下,TCNT1溢出(n-1)次;另一个为补偿常数TCC(余数),该常数下TCNT1只溢出一次,溢出后即将常数改为65536(只须记中断次数而不必重装)。如要定出秒信号,由下式解出TCC及n(正整数): 0〈=TCC= 65536*n-INT(fi/K+0.5)<65536 我不明白的是: 我在实际编程的时候,按照上文所说,我能做的如下: 1. 测出实际频率 2 .按照公式算出TCC 3. 编程时,如果需要定时8次,那就按主常数加载7次,中断溢出7次,查询中断完毕,装入补偿常数,中断一次,就输出秒号 我对于上面的公式不理解,不知道实际频率是大还是小,如果是大的话,那就是一个实际的计数值变小了,在实际的定时中,应该是与补偿时间的加和值的 还有为什么是补偿中断只是中断一次呢? 精确定时有诸多困惑,我知我理解的肯定是有很大的偏差,想着请大虾帮忙 |
2楼: | >>参与讨论 |
作者: 平常人 于 2006/9/26 8:25:00 发布:
楼主不要只看书,自己也思考一下、演算一下,这个问题不难 设想一个标称8MHZ的晶振,经8分频计数,一秒要计数100万次,若晶振较快是8,000,800,则一秒应计数1,000,100次,若晶振较慢是7,999,200,则一秒就计数999,900次。 自己推导一下就有了,动动脑子,有何难? |
3楼: | >>参与讨论 |
作者: xwj 于 2006/9/26 9:10:00 发布:
这都想不通?LZ多动动脑筋啊 首先,要明白什么叫精确定时 由于定时计数器一般都只有16位,计满也不到1秒,所以1秒必然要多次中断 计数器是不停往上面加的 当计数值从0xFFFF再加1就会翻转到0,同时产生溢出中断 16位计数器从0计数到0是65536次,精确计数方法这时是不去动计数值的,所以比较精确 你仔细想想要计数8000000次应该怎么做?应该中断几次? 实际上51系列除了89C51外都有T2,T2是可以设为自动重载的 AVR的计数器可以选择比较OCRxA时自动翻转,这个是可通过程序控制的, 合理应用比你引用的文章更方便 你引用的文章也是有很多局限性的,实际上还是有误差,因为要等当前指令执行完才会进中断,而51或AVR的指令周期都是等长的,所以触发后进入中断的时间是不确定的 正确的做法是中断后读取当前计数器值,加上补偿余数,同时还要考虑这些指令的时间 高手和低手的差别就看对器件能熟悉到什么程度 考虑问题能周到到什么程度 怎样把硬件功能发挥到淋漓尽致,玩出更多的花样 这些先不管,你先想明白他的方法再说吧 |
4楼: | >>参与讨论 |
作者: lh9865 于 2006/9/26 9:51:00 发布:
谢谢诸位的指点,因为刚接触,所以理解上有些吃力了 |
5楼: | >>参与讨论 |
作者: NE5532 于 2006/9/26 20:44:00 发布:
没有定时是“精确”的,除非是纯硬件。 |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |