Due to the U.S. Thanksgiving holiday, please expect delayed responses during the week of 11/22.

This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430: RTC_AとTIMER_Aの時間差

Other Parts Discussed in Thread: MSP430F5528

MSP430F5528で、RTC_Aをカレンダーモードで使用し、TIMER_A0を使用し256HzでADC12_Aを動かすようにして約15時間動かしたところ、

 RTC_Aの経過時間 = 54771秒(15.214時間)

 TIMER_A0連動ADC12_A計測回数からの逆算時間=54720秒(15.2時間)

と51秒ほど差がありました。

RTC_AとTIMER_A0はどちらともACLK(XT1 32KHz)を選択しています。割込みはRTC_Aは1分毎のタイムイベント割り込みを、TIMER_A0は割り込み無効です(ADCのサンプリング完了割り込みで回数をカウント)。

クロックソースが同じでも、カウンタレジスタの処理等の違いから、RTC_AとTIMER_A0で長時間動作時は多少の誤差は発生してしまうのでしょうか?

RTC_AとTIMER_A、それとADC12_Aの設定は以下の通りです。

---TIMER_A---

//Set up Timer A0 CCR1
initCompParam.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_1;
initCompParam.compareInterruptEnable =
TIMER_A_CAPTURECOMPARE_INTERRUPT_DISABLE;
initCompParam.compareOutputMode = TIMER_A_OUTPUTMODE_RESET_SET;
initCompParam.compareValue = 1;
Timer_A_initCompareMode(TIMER_A0_BASE, &initCompParam);

//Start timer A0
initUpParam.clockSource = TIMER_A_CLOCKSOURCE_ACLK;
initUpParam.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_1;
initUpParam.timerPeriod = 127;
initUpParam.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;
initUpParam.captureCompareInterruptEnable_CCR0_CCIE =
TIMER_A_CCIE_CCR0_INTERRUPT_DISABLE;
initUpParam.timerClear = TIMER_A_DO_CLEAR;
initUpParam.startTimer = false;
Timer_A_initUpMode(TIMER_A0_BASE, &initUpParam);

~~~他処理の後~~~

TA0CCR0 =255;

Timer_A_startCounter(TIMER_A0_BASE, TIMER_A_UP_MODE);

---------------------------------------------

---RTC_A---

set_CalendarTime.Seconds = 0x00;
set_CalendarTime.Minutes = 0x30;
set_CalendarTime.Hours = 0x09;
set_CalendarTime.DayOfWeek = 0x00; //曜日は使用しない
set_CalendarTime.DayOfMonth = 0x11;
set_CalendarTime.Month = 0x01;
set_CalendarTime.Year = 0x2017;

RTC_A_initCalendar(RTC_A_BASE,
&set_CalendarTime,
RTC_A_FORMAT_BCD);

//アラームは全てOFF
param.minutesAlarm = RTC_A_ALARMCONDITION_OFF;
param.hoursAlarm = RTC_A_ALARMCONDITION_OFF;
param.dayOfWeekAlarm = RTC_A_ALARMCONDITION_OFF;
param.dayOfMonthAlarm = RTC_A_ALARMCONDITION_OFF;
RTC_A_configureCalendarAlarm(RTC_A_BASE, &param);

//タイムイベントを分変化時に設定
RTC_A_setCalendarEvent(RTC_A_BASE,
RTC_A_CALENDAREVENT_MINUTECHANGE);

//RTCHOLD=0でRTC動作開始
RTC_A_startClock(RTC_A_BASE);

---------------------------------------------

---ADC12_A---

ADC12_A_init(ADC12_A_BASE,
ADC12_A_SAMPLEHOLDSOURCE_1,
ADC12_A_CLOCKSOURCE_ADC12OSC,
ADC12_A_CLOCKDIVIDER_1);

ADC12_A_enable(ADC12_A_BASE);

ADC12_A_setupSamplingTimer(ADC12_A_BASE,
ADC12_A_CYCLEHOLD_8_CYCLES,
ADC12_A_CYCLEHOLD_4_CYCLES,
ADC12_A_MULTIPLESAMPLESDISABLE);

param0.memoryBufferControlIndex = ADC12_A_MEMORY_0;
param0.inputSourceSelect = ADC12_A_INPUT_A0;
param0.positiveRefVoltageSourceSelect = ADC12_A_VREFPOS_EXT;
param0.negativeRefVoltageSourceSelect = ADC12_A_VREFNEG_EXT;
param0.endOfSequence = ADC12_A_ENDOFSEQUENCE;
ADC12_A_configureMemory(ADC12_A_BASE,&param0);

param1.memoryBufferControlIndex = ADC12_A_MEMORY_1;
param1.inputSourceSelect = ADC12_A_INPUT_A1;
param1.positiveRefVoltageSourceSelect = ADC12_A_VREFPOS_EXT;
param1.negativeRefVoltageSourceSelect = ADC12_A_VREFNEG_EXT;
param1.endOfSequence = ADC12_A_ENDOFSEQUENCE;
ADC12_A_configureMemory(ADC12_A_BASE,&param1);

ADC12_A_clearInterrupt(ADC12_A_BASE, ADC12IFG1);
ADC12_A_enableInterrupt(ADC12_A_BASE, ADC12IE1);

ADC12_A_startConversion(ADC12_A_BASE,
ADC12_A_MEMORY_0,
ADC12_A_REPEATED_SEQOFCHANNELS);

---------------------------------------------

  • RTCとTimerAのクロックソースが同じ32768Hzならば、同じカウントで進みます。
    ただし、RTCには微小の進み/遅れを補正する機能が途中に有ります。

    RTCは実時間管理に使用し、Timerは経過時間管理に使うように、用途が異なります。

    ADCデータにRTCの時刻をタイムスタンプするような使用目的であれば、
    例えば、2分おきとか15分間隔でADC測定するようなケースであれば、
    RTCの分タイムイべントをカウントして、ADCを起動することで実現可能です。
  • 追加で質問させてください。
    ADCは128Hzや256Hz(約7.8ms, 3.9ms)で常時サンプリングしなくてはならず、RTCで記録時間のタイムスタンプを、TimerはADCのサンプリングタイミング制御に使用しています。
    RTCとTimerで、同じACLK(XT1)ソースでも差が出ることはしょうがないとして、その差を机上計算する方法はありませんでしょうか?MSP430F5528のデータシートを見ても、RTCで補正される時間の値や、Timerの誤差のようなものはわかりませんでした。
  • 先にお話ししましたように、同じクロックソースですから時間差は発生しません。
    RTCの補正は、時計用途でppm単位を測定器を使用して行うものです。 通常は影響しないはずです。
    もう一件のADCのご質問を見ますと、RTCの分イベントとADC起動の関係から時間誤差が累積している可能性があります。
    制御方式に関する個別のお話になりますので、CSCへお問い合わせのほどお願いいたします。