嵌入式学习小组
直播中

刘艳

7年用户 2218经验值
私信 关注

M261的定时器,偏差很大,600秒差不多10秒的误差如何解决?

M261的定时器,偏差很大,600秒差不多10秒的误差,咋办?
用了tiMER0作为定时器,采用内部高速时钟作为时钟源,系统时钟设置为4MHz.


void TMR0_IRQHandler(void)
{

          TMR0_COUNT++;
           
    TIMER_ClearIntFlag(TIMER0);
}


void TIMER0_INIT(void)
{
       /* setting take effect */

    TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, 1);
    CLK_SysTickDelay(50);

    /* Enable timer wake up system */
    TIMER_EnableWakeup(TIMER0);
    CLK_SysTickDelay(50);

    /* Enable Timer0 interrupt */
    TIMER_EnableInt(TIMER0);
    CLK_SysTickDelay(50);

    NVIC_EnableIRQ(TMR0_IRQn);

    /* Start Timer0 counting */
    TIMER_Start(TIMER0);
    CLK_SysTickDelay(50);

}



回帖(1)

无人岛

2024-1-13 16:09:29
nbsp; TIMER_SET_PRESCALE_VALUE(TIMER0, 23);  //设置预分频器,将时钟源分频为24    TIMER_SET_CMP_VALUE(TIMER0, 62500);  //设置比较器值,产生1秒定时器       NVIC_EnableIRQ(TMR0_IRQn);       TIMER_EnableInt(TIMER0);       TIMER_Start(TIMER0);}      int main(){       /* setting UART0_CLK clock source and UART0 clock divider */    CLK_EnableModuleClock(UART0_MODULE);       CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART0_S_HIRC, CLK_CLKDIV_UART(1));       UART_Open(UART0, 115200);       TIMER0_INIT();       while(1){              printf("TMR0_COUNT = %dn", TMR0_COUNT);              CLK_SysTickDelay(1000);  //打印一次后延时1秒       }       return 0;}   

你可以通过两个途径来消除误差:

1. 误差来自定时器的时钟源精度,使用外部时钟源代替内部高速时钟,可以提高定时器准确性。若使用外部时钟源后依然存在误差,那么使用精度更高的时钟源可能能降低误差。

2. 误差来自预分频器的设置。在设置预分频器时,频率必须精确地被分频。预分频器分频越大,频率的错误率越高。您可以通过尝试不同的预分频器值,以获得最小误差,例如以2或3的倍数进行预分频会更好。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分