找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2097|回复: 9
收起左侧

单片机定时器时间误差修正问题求助!

[复制链接]
ID:149451 发表于 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++;            
}
回复

使用道具 举报

ID:401564 发表于 2020-4-11 11:56 | 显示全部楼层
用12MHZ或者24MHZ的晶振它不香吗?
如果不是要用到精确的波特率,直接上12MHZ的,一个周期1uS多好计算呀
回复

使用道具 举报

ID:123289 发表于 2020-4-11 11:59 | 显示全部楼层
这个方法可行,但不靠谱。
理由:
1、如果有更高级的中断发生于delay_us(  )期间,则时间延时就错了。
2、delay_us(  )会占用中断服务时间,使得其它低级中断及主程序受到延迟。
3、T0的变速率(CLK)很快,而delay_us(  )相对“慢”。即只能用delay_us(  )做“粗调”。当然,你可以改变T0的复位值,做细调。
回复

使用道具 举报

ID:123289 发表于 2020-4-11 12:00 | 显示全部楼层
更好的方法是:
不说了,你的思路已对路了,相信你自己能想到。
回复

使用道具 举报

ID:213173 发表于 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秒/分
回复

使用道具 举报

ID:149451 发表于 2020-4-11 18:02 | 显示全部楼层
Y_G_G 发表于 2020-4-11 11:56
用12MHZ或者24MHZ的晶振它不香吗?
如果不是要用到精确的波特率,直接上12MHZ的,一个周期1uS多好计算呀

12M的也同样会存在误差,我问的是如何消除或减至最小的问题
回复

使用道具 举报

ID:149451 发表于 2020-4-11 18:04 | 显示全部楼层
yzwzfyz 发表于 2020-4-11 11:59
这个方法可行,但不靠谱。
理由:
1、如果有更高级的中断发生于delay_us(  )期间,则时间延时就错了。

仅就单个简单程序使用。应该不存在其他问题
回复

使用道具 举报

ID:149451 发表于 2020-4-11 18:06 | 显示全部楼层
我以为括号里应该是256的整数倍,x可以在+127~-128吗?
回复

使用道具 举报

ID:213173 发表于 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=
回复

使用道具 举报

ID:213173 发表于 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的整数倍的问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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