标题: 单片机定时器时间误差修正问题求助! [打印本页]

作者: w1179benp    时间: 2020-4-11 09:28
标题: 单片机定时器时间误差修正问题求助!
在应用一个定时器做时间基准是,想修正晶振、程序产生的误差,是否可以采用在进入中断程序后重装初始值前加个delay_us(  )延时来呢?
如11.0592的晶振,
void timer0_isr() interrupt 1
{
delay_us(  );
TH0=(65536-43520)/256;   // 46080慢2秒/分
TL0=(65536-43520)%256; // 43520快0.5秒/分

countTime++;            
}

作者: Y_G_G    时间: 2020-4-11 11:56
用12MHZ或者24MHZ的晶振它不香吗?
如果不是要用到精确的波特率,直接上12MHZ的,一个周期1uS多好计算呀
作者: yzwzfyz    时间: 2020-4-11 11:59
这个方法可行,但不靠谱。
理由:
1、如果有更高级的中断发生于delay_us(  )期间,则时间延时就错了。
2、delay_us(  )会占用中断服务时间,使得其它低级中断及主程序受到延迟。
3、T0的变速率(CLK)很快,而delay_us(  )相对“慢”。即只能用delay_us(  )做“粗调”。当然,你可以改变T0的复位值,做细调。
作者: yzwzfyz    时间: 2020-4-11 12:00
更好的方法是:
不说了,你的思路已对路了,相信你自己能想到。
作者: wulin    时间: 2020-4-11 16:25
加一个修正系数
char x;//x=+127~-128

TH0=(65536-43520+x)/256;   // 46080慢2秒/分
TL0=(65536-43520+x)%256; // 43520快0.5秒/分
作者: w1179benp    时间: 2020-4-11 18:02
Y_G_G 发表于 2020-4-11 11:56
用12MHZ或者24MHZ的晶振它不香吗?
如果不是要用到精确的波特率,直接上12MHZ的,一个周期1uS多好计算呀

12M的也同样会存在误差,我问的是如何消除或减至最小的问题
作者: w1179benp    时间: 2020-4-11 18:04
yzwzfyz 发表于 2020-4-11 11:59
这个方法可行,但不靠谱。
理由:
1、如果有更高级的中断发生于delay_us(  )期间,则时间延时就错了。

仅就单个简单程序使用。应该不存在其他问题
作者: w1179benp    时间: 2020-4-11 18:06
我以为括号里应该是256的整数倍,x可以在+127~-128吗?
作者: wulin    时间: 2020-4-11 21:06
w1179benp 发表于 2020-4-11 18:06
我以为括号里应该是256的整数倍,x可以在+127~-128吗?

TH0=(65536-43520)/256;
TL0=(65536-43520)%256;

65536-43520=22016=
作者: wulin    时间: 2020-4-11 21:13
w1179benp 发表于 2020-4-11 18:06
我以为括号里应该是256的整数倍,x可以在+127~-128吗?

TH0=(65536-43520)/256;
TL0=(65536-43520)%256;
65536-43520=22016=0x5600
0x5600的高8位赋值TH0=0x56
0x5600的低8位赋值TL0=0x00
不存在括号里应该是256的整数倍的问题




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1