找回密码
 注册
关于网站域名变更的通知
查看: 470|回复: 1
打印 上一主题 下一主题

PIC单片机的定时器精准计时的计算

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-3-4 09:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
PIC单片机的定时器精准计时的计算# ~( X; O! `* Y, b
  e8 l& k+ Q8 _' H* x, p0 C' k
! Y  v+ T4 e. A, n; l  D5 w

在此用了16C711单片机的TMR0做定时中断,希望实现精准计时,在程序中,TMR0用了晶振的32分频,初值#0FCH,因此POPBEAR兄弟计算出每个定时中断的计时时间为(256-X)*32*4/32768=0.015625秒。注意,问题就在这里!实际上这个时间是TMR0的初值被置入后两个指令周期后(见PIC单片机定时器/计数器资料)到下一次中断发生时的时间。如果要用到定时器的精准定时,必须理解这一概念!

如采用32768Hz的晶振,每个指令周期为122us,在中断处理程序中,到TMR0的初值被置入,共有7条指令,加上TMR0的初值被置入后两个指令周期,如果中断处理程序不直接放在0004H地址而采用GOTO指令的两个周期,一共为11个指令周期。也就是说,每个定时中断发生的间隔为0.015625秒+11*122us。程序中64次中断为1秒,那么1秒误差为64*11*122us=85.9375ms,1分钟的误差为5.156s。

那么怎样得到精准计时呢?这就要在对定时器的初值赋值上和中断处理程序中做文章。

关于如何产生一个大致比较精准的时间中断

使用TMR0的时候,如果仅TMR0一个中断,显然,使用 TMR0=TMR0+OFFSET的方式就能够产生一个比较精准的时间中断。特别是不用考虑从中断到TMR0的赋值中间间隔了多少时间的延时。

但是使用TMR1时,就产生了问题,因为TMR1是16位的,所以TMR1L=TMR1L+OFFSET_L时,就得考虑TMR1H得进位问题。

使用C内欠套汇编如下(如用赋值而不是增量方式,C中就得中断到赋值得时间了),且TMR1_Revalue_H得值不会为0xFF。

[cpp] view plaincopyprint? #asm

movf _TMR1_Revalue_L & 0x7F,W

addwf _TMR1L,F

btfss _STATUS,0

movf _TMR1_Revalue_H & 0x7F,W

btfsc _STATUS,0

incf _TMR1_Revalue_H & 0x7F,W

addwf _TMR1H

#endasm

方法两种

1)利用CCP模块在Compare模式下特殊事件触发功能实现精确的TMR1定时中断。

2)普通模式下在重装定时初值前TMR1暂停计数,设定完毕后再开启。注意补偿中间置初值的延时时间。

; r) F3 B( m5 n

该用户从未签到

2#
发表于 2019-3-4 13:00 | 只看该作者
看看,谢谢楼主分享8 o8 s0 M- I# D0 x0 @; x
# z8 v  l$ y! F% \/ d" t
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-10 13:18 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表