找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 247|回复: 12
打印 上一主题 下一主题
收起左侧

关于单片机定时器定时不准确的问题

[复制链接]
跳转到指定楼层
楼主
请教一下大家,最近在用STC8G1K08A单片机做一个小东西,使用到了定时器0和定时器1,参照官方设定的1毫秒,然后中断里重复1000次,作为1秒的精确延时,但是实际发现误差很大,不知道是我设置的问题还是?之前用STC15W104和STC15F104都没有问题,延时很精确(相比较而言)

这是中断里面的程序:

                if(timer_1_ms < 1000)timer_1_ms++;
                        else
                        {
                                 timer_1_ms = 0;
                                if(timer_s > 0)timer_s--;
                                        else
                                        {
                                                timer_s = 0;
                                                status = 0;//若时间到,那就在LED熄灭的时候进入到休眠模式
                                        }
                        }



这是官方的设置



软件的版本是V6.94E,目前最新的版本。






分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:491577 发表于 2024-5-15 00:19 | 只看该作者
误差很大,具体是多大?STC单片机主频误差0.5%,所以误差0.5%以内是正常的,1小时误差0.5%=18S,24小时误差=18*24=432秒。只要在这个范围内是正常的。
回复

使用道具 举报

板凳
ID:517951 发表于 2024-5-15 07:28 | 只看该作者
单片机的晶振是相对精确而已, 要提高精度就要用realtime IC: DS12C887 等 ; 要求更高就用天线接GPS的授时信号.
回复

使用道具 举报

地板
ID:1109793 发表于 2024-5-15 08:00 | 只看该作者
而且每次刷机设置的都不太一样,要精确定时还是得外部晶振
回复

使用道具 举报

5#
ID:403593 发表于 2024-5-15 08:50 | 只看该作者
hhh402 发表于 2024-5-15 00:19
误差很大,具体是多大?STC单片机主频误差0.5%,所以误差0.5%以内是正常的,1小时误差0.5%=18S,24小时误差 ...

可不止,十秒的误差都有两三秒了,你说的那些误差都在可接受范围内,我这里的误差根本没法用啊。。。
回复

使用道具 举报

6#
ID:403593 发表于 2024-5-15 10:38 | 只看该作者
rayin 发表于 2024-5-15 07:28
单片机的晶振是相对精确而已, 要提高精度就要用realtime IC: DS12C887 等 ; 要求更高就用天线接GPS的授时信 ...

我不需要特别高的精度,电路很简单,我只需要延时十分钟,可接受误差在一分钟以内就好。
回复

使用道具 举报

7#
ID:213173 发表于 2024-5-15 10:49 | 只看该作者
这一生只为你 发表于 2024-5-15 08:50
可不止,十秒的误差都有两三秒了,你说的那些误差都在可接受范围内,我这里的误差根本没法用啊。。。

单靠程序片段看不出毛病在哪
回复

使用道具 举报

8#
ID:23640 发表于 2024-5-15 11:44 | 只看该作者
这一生只为你 发表于 2024-5-15 08:50
可不止,十秒的误差都有两三秒了,你说的那些误差都在可接受范围内,我这里的误差根本没法用啊。。。

这么大的误差会不会是初始化配置就有问题?可以用示波器看下定时1MS实际测试是多少?
回复

使用道具 举报

9#
ID:57657 发表于 2024-5-15 12:15 | 只看该作者
自动重载初值,不要用手动重载,溢出了会自己装进去,中断里不要赋值TH0,TL0寄存器。
加误差补偿处理且使用外部晶振,1个月误差不到1分钟的都有。
回复

使用道具 举报

10#
ID:1110945 发表于 2024-5-15 19:43 | 只看该作者
void Timer0_Isr(void) interrupt 1
{
}

void Timer0_Init(void)                //50毫秒@11.0592MHz
{
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0x00;                                //设置定时初始值
        TH0 = 0x4C;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}

建议用12T模式,50毫秒@11.0592MHz,每秒只进中断20次,频率要设置成11.0592MHz
回复

使用道具 举报

11#
ID:621776 发表于 2024-5-15 22:17 | 只看该作者
直接做软件定时器吧,用逻辑分析仪抓一抓时间,或者改改值.
回复

使用道具 举报

12#
ID:57657 发表于 2024-5-15 22:44 | 只看该作者
T0m 发表于 2024-5-15 22:17
直接做软件定时器吧,用逻辑分析仪抓一抓时间,或者改改值.

逻辑分析仪里面通常有个晶振,准确度与该晶振有关。
回复

使用道具 举报

13#
ID:491577 发表于 2024-5-17 20:40 | 只看该作者
如果误差超过0.5%就是你的程序有问题,把你的程序贴出来,包括定时器设置函数,定时器中断函数,单片机主频。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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