刚看了一个帖子http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4056474&bbs_page_no=1&search_mode=1&search_text=定时&bbs_id=9999
好像用单片机内的定时器定时会有误差,是这样吗?误差来源是什么呢?定时器不是1微妙加一计时的吗? 怎么会有误差呢?我用过方式2,就是那种自动重装载的方式,用protues仿真运行一个小时,好像也看不到误差啊?
要是用时钟芯片,会不会降低系统的稳定性呢?毕竟多了一部分电路,且在单片机外部,在工控场合会不会容易受到干扰而计时不准呢?
帖子内容如下:
/********定时器T0中断函数**********/
void t0(void) interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;//这样的定时数据,是不是正好是50000*1微秒=50毫秒?
aa++;
if(aa==18)//这里的意思是中断18次,需要1秒的时间(晶振12MHz),我怎么感觉应该是中断20次用时1秒?
{
aa=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
shi=0;
}
}
}
----------------问题附在注释里面,请指点一下,看看这个18是怎么算的吧!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
刚看了一个帖子http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4056474&bbs_page_no=1&search_mode=1&search_text=定时&bbs_id=9999
好像用单片机内的定时器定时会有误差,是这样吗?误差来源是什么呢?定时器不是1微妙加一计时的吗? 怎么会有误差呢?我用过方式2,就是那种自动重装载的方式,用protues仿真运行一个小时,好像也看不到误差啊?
要是用时钟芯片,会不会降低系统的稳定性呢?毕竟多了一部分电路,且在单片机外部,在工控场合会不会容易受到干扰而计时不准呢?
帖子内容如下:
/********定时器t0中断函数**********/
void t0(void) interrupt 1
{
th0=(65536-5000......
-----------------------------------------------------------------------
进中断是要时间,但是决不影响计时精度。
影响精度的只有一个因素,那就是晶振本省。若晶振毫无误差,计时就可以毫无误差
回复【32楼】bitter rain
若晶振毫无误差,计时就可以毫无误差
-----------------------------------------------------------------------
不敢苟同,代码的运行是需要占用cpu时间的,进行精确的定时必须考虑代码的运行时间。
-----------------------------------------------------------------------
自动重装模式。。。
的结论一样。
首先要明确题目,单片机内的定时器与时钟芯片相比较哪个更准。基于此题目,对于晶振的误差当然就不考虑在内了,毕竟两种方案都要用晶振,晶振误差是不可避免的,而中断响应时间嘛,却要考虑在内,毕竟中断是定时器与单片机沟通的桥梁嘛。
至于【23楼】 takashiki 岚月影,说到的那种不用中断的定时方式,确实挺好,可是我毕竟还是要把定时用在很多场合的,就我现在而言,只是想用这个时间来做一个定时开关的(可任意设定开通和关断时间的那种,类似于闹钟吧,而且是能设定多个时间的那种)。不能只用于方波的产生啊。
我的理解是,单片机内的定时器与时钟芯片相具有同等的精确性(有人还想咬晶振的话,请参照上面的第二段)(非自动重载方式,在定时溢出之前and自动重载方式却可以无限定时)。至于这个定时之后的事情嘛,那是cpu要做的事情了,与定时器和时钟芯片无关。
所以请大家不要再在中断响应时间上大吐口水了。对于软件延时,小生确实不敢重用,毕竟一个系统中要是不用中断的话,确实做不出什么大文章。当然啦,有人还非要较真,定时1uS(12M晶振)之类的,那个确实该用软件延时啦。
既然是定时,那就必然会在定时时间到后做一些事情啦。cpu或主动或被动获取这个时间。
时钟芯片,我觉得是cpu主动获取的吧,不过这里还有个疑问,cpu该怎么获取呢,难道cpu要把时钟芯片的时间取过来,实时的与定时时间相比较呢?或者是时钟芯片有定时报警之类的东西,这样的话(就是cpu被动了),是不是要通过中断告诉cpu,定时时间到,要是这样的话,不就是也有中断响应时间的问题吗?(希望得到大家的解惑)
单片机内的定时器嘛,好像就只有定时中断一种吧。既然定时准确,自动重载方式中,又无误差累计,还有什么要计较的吗?既然都用定时器啦,那肯定是mS级别以上的吧,差那么1~4个周期的中断响应时间又不伤大雅,否则,您还是用软件延时吧。
我的初衷和【32楼】 bitter rain 类似。
要是用时钟芯片,会不会降低系统的稳定性呢?毕竟多了一部分电路,且在单片机外部,在工控场合会不会容易受到干扰而计时不准呢?
而且多一个芯片,就会多一部分成本啊。当然啦,人工费,软件费,还有其他一些想得到的想不到的费用都不计。单就是器件费用而言的。
--------------------------------非自动重装模式一样要考虑中断后CPU响应时间和赋初值的时间,
时钟芯片,我觉得是cpu主动获取的吧,不过这里还有个疑问,cpu该怎么获取呢,难道cpu要把时钟芯片的时间取过来,实时的与定时时间相比较呢?或者是时钟芯片有定时报警之类的东西,这样的话(就是cpu被动了),是不是要通过中断告诉cpu,定时时间到,要是这样的话,不就是也有中断响应时间的问题吗?(希望得到大家的解惑)
--------------------------------------------------------------------------比较,先比较小时,小时匹配再比较分钟,这样比较的次数最少,效率高,最多比较次数也才23+59次而已,带闹钟的时钟芯片也有,闹钟时间到来以后CPU响应的时间不会超过1S吧?闹钟可是一分钟之内都有效的,忽略
单片机内的定时器嘛,好像就只有定时中断一种吧。既然定时准确,自动重载方式中,又无误差累计,还有什么要计较的吗?既然都用定时器啦,那肯定是mS级别以上的吧,差那么1~4个周期的中断响应时间又不伤大雅,否则,您还是用软件延时吧。
--------------------------------------
每次1个周期的误差(按12M算是1us),假设定时250us,那么就是1/250的误差了,当250min后就会有1min的误差,每天就是5分多的误差,很可观而不是无伤大雅。。
要是用时钟芯片,会不会降低系统的稳定性呢?毕竟多了一部分电路,且在单片机外部,在工控场合会不会容易受到干扰而计时不准呢?
-----------------------------------------------------
听说过CPU死机,跑飞的,没听过时钟芯片跑飞,死机的(孤陋寡闻了,呵呵),而且时钟芯片的耗电比CPU可是小很多的,特别是在掉电以后
本帖我以前的一些回复有些偏激,因为某人的某些语气受不了。即使使用T2来定时,也同样是需要进出中断的,我那个例子只是讲T2定时器具有时钟输出功能,同样说明使用T2可以进行16位自动重载而不至计时不精确。
下面是我的一些个人看法,不见得正确。
晶振是需要考虑的,原因在于单片机一般采样的都是高频晶振,而时钟芯片一般采用的32768Hz的表振,精度是不一样的。很少有人在单片机上使用高精度的晶振,所以,不可一概而论。
本人习惯于芯片数量越少越好,习惯而已。要是我选择,我绝对不会选择外部时钟芯片,我会选择带有RTC的单片鸡。现在的单片机种类多得很,适用于不同用途的总是可以选到的,我会为不同的项目选择各自合适的芯片,而不是单一一种包打天下。
一周热门 更多>