TI中文支持网
TI专业的中文技术问题搜集分享网站

MSP430FR6972: 怎样用定时器获得一个准确的时间间隔,比如1分钟。

Part Number:MSP430FR6972

hello,all.

我想要用时定时器的时器去获得一个1分钟的时间间隔。我是这样做的:定时器定时60s,每隔60s串口打印输出一次信息。但是,打印信息的时间间隔总是比一分钟少几毫秒。我用示波器看了晶振的频率,频率很稳定,排除了晶振的问题。我用一个开发板串口定时向另一个开发板的串口发送信息,定时时间很准,几乎没有误差,排除了串口软件和串口的问题。现在我找不到其他原因了,希望能得到各位的指点。下边是我的程序。

/***I hope to get a 1 minute interval through the timer of MSP430FR6972. Below is my program.
***However, the time interval I get is always a few milliseconds less than the result I expected .
***How can I get a precise time interval?***hoping to get your help 。
***Thank you very much.
***/

void THIS_UCS_init(void)
{
GPIO_setAsPeripheralModuleFunctionInputPin(
GPIO_PORT_PJ,
GPIO_PIN4 + GPIO_PIN5,
GPIO_PRIMARY_MODULE_FUNCTION
);

//Set DCO frequency to 1 MHz
CS_setDCOFreq(CS_DCORSEL_0,CS_DCOFSEL_0);
//Set external clock frequency to 32.768 KHz
CS_setExternalClockSource(32768,0);
//Set ACLK=LFXT
CS_initClockSignal(CS_ACLK,CS_LFXTCLK_SELECT,CS_CLOCK_DIVIDER_1);
//Set SMCLK = DCO with frequency divider of 1
CS_initClockSignal(CS_SMCLK,CS_DCOCLK_SELECT,CS_CLOCK_DIVIDER_1);
//Set MCLK = DCO with frequency divider of 1
CS_initClockSignal(CS_MCLK,CS_DCOCLK_SELECT,CS_CLOCK_DIVIDER_1);
//Start XT1 with no time out
CS_turnOnLFXT(CS_LFXT_DRIVE_3);
}

void TIMER_B0_init()
{
Timer_B_initContinuousModeParam initContParam = {0};
//Start timer in continuous mode sourced by ACLK
initContParam.clockSource = TIMER_B_CLOCKSOURCE_ACLK;
initContParam.clockSourceDivider = TIMER_B_CLOCKSOURCE_DIVIDER_64;
initContParam.timerInterruptEnable_TBIE = TIMER_B_TBIE_INTERRUPT_DISABLE;
initContParam.timerClear = TIMER_B_DO_CLEAR;
initContParam.startTimer = true;
Timer_B_initContinuousMode(TIMER_B0_BASE, &initContParam);

TIMER_B0_RN_start(TIMER_B_CAPTURECOMPARE_REGISTER_0, 10000);
Timer_B_startCounter( TIMER_B0_BASE, TIMER_B_CONTINUOUS_MODE);
}

void TIMER_B0_RN_reload(uint16_t captureCompareRegister, uint16_t timeout)
{
Timer_B_clearCaptureCompareInterrupt(TIMER_B0_BASE, captureCompareRegister);
uint16_t compVal = Timer_B_getCounterValue(TIMER_B0_BASE) + (uint16_t)(512/1000.0*timeout);
Timer_B_setCompareValue(TIMER_B0_BASE, captureCompareRegister, compVal);
}

#pragma vector=TIMER0_B0_VECTOR
__interrupt void TIMER0_B0_ISR (void)
{
TIMER_B0_RN_reload(MAIN_TIMER_REGISTER, systemstate.upperiod*60000);
printf("test2");
}

Susan Yang:

您使用的是外部晶振?

3ms/60sec=.000050 即 50ppm,这是 32kHz 晶体精度的正确数量级。

可能存在一些舍入误差,因为 32kHz 不能精确计算 1ms。

,

Pean Zhu:

是的,我用的是外部晶振。可是如果由外部晶振误差造成的话,这是个定时的时间应该是围绕着某个中心值波动,有的时候+3ms,有的时候-3ms,而不是一直都是-3ms。

,

Susan Yang:

目前没有其他想法,关于32K晶体,请查看下面的应用报告

https://www.ti.com.cn/cn/lit/an/zhca445b/zhca445b.pdf 

,

Pean Zhu:

谢谢。我已经收到你给我的资料,我会仔细阅读它。

赞(0)
未经允许不得转载:TI中文支持网 » MSP430FR6972: 怎样用定时器获得一个准确的时间间隔,比如1分钟。
分享到: 更多 (0)