标题: 关于单片机定时器定时不准确的问题 [打印本页]

作者: 这一生只为你    时间: 2024-5-14 21:50
标题: 关于单片机定时器定时不准确的问题
请教一下大家,最近在用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,目前最新的版本。







作者: hhh402    时间: 2024-5-15 00:19
误差很大,具体是多大?STC单片机主频误差0.5%,所以误差0.5%以内是正常的,1小时误差0.5%=18S,24小时误差=18*24=432秒。只要在这个范围内是正常的。
作者: rayin    时间: 2024-5-15 07:28
单片机的晶振是相对精确而已, 要提高精度就要用realtime IC: DS12C887 等 ; 要求更高就用天线接GPS的授时信号.
作者: xiaobendan001    时间: 2024-5-15 08:00
而且每次刷机设置的都不太一样,要精确定时还是得外部晶振
作者: 这一生只为你    时间: 2024-5-15 08:50
hhh402 发表于 2024-5-15 00:19
误差很大,具体是多大?STC单片机主频误差0.5%,所以误差0.5%以内是正常的,1小时误差0.5%=18S,24小时误差 ...

可不止,十秒的误差都有两三秒了,你说的那些误差都在可接受范围内,我这里的误差根本没法用啊。。。
作者: 这一生只为你    时间: 2024-5-15 10:38
rayin 发表于 2024-5-15 07:28
单片机的晶振是相对精确而已, 要提高精度就要用realtime IC: DS12C887 等 ; 要求更高就用天线接GPS的授时信 ...

我不需要特别高的精度,电路很简单,我只需要延时十分钟,可接受误差在一分钟以内就好。
作者: wulin    时间: 2024-5-15 10:49
这一生只为你 发表于 2024-5-15 08:50
可不止,十秒的误差都有两三秒了,你说的那些误差都在可接受范围内,我这里的误差根本没法用啊。。。

单靠程序片段看不出毛病在哪
作者: yaosongjin    时间: 2024-5-15 11:44
这一生只为你 发表于 2024-5-15 08:50
可不止,十秒的误差都有两三秒了,你说的那些误差都在可接受范围内,我这里的误差根本没法用啊。。。

这么大的误差会不会是初始化配置就有问题?可以用示波器看下定时1MS实际测试是多少?
作者: npn    时间: 2024-5-15 12:15
自动重载初值,不要用手动重载,溢出了会自己装进去,中断里不要赋值TH0,TL0寄存器。
加误差补偿处理且使用外部晶振,1个月误差不到1分钟的都有。
作者: 明日之星8    时间: 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
作者: T0m    时间: 2024-5-15 22:17
直接做软件定时器吧,用逻辑分析仪抓一抓时间,或者改改值.

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

逻辑分析仪里面通常有个晶振,准确度与该晶振有关。
作者: hhh402    时间: 2024-5-17 20:40
如果误差超过0.5%就是你的程序有问题,把你的程序贴出来,包括定时器设置函数,定时器中断函数,单片机主频。




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