发新帖我要提问
12
返回列表
打印
[STC单片机]

我这个定时器为什么误差这么大?一分钟误差有20秒!

[复制链接]
楼主: xichandoujigu
手机看帖
扫描二维码
随时随地手机跟帖
21
zyj9490| | 2018-1-5 16:01 | 只看该作者 回帖奖励 |倒序浏览
这种定时方法原理上不可行,还是用带有RTC的MCU吧,通过软件再设定定时肯定有误差。

使用特权

评论回复
22
masmin| | 2018-1-5 22:04 | 只看该作者
中断函数里没有这样赋值的。

使用特权

评论回复
23
zyj9490| | 2018-1-7 12:39 | 只看该作者
这种定时电路,还不如一个晶振电路输出一个秒脉冲加到外中断脚,中断里设一个变量不断累加,再通过主函数处理显示这个变量,以上产生误差的原因是计时有中间停顿。

使用特权

评论回复
24
zqx1000| | 2018-4-10 21:23 | 只看该作者
kankan

使用特权

评论回复
25
Vansm| | 2018-10-24 18:06 | 只看该作者
xichandoujigu 发表于 2018-1-3 22:12
最终确定内部晶振误差太大,用外部晶振就行了。

做这么多年原厂AE  没见过偏太多的内部RC

使用特权

评论回复
26
rankey| | 2018-10-31 14:17 | 只看该作者
//      Timer1 Interrupt Handler by 4ms interval
//     internal RC OSC 8MHz  4ms ;     external OSC  4.194304MHz 3.9998ms
//------------------------------------------------------------------------------
  void T1_Int_Handler(void)   interrupt 14
{
         WDTCR= 0x20;        // Clear WDT Counter
         count_1s++;
          if(r4mS_STOP)   r4mS_STOP--;  
        T1_4ms++;
        if(T1_4ms>=125)  // 500ms定时值到
           {
             T1_4ms=0;
             T1_500ms++;
             if(T1_500ms>=2)  //  1s定时值到
              {
                  T1_500ms=0;
                   T1_1s++;
                if(T1_1s>=60)  // 1minute定时值到
                   {
                     T1_1s=0;
                      T1_minute++;
                         if(T1_minute>=60)  // 1hour定时值到
                       {
                             T1_minute=0;
                            T1_hour++;
                             if(T1_hour>=24) T1_hour=0;
                          }
                     }   
               }
            }
   试试这种中断干服务函数。
  我总觉得,对zhongduan_CNT值,在while(1)函数体里处理,总觉得不够好。是产生误差的根本原因。

使用特权

评论回复
评论
brew9 2018-11-5 11:08 回复TA
的确是有这个问题。比如用定时器产生连续调制PWM(如呼吸灯),如果在main中修改PWM值,会出现丢桢现象,造成led灯随机性闪烁。如果都写在中断里,就不会出现这种问题。 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则