精确定时是用单片机内的定时器好还是时钟芯片好

2020-02-05 08:53发布

刚看了一个帖子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是怎么算的吧!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
76条回答
zhangxun0712
1楼-- · 2020-02-08 08:16
takashiki 和 wajlh两位大哥都说的有理,只是各自理解点不同,而产生了矛盾。
硬件定时器(即计数器)的精度只与单片机外面的晶振有关(现在不管CPU的参不参与,现只对计数这一过程),大家认同吧?当计数器溢出时,此刻会产生中断,而此刻计数器并不会因中断而停止(自动重载,硬件自动现实),因此这个定时是精确的(排除晶振因素)。而我们的软件此刻会拿这个时刻去做一些事,但CPU去拿这个时刻所用的时间是并不却定的(即进中断时间),所以这个定时是不精确的。takashiki 举的这个例子对P1.0输出方波,正好是不需要CPU参与的(硬件自动实现的),所以是精确的;而wajlh举的这个例子是要CPU参与的(中断实现的),所以会出现4个机器的误差。而我们平时用到定时器一般都要用到中断,所以严格来说定时不精确,但这个定时误差不是累加的,因此在精度要求不是相当高的场合下“长时间”(排除晶振的累计误差)的定时还是“相当精确”的。小生个人理解,有错误之处还不请两位大哥指正,先谢了。
zhangxun0712
2楼-- · 2020-02-08 10:04
定时功能的另一个不需要CPU参与的(硬件自动实现的)应用就是:串口的波特率产生。
w418781840
3楼-- · 2020-02-08 11:26
 精彩回答 2  元偷偷看……
wajlh
4楼-- · 2020-02-08 11:56
回复【23楼】takashiki  岚月影
-----------------------------------------------------------------------
不争论了,谁是谁非大家都看着呢。你认为我有对你人身攻击的地方,我说声对不起。多多讨论技术。
jpchen
5楼-- · 2020-02-08 14:39
同意26楼说的,2个人说的都对的,只是着眼点不同,论述的是2个不同的方面。
ckvlhf
6楼-- · 2020-02-08 19:57
哎!连中断响应和中断处理都没搞清楚就争起来了。
一句话,用自动重载方式只要中断程序没有定时时间那么长,就不会有累积误差。只是中断处理可能会延后几个机器周期而已。定时肯定是准确的。

一周热门 更多>