找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2690|回复: 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++;            
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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 | 只看该作者
更好的方法是:
不说了,你的思路已对路了,相信你自己能想到。
回复

使用道具 举报

5#
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秒/分
回复

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

8#
ID:149451 发表于 2020-4-11 18:06 | 只看该作者
我以为括号里应该是256的整数倍,x可以在+127~-128吗?
回复

使用道具 举报

9#
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=
回复

使用道具 举报

10#
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 单片机教程网

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