单片机定时器中断时间误差的解决方案

来源:元器件交易网 作者:—— 时间:2012-03-12 15:09

  3.2 定时器新计数初值

  若定时器为计数方式,操作方式为1,则计数器初值X0=216-t0×fosc/12。式中fosc为振荡器的振荡频率。t0为需要定时的时间,也为中断的间隔时间。X0为定时器原计数初值。在对定时器溢出中断与CPU响应中断时间误差进行补偿时,定时器的新计数初值X1为:

  X1=216-t3× fosc/12

  t3=t0+t1+t2

  式中t0为中断间隔时间。t1为定时器停止计数时间,该时间为定时器停止计数到重新启动计数之间所有程序指令周期数的总和。t2为定时器溢出中断后,重新从OOH开始直至计数器停止时计的值。在误差补偿中,若将定时器计数初值X1取代X0,则可使定时器下次的溢出中断与CPU响应中断实现同步。

  3.3 实例

  要求补偿定时器每1ms产生一次溢出中断时的中断响应延迟的误差。若振荡器振荡频率fosc=12MHZ,定时器工作在计数方式,工作模式为1,则补偿中断响应时间误差时的定时器新初值X1为:

  X1=216-t3× fosc/12=216-(t0+ t1)- t2=216-(1000+ 13)- t2

  误差补偿程序为:

  ……

  0 CLR EA ;关CPU中断

  1 CLR TRi ;停止定时器计数

  2 MOV R0, #OOH ;R0清零

  3 MOV R0, #LOW(216) ;定时器最大计数值的低8位送R0

  4 MOV A, R0

  5 SUBB A, #LOW(1000+13) ;216的低8位减去( t0+ t1)的低8位送累加器A

  6 SUBB A, TLi ;216的低8位减去( t0+ t1+ t2)的低8位送TLi

  7 MOV TLi, A

  8 MOV R0, #OOH ;R0清零

  9 MOV R0, #HIGH(216) ;216 的高8位送R0

  10 MOV A, R0

  11 SUBB A, #HIGH(1000+13) ;216的高8位减去( t0+ t1)的高8位送A

  12 SUBB A, THi ;216的高8位减去( t0+ t1 +t2)的高8位送A

  13 MOV THi, A

  14 SETB TRi ;重新启动定时器

  ……

  在上式和上段程序中,由于fosc=12MHZ,中断间隔时间为1ms,因此t0的机器周期数为1000。由于第1条指令到第14条指令的指令周期的机器周期数之和为13,因此,t1为13个机器周期。CPU虽在执行第一条指令CLR TRi后停止定时器计数,但在TLi、THi中分别保存了t2的低位数据和高位数据。

  4 结束语

  由于本文介绍的误差补偿方法能对定时器溢出中断与CPU响应中断的非固定性时间误差进行有效补偿,因此,该方法对于提高高频控制系统实时控制精度和扩大单片机应用范围都有较高的实用价值。

资讯排行榜

  • 每日排行
  • 每周排行
  • 每月排行

华强资讯微信号

关注方法:
· 使用微信扫一扫二维码
· 搜索微信号:华强微电子