浅议降低51单片机定时器定时误差的几种方法

时间:2022-08-17 05:37:14

浅议降低51单片机定时器定时误差的几种方法

摘要: 51单片机在当前控制检测系统中的应用越来越多,对其定时的精确要求也越来越高。虽然51单片机自带的16位定时/计数器较为精确,但是在实际应用过程中难免存在误差,而且这个误差不可避免,所以降低51单片机定时器误差就显得尤为重要。

关键词: 单片机;定时误差

中图分类号:TP368.1 文献标识码:A 文章编号:1006-4311(2013)17-0051-02

0 引言

51单片机的定时/计数器在基本的单片机系统中都会用到,而且对其定时精确度的要求越来越高。一般我们在单片机系统设计中,定时方式通常有以下三种:软件定时,硬件定时和可编程控制器定时。软件定时是通过程序的指令控制实现定时方法,这种定时方式虽然调整方便,但是误差较大,而且CPU的利用率很低;硬件定时是利用专用的定时集成电路设计实现的定时方法,硬件定时的时间较为精确,但是不易调整定时时间;可编程控制器定时是利用程序控制的方法控制硬件的定时时间,这种定时方式能够得到比较精确的定时时间,且调整定时时间也比较方便,51单片机的定时/计数器就属于可编程控制器定时。

虽然51单片机定时/计数器定时方便,但是在系统应用过程中还存在一定的误差,这个误差主要是由于系统中断响应所引起的。基本的51单片机中有5个中断源,其中两个16位的定时/计数器中断,中断系统采用两个优先级控制。51单片机中断响应过程如图1所示。

这是一个多级中断响应的流程图,在定时中断响应过程中,CPU一般通过查看定时/计数器的中断请求标志位TF0和TF1来确定是否有中断请求。但是在执行定时中断的过程中,CPU必须执行完当前执行的指令或者高优先级的中断程序之后才能进入定时中断,这个过程至少需3个机器周期才能实现,这时定时器中的加1计数器还在计数,这样在进入定时中断重新给加1计数器赋值时就会出现加1计数器重新计数的过程,这就是定时器误差的来源。

我们在利用51单片机定时/计数器进行定时操作时最多的使用它的方式1和方式2。方式1是一个16位的定时/计数器,在中断处理过程中需要对定时器中的加1计数器THx和TLx重新赋值。方式2是一个8位自动重装的定时/计数器,在中断处理中可以不同对其加1计数器进行重新赋值。不管是方式1和方式2在中断处理过程中,由于单片机本身响应流程的问题,都会存在一定的定时误差,在定时要求精确的系统中我们考虑的重点是如何去降低定时误差。

1 降低定时器定时误差的几种方法

在单片机系统设计中,我们可以通过以下方法来降低定时器的定时误差。

1.1 提高外部晶振频率 在常用的51单片机系统中,系统时钟是由外接晶体振荡器的频率决定的,系统时钟频率的高低决定了CPU执行速度,外接晶振频率越高,机器周期越短,CPU执行指令的速度越快,响应中断的速度也越快。在51单片机中,1个机器周期=12个晶振周期,若外接晶振频率为6MHz,则机器周期为2us,若CPU在响应定时中断时正在执行2机器周期的指令,那么进入定时中断所需要的时间为4us,定时器内部加1计数器至少计数了4次(不算重置初值的时间)。若我们将外接晶振频率提升到12MHz,则机器周期为1us,CPU在相同条件下响应中断的时间降低到2us,在进入定时中断时内部加1计数器只加了2次,这样的话就能够降低定时器的误差。

不过,相对而言,这种方法有一定的弊端。我们所希望的是外接晶振的频率越高越好,但是并不是所有的51单片机的外接晶振的频率都能提升的很高,比如ATMEL公司的AT89S51单片机外接晶振的频率最大只有33MHz,那么通过提升外接晶振频率降低51单片机的定时器的误差有一定的局限性。

1.2 软件纠正 其实,在使用定时器定时时,定时器的误差一般是由响应过程引起的,这个误差我们可以通过软件调整的方法对其进行纠正。比如我们利用51单片机T0实现50ms的定时,T0工作在方式1,晶振频率为12MHz,那么程序我们一般这样实现:

Void main()

{

TMOD=0x01; //设置T0工作方式,方式1

TH0=(65536-50000)/256; //置初值

TL0=(65536-50000)%256;

ET0=1; //开启T0中断

TR0=1; //启动T0

EA=1; //开CPU中断

...

}

Void timer0() interrupt 1 //T0中断程序

{

TH0=(65536-50000)/256; //重置初值

TL0=(65536-50000)%256;

...

}

在以上的程序中,T0的中断程序中直接对TH0和TL0进行赋值,这里忽略了CPU在响应定时中断过程中加1计数器的计数值,这样会引起较大的定时误差,而且这个误差是累积的,程序执行的时间越长,误差越大。

我们可以将T0的中断程序做如下的修改:

Void timer0() interrupt 1 //T0中断程序

{

TH0=(65536-50000)/256+TH0; //重置初值

TL0=(65536-50000)%256+TL0;

...

}

这样的话,在CPU响应中断的过程中,虽然定时器内部加1计数器还在计数,但是在定时中断程序中,我们将已经计数的值进行累加,这样就能够降低CPU在响应中断时所产生的误差。

1.3 利用外部硬件定时器 我们知道,51单片机的定时/计数器可以实现定时和计数方式,两者的核心都是在计数,只不过定时方式是对机器周期进行计数,计数方式是对外部引脚输入的输入的方波信号进行计数。那么我们在利用定时器定时时,也可以将定时计数器设置在计数方式。比如我们要实现50ms的定时,我们可以在单片机外部设计一个周期为50ms,占空比为50%的方波电路,将该电路产生的方波信号送入单片机的定时/计数器的外部引脚,这样我们在确定定时时间时,可以通过查询定时器的加1计数器的增量是否为5就可以了,这样也能降低定时误差。不过利用这种方式在实现定时时,外部硬件定时器所产生的基准时间的精确程度决定了定时的误差,外部硬件定时器所产生基准时间越精确,误差越小。

2 结束语

在51单片机系统设计中,在需要用到定时的场合,我们总希望定时误差越小越好,尤其是对于某些对定时时间要求比较高的系统。那么以上的三种方法我们可以相互结合使用,这样可以将定时误差大大降低。

参考文献:

[1]马立国.51单片机定时器中断误差分析.集成电路通讯,2006,24(01).

[2]杨洪亮.基于MCS51单片机定时误差的分析及纠正.临沂师范学院信息学院,福建电脑,2006(12).

[3]李全利,迟荣强.单片机原理与接口技术.高等教育出版社.

上一篇:影响工学结合开展的因素及对策研究 下一篇:基于液压系统的数控车床液压三爪卡盘改造研究