单片机定时器的应用与误差纠正(精)

合集下载

单片机定时器中断时间误差的分析及补偿

单片机定时器中断时间误差的分析及补偿

单片机定时器中断时间误差的分析及补偿单片机内部一般有若干个定时器。

如8051单片机内部有定时器0和定时器1。

在定时器计数溢出时,便向CPU发出中断请求。

当CPU正在执行某指令或某中断服务程序时,它响应定时器溢出中断往往延迟一段时间。

这种延时虽对单片机低频控制系统影响甚微,但对单片机高频控制系统的实时控制精度却有较大的影响,有时还可能造成控制事故。

为扩大单片机的应用范围,本文介绍它的定时器溢出中断与CPU响应中断的时间误差、补偿误差的方法和实例。

 2 误差原因、大小及特点 产生单片机定时器溢出中断与CPU响应中断的时间误差有两个原因。

一是定时器溢出中断信号时,CPU正在执行某指令;二是定时器溢出中断信号时,CPU正在执行某中断服务程序。

 2.1. CPU正在执行某指令时的误差及大小 由于CPU正在执行某指令,因此它不能及时响应定时器的溢出中断。

当CPU执行此指令后再响应中断所延迟的最长时间为该指令的指令周期,即误差的最大值为执行该指令所需的时间。

由于各指令都有对应的指令周期,因此这种误差将因CPU正在执行指令的不同而不同。

如定时器溢出中断时,CPU正在执行指令MOV A,Rn,其最大误差为1个机器周期。

而执行指令MOV Rn, direct时,其最大误差为2个机器周期。

当CPU正在执行乘法或除法指令时,最大时间误差可达4个机器周期。

在8051单片机指令系统中,多数指令的指令周期为1~2个机器周期,因此最大时间误差一般为1~2个机器周期。

若振荡器振荡频率为fosc,CPU正在执行指令的机器周期数为Ci,则最大时间误差为Δtmax1=12/fosc乘以Ci(us)。

例如fosc=12MHZ,CPU正在执行乘法指令(Ci=4),此时的最大时间误差为: Δtmax1=12/fosc乘以Ci=12/(12乘以106)乘以4=4乘以10-6(s)=4(μs) 2.2 CPU正在执行某中断服务的程序时的误差及大小 定时器溢出中断信号时,若CPU正在执行同级或高优先级中断服务程序,则它仍需继续执行这些程序,不能及时响应定时器的溢出中断请求,其延迟时间由中断转移指令周期T1、中断服务程序执行时间T2、中断返回指令的指令周期T3及中断返回原断点后执行下一条指令周期T4(如乘法指令)组成。

单片机定时器中断时间误差的分析及补偿(精)

单片机定时器中断时间误差的分析及补偿(精)

单片机定时器中断时间误差的分析及补偿作者冰晓日期 2009-1-8 8:09:00推荐摘要:本文分析了单片机定时器溢出中断与CPU响应中断的时间误差,并给出了补偿误差的方法和实例。

关键词:单片机; 定时器; 中断; 误差1前言单片机内部一般有若干个定时器。

如8051单片机内部有定时器0和定时器1。

在定时器计数溢出时,便向CPU发出中断请求。

当CPU正在执行某指令或某中断服务程序时,它响应定时器溢出中断往往延迟一段时间。

这种延时虽对单片机低频控制系统影响甚微,但对单片机高频控制系统的实时控制精度却有较大的影响,有时还可能造成控制事故。

为扩大单片机的应用范围,本文介绍它的定时器溢出中断与CPU响应中断的时间误差、补偿误差的方法和实例。

2误差原因、大小及特点产生单片机定时器溢出中断与CPU响应中断的时间误差有两个原因。

一是定时器溢出中断信号时,CPU正在执行某指令;二是定时器溢出中断信号时,CPU正在执行某中断服务程序。

2.1.CPU正在执行某指令时的误差及大小由于CPU正在执行某指令,因此它不能及时响应定时器的溢出中断。

当CPU执行此指令后再响应中断所延迟的最长时间为该指令的指令周期,即误差的最大值为执行该指令所需的时间。

由于各指令都有对应的指令周期,因此这种误差将因CPU正在执行指令的不同而不同。

如定时器溢出中断时,CPU正在执行指令MOVA,Rn,其最大误差为1个机器周期。

而执行指令MOVRn, direct时,其最大误差为2个机器周期。

当CPU正在执行乘法或除法指令时,最大时间误差可达4个机器周期。

在8051单片机指令系统中,多数指令的指令周期为1~2个机器周期,因此最大时间误差一般为1~2个机器周期。

若振荡器振荡频率为fosc,CPU正在执行指令的机器周期数为Ci,则最大时间误差为Δtmax1=12/fosc×Ci(us)。

例如fosc=12MHZ,CPU正在执行乘法指令(Ci=4),此时的最大时间误差为:Δtmax1=12/fosc×Ci=12/(12×106)×4=4×10-6(s)=4(μs)2.2CPU正在执行某中断服务的程序时的误差及大小定时器溢出中断信号时,若CPU正在执行同级或高优先级中断服务程序,则它仍需继续执行这些程序,不能及时响应定时器的溢出中断请求,其延迟时间由中断转移指令周期T1、中断服务程序执行时间T2、中断返回指令的指令周期T3及中断返回原断点后执行下一条指令周期T4(如乘法指令)组成。

浅谈MCS 51单片机定时误差原因

浅谈MCS 51单片机定时误差原因

智能制造数码世界 P .275浅谈MCS 51 单片机定时误差原因谢琪林 攀枝花学院摘要:随着MCS 51 单片机在工业上的实际应用,精确定时的要求越来越高。

但是由于时钟周期考虑不全和硬件自身等的原因引起定时误差,文中从软硬方面分析了误差原因, 并针对误差非固定性的特点合理考虑各种指令执行周期、设置计数器初值、利用计数器溢出值、适时开关中断的角度出发给出了纠正方法。

关键词:单片机;误差;定时在MCS 51 单片机的控制系统中, 常常要求有些定时或者延时控制。

定时或者延时控制一般有如下2 种方法: 软件延时,即让CPU 循环执行一段时间, 以实现延时和硬件定时, 即利用MCS 51 系列单片机硬件集成的2 个16 位可编程定时/计数器。

但采用上述这两种方法来实现时间控制时却容易产生误差, 对于一般低频率的应用中对时间控制精度要求低的场合来说没有太大的问题, 而在高频实时控制应用中对时间控制精度要求高的场合来讲问题就凸现出来, 必须加以纠正和补偿。

1 软件延时误差的产生及纠正软件延时原理: 利用CPU 内部定时机构, 使每执行一条指令需要若干个指令周期的原理, 运用软件编程, 让机器循环执行一段程序, 而得到一个固定的时间段, 就将这段时间作为定时时间。

软件定时的时间长短完全取决于指令的执行时间, 此方法主要用于短时间定时。

例, 采用软件方法设置一个502μs 的定时时间, 设晶体振荡频率为12MHz。

可编制如下的子程序段用于软件定时。

DELAY : MOV R2, #64H ; 1 个时钟周期DL1: NOP ; 1 个时钟周期NOP ;DJNZ R2, DL1 ; 2 个时钟周期RET ; 1 个时钟周期在该程序段中, 采用减1 指令计数, 计数初值100( 64H) 预先设置在寄存器R2 中, 各指令的执行时间如程序段中的注释所示。

软件定时的时间可由各指令的执行时间以及循环次数100( 64H) 所确定, 计算如下:1μs+(1μs+1μs+1μs +2μs)×100+1μs=502μs但在很多情况下, 只考虑了循环体的执行时间, 没有考虑本例中的MOV 、RET 指令, 即在设计延时500μs 时也采用了本程序, 这样就有一个误差, 误差率是0.4%, 这个误差非常大。

单片机定时器的应用与误差纠正

单片机定时器的应用与误差纠正
Ke r y wo ds: me;I tn ̄pto Si 一 h p mir c m p tr Ti r n e u in; n c i co o u e
中图分类 号 : N 0 T 49
文献标 识码 : A
文 章编号 : 5 3— 7 5 2 0 ) 5—0 4 0 16 4 9 (0 2 0 0 6— 3
2 定 时器 工 作 方 式 与 方 式 设 置
MC .1 片机 有两路 独立 的定 时 器 ,每 路定 时 S5 单 器有 4种 工作方 式 ( 0~3 , 式 0是 1 )方 3位计数 结构 , 计数器 由 T H全部 8 与 T 位 L的低 5位构成 ; 方式 1 是 l 位 计 数结构 , 6 计数 器 由 T H与 T L全部 8位共 1 位 6 组成 ; 式 2是 8位计 数结 构方 式 , 方 计数 器 由 T 8位 L 组成 . 与其他 方式不 同的是 , 当定 时溢 出时 , 硬件 自动 将T H的值 装 人 T L中 , 自动加 载 功能 。 有 前三 种工作 方式 , 两路 定时 器的设 置与使用 完 全相 同 , 在工作 但 方 式 3下 ,两路定 时器有 很大差 别 , 只有 0路定 时器 可 以工 作在 方 式 3下 ,1 定 时 器 只 能工 作 在 方 式 路 其 中 ,3~B 用来 控制 0路定 时器 , 来控制 1 o B ~B 用
单 片机 定 时器的应 用与误 差 纠正
T D中写 入相应数 , MO 如设 置 0路 定时器 工作 在定 时 方式 0下 ,1 路定 时器工 作在 方式 1 ,则应 用下列 下 指令设 置:
M OV TM OD, 0H #1
文 就 MC .1单 片 机 的 使用 方 法与 误 差 校 正 方 法 进 S5

单片机定时器-计数器实验总结

单片机定时器-计数器实验总结

单片机定时器-计数器实验总结单片机定时器/计数器实验总结篇一:单片机实验之定时器计数器应用实验一一、实验目的1、掌握定时器/计数器定时功能的使用方法。

2、掌握定时器/计数器的中断、查询使用方法。

3、掌握Prteus软件与Keil软件的使用方法。

4、掌握单片机系统的硬件和软件设计方法。

二、设计要求1、用Prteus软件画出电路原理图,单片机的定时器/计数器以查询方式工作,在P1.0口线上产生周期为200μS的连续方波,在P1.0口线上接示波器观察波形。

2、用Prteus软件画出电路原理图,单片机的定时器/计数器以中断方式工作,在P1.1口线上产生周期为240μS的连续方波,在P1.1口线上接示波器观察波形。

三、电路原理图六、实验总结通过这次实验,对定时器/计数器的查询工作方式有了比较深刻的理解,并能熟练运用。

掌握定时器/计数器的中断、查询使用方法。

对于思考题能够运用三种不同思路进行编程。

七、思考题1、在P1.0口线上产生周期为500微秒,占空比为2:5的连续矩形波。

答:程序见程序清单。

四、实验程序流程框图和程序清单1、以查询方式工作,在P1.0 RG 0000H START: LJMP MAIN RG 0100H MAIN: MV IE, #00H MV TMD, #02H MV TH0, #9CH MV TL0, #9CH SETB TR0 LP: JNB TF0, LP CLR TF0 CPL P1.0 AJMP LP END2、以中断方式工作,在P1.1 RG 0000H START: LJMP MAIN RG 000BH LJMP TTC0 RG 0100H MAIN: MV TMD, #02H MV TH0, #88H MV TL0, #88H SETB EA SETB ET0 SETB TR0 HERE: LJMP HERE RG 0200H TTC0: CPL P1.1 RETI END3、在P1.0口线上产生周期为500微秒,占空比为2:5的连续矩形波 RG 0000H START: LJMP MAIN RG 0100H MAIN: MV IE, #00H MV TMD, #20H MV TH1, #38H MV TL1, #38H MV TH0, #0F6H MV TL0, #14H LP1: SETB TR1 LP2: JNB TF1, LP2 CLR TF1 CLR TR1 CPL P1.0 SETB TR0 LP3: JNB TF0, LP3 MV TH0, #0F6H MV TL0, #14H CLR TF0 CLR TR0 CPL P1.0 LJMP LP1 END RG 0000H START: LJMP MAIN RG 0100H MAIN: MV IE, #00H MV TMD, #20H MV TH1, #38H MV TL1, #38H MV TH0, #0F0H MV TL0, #0CH SETB TR0 LP1: SETB TR1 LP2: JNB TF1, LP2 CLR TF1 CLR TR1 CPL P1.0 SETB TR0 LP3: JNB TF0, LP3 CLR TF0 MV TH0, #0F0H MV TL0, #0CH CPL P1.0 LJMP LP1 END RG 0000H START: LJMP MAIN RG 0100H MAIN: MV IE, #00H MV TMD, #00H LP1: MV TH1, #0F9H MV TL1, #18H SETB TR1 LP2: JNB TF1, LP2 CLR TF1 CPL P1.0 MV TH1, #0F6H MV TL1, #14H LP3: JNB TF1, LP3 CLR TF1 CPL P1.0 LJMP LP1 END五、实验结果(波形图)篇二:单片机实验-定时器计数器应用实验一定时器/计数器应用实验一一、实验目的和要求1、掌握定时器/计数器定时功能的使用方法。

三种调整单片机时钟精度的解决方案

三种调整单片机时钟精度的解决方案

三种调整单片机时钟精度的解决方案
单片机应用中,常常会遇到这种情况,在用单片机制作电子钟或要求根据时钟启控的控制系统时,会突然发现当初校准了的电子时钟的时间竟然变快或是变慢了。

于是,尝试用各种方法来调整它的走时精度,但是最终的效果还是不尽人意,只好每过一段时间手动调整一次。

那么,是否可使时钟走时更精确些呢?现探
讨如下:
一、误差原因分析
1.单片机电子时钟的计时脉冲基准,是由外部晶振的频率经过12分频后提供的,采用内部的定时,计数器来实现计时功能。

所以,外接晶振频率的精确度直接影响电子钟计时的准确性。

2.单片机电子时钟利用内部定时,计数器溢出产生中断(12MHz晶振一般为50ms)再乘以相应的倍率,来实现秒、分、时的转换。

大家都知道,从定时,
计数器产生中断请求到响应中断,需要3_8个机器周期。

定时中断子程序中的数据人栈和重装定时,计数器的初值还需要占用数个机器周期。

此外。

从中断人口转到中断子程序也要占用一定的机器周期。

例如:
从上述程序可以看出,从中断人口到定时/计数器初值的低8位装入需要占用2+2+2=6个机器周期。

所以,在编程时一般会把这6个机器周期加入定时/计数器的初值中。

但是,从定时,计数器溢出中断请求到执行中断需要几个机器周期(3~8个机器周期)。

就很难确定准确值,正是这一原因导致了电子时钟计时
的不准。

二、解决方法
1、采用高精度晶振方案。

定时器不准的解决方案

定时器不准的解决方案

定时器不准的解决方案近年来,随着科技的不断发展,定时器在我们的生活中扮演着越来越重要的角色。

然而,我们经常会遇到定时器不准确的问题。

无论是手机、电脑还是其他电子设备,定时器的误差都存在一定程度的问题。

那么,如何解决定时器不准确的问题呢?本文将为大家介绍一些常见的解决方案。

一、校准时间我们可以尝试校准时间。

对于手机和电脑等设备,系统会自动与网络时间同步,但有时可能由于网络延迟等原因导致时间不准确。

此时,我们可以手动进行时间校准。

具体操作步骤如下:1. 打开设置菜单,找到关于设备或系统设置选项;2. 在时间与日期设置中,选择手动校准时间;3. 根据当前准确的时间进行调整,并保存设置。

二、使用第三方应用除了系统自带的定时器功能外,我们还可以使用一些第三方应用来解决定时器不准确的问题。

这些应用通常具有更准确的时间同步机制,能够提供更精确的定时器功能。

通过在应用商店搜索定时器应用,下载并安装适合自己的应用,就可以解决定时器不准确的问题。

三、更新系统或固件定时器不准确的问题有时也可能是由于设备的系统或固件版本过旧造成的。

在这种情况下,我们可以尝试更新系统或固件来解决问题。

更新系统或固件可以通过以下步骤进行:1. 打开设备的设置菜单,找到关于设备或系统设置选项;2. 在软件更新或固件更新中,查看是否有可用的更新;3. 如果有更新,点击下载并安装;4. 更新完成后,重新设置定时器并测试准确性。

四、避免过度使用有时,定时器不准确的问题可能是由于设备的负荷过重导致的。

如果我们在同一时间使用太多的应用程序或执行太多的任务,设备可能会出现运行缓慢或定时器不准确的情况。

因此,我们应该合理安排使用时间,避免过度使用设备,从而提高定时器的准确性。

五、检查设备硬件如果以上解决方案仍无法解决定时器不准确的问题,那么可能是设备硬件出现了故障。

在这种情况下,我们可以尝试检查设备硬件是否正常工作。

可以通过以下步骤进行:1. 关闭设备并断开电源;2. 检查设备是否有损坏或松动的部件;3. 如果发现问题,可以尝试修复或更换相关部件;4. 重新启动设备,设置定时器并测试准确性。

单片机定时器计数器的应用(附图)

单片机定时器计数器的应用(附图)

定时器的应用一、普通模式和CTC模式1、利用T/C0的普通模式,从PA0引脚输出一个频率为10KHz的方波。

(假设系统时钟为4MHZ)设计思路:10KHz的周期为100us,故需要定时的时间为50 us,即每50 us进入溢出中断,对PA0取反一次。

时钟源取系统时钟的8分频,f=4MHZ/8=500KHZ,T时钟源=2us,所以计数的次数n=50us/2us=25,根据普通模式的特点,计数的初值N=256-25=231。

#include <mega16.h>interrupt [10] void tim0_isr(void){TCNT0=231;PORTA.0=~PORTA.0;}void main(void){DDRA.0=1;PORTA.0=0;TCNT0=231;TCCR0=0B00000010;TIMSK=0X01;SREG.7=1;while(1);}2、利用T/C0的CTC模式,从PA0引脚输出一个频率为10KHz的方波。

(假设系统时钟为4MHZ)设计思路:同上,计数的次数n=50us/2us=25,根据CTC模式计数的特点(从0开始计到OCR0,然后进入匹配中断),OCR0的值N=n=25,且不会被改变,无需重装。

#include <mega16.h>interrupt [20] void tim0_isr(void){PORTA.0=~PORTA.0; //OCR0的值没必要重装}void main(void){DDRA.0=1;PORTA.0=0;OCR0=25;TCCR0=0B00001010;TIMSK=0X02;SREG.7=1;while(1);}3、利用T/C0的CTC模式,从OC0引脚输出一个频率为10KHz的方波。

(假设系统时钟为4MHZ)设计思路:根据CTC的特点和题意,得:f OC0=f clki/o/(2N(1+0CR0))=4M/(2N(1+OCR0))=10K,取N=1,OCR0=199。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机定时器的应用与误差纠正
单片机定时器的应用与误差纠正王暄(陕西师范大学物理学与信息技术学院,陕西西安710062)摘要:对MCS-51单片机定时器的原理与使用中的几个关键问题进行了讨论,给出定时器的使用方法与误差补偿方法,并给出了实现程序。

1前言
定时器是MCS-51单片机非常重要的组成部分,由于其应用与单片机的其他硬件相关,存在着一定的复杂性[1]。

而定时器是单片机应用中解决某类复杂问题的最有为效的方法,应用非常广泛。

随着定时要求的提高,在定时处理过程中所带来的误差需要校正[2],本文就MCS-51单片机的使用方法与误差校正方法进行了讨论,并给出通用算法与程序。

2定时器工作方式与方式设置
MCS-51单片机有两路独立的定时器,每路定时器有4种工作方式(0~3),方式0是13位计数结构,计数器由TH全部8位与TL的低5位构成;方式1是16位计数结构,计数器由TH与TL全部8位共16位组成;方式2是8位计数结构方式,计数器由TL8位组成,与其他方式不同的是,当定时溢出时,硬件自动将TH的值装入TL中,有自动加载功能。

前三种工作方式,两路定时器的设置与使用完全相同,但在工作方式3下,两路定时器有很大差别,只有0路定时器可以工作在方式3下,1路定时器只能工作在方式0~2下,在工作方式3下,0路定时器被拆分成两个独立的8位计数器TL0与TH1,其中0路定时器的各控制位和引脚信号全归TL0使用,因此TH0只能做简单的定时器使用,其控制位占用了1路定时器的控制位,如果0路定时器工作在方式3下,1路定时器由于让出了所属控制位,通常作为串行口波特率发生器[3]。

定时器的工作方式选择主要依靠设置TMOD寄存器的值,其各位定义如下:位序 B7 B6 B5 B4 B3 B2 B1 B0 位符号 GATE C/T M1 M0 GATE C/T M1 M0
其中,B0~B3用来控制0路定时器,B4~B7用来控制1路定时器。

GATE位为门控位,主要确定定时器启动的方式,如果GATE=0,则用TR0
(TR1)位启动/关闭定时器,如果GATE=1,则以外中断请求信号(INT0或
INT1)启动定时器。

C/T位为定时与计数选择位,C/T=0为定时方式,C/T=1为计数方式。

M0、M1为工作方式选择位
M1M0=00方式0M1M0=10方式2
M1M0=01方式1M1M0=11方式3
选择定时器工作方式,应根据上述规定向寄存器TMOD中写入相应数,如设置0路定时器工作在定时方式0下,1路定时器工作在方式1下,则应用下列指令设置:
MOVTMOD,#10H
3定时器的处理方式与计数初值的计算
MCS-51单片机的定时器采用增值计数法,在定时工作方式下,启动定时器后,
每机器周期CPU硬件会自动给相应计数器加1,直至超出对应计数器所能表示的最大值,发生定时溢出,硬件自动将TF0(TF1)置位,用户可以通过查询TF0(TF1)位判断定时是否溢出,如果此时定时中断处于开放状态,将引发相应定时中断,MCS-51响应中断,根据相应中断地址(0路定时中断的中断入口地址为000B,1路为001B)执行中断处理程序。

定时编程有两种基本方式,一种方式为查询方式,在启动定时时关闭相应定时中断,然后循环检测TF0(TF1)进行相应处理;另一种方式为中断方式,启动定时时开放相应定时中断,并将定时溢出处理程序编写为中断处理程序形式通过在相应中断入口地址(000B,001B)放置跳转指令转入定时溢出处理程序。

定时器工作方式选定后,定时溢出时间唯一取决于计数器的初值,如何根据应用需要确定计数器初值,也是定时器应用的一个重要问题。

假定单片机机器周期为K0,所选定的定时方式计数器为n位,所实现的定时时间长度为T,则有:
(2n-x)K0=T(1)
其中x为计数器的初值,根据式1可以求出初值x为:
x=2n-(T/K0)(2)
4定时器的编程步聚和各步聚的通用程序
定时器应用编程主要分为以下几个步聚。

4.1步骤1根据定时要求求计数初值x
首先根据单片机时钟频率f确定单片机机器周期k0,即:
k0=12/f(3)
在实际应用中,单片机时钟频率f一般为6mHz或12mHz,所以单片机机器周期k0=2μs或1μs,然后根据选定的工作方式确定计数器位数n,将所得k0与n 代入式2,求出计数初值x,并根据所选择的计数方式将x的值分入TH0(TH1)与TL0(TL1)。

4.2步骤2编写初始化程序
初始化程序与定时编程方式有关,中断方式初始化程序如下(以0路定时器为例):
movTMOD,#n(规定定时工作方式)
movTH0,#n1(设置计数器低位)。

相关文档
最新文档