できるか? RTCのズレの補正
前回RTCのベースクロックを測定する方法で、RTCOUT端子を使ってみた。
前回の記事はこちらから。
無理無理測定した結果は前回の記事にも書いてあるとおり、
MINIMA 1台めは、約63.88Hz
MINIMA 2台めは、約64.01Hz
WiFiは、約64.78Hz
ということで、これらの数値を補正できるかやってみようと思う。
まずはRA4M1マイコンのマニュアル648ページ「24.2.20 周波数レジスタ(RFRH/RFRL)」の章を見てもらいたい。
おそらくこの"RFRH"と"RFRL"のレジスタを使えば補正できると思われる。
私キャッスルが保有しているArduino UNO R4は3台あるのだが、RFRHとRFRLの中身を見てみたところ、全てデフォルト値であるRFRHは0x00・RFRLは0xffであった。
このRFRLレジスタに入れる数値の計算方法は、マニュアルの同じページに書かれていて、
RFC[15:0] = (LOCO クロック周波数)÷ 128 - 1
とのこと。
MINIMA 1台めのLOCOの周波数は、63.88Hz × 512 = 32,706.56Hzだと推定される。
この数値を上の計算値に代入すると、32,706.56 ÷ 128 - 1 = 254.52になる。
あれれ、254.52だと四捨五入したら255になって補正前と同じになるし、切り捨てて254にしたら逆方向にズレて行くのでは・・・。
とにかくやってみたよう。
プログラムはこのように書いてみた。
#include "RTC.h" void setup() { Serial.begin(9600); while (!Serial); //シリアルモニターを開くまで待ち pinMode(13, OUTPUT); RTC.begin(); //RTC起動 //日付は適当 RTCTime startTime(30, Month::JUNE, 2023, 13, 37, 00, DayOfWeek::WEDNESDAY, SaveLight::SAVING_TIME_INACTIVE); R_PFS->PORT[4].PIN[7].PmnPFS_b.PMR = 0; //USB_VBUS解除 R_PFS->PORT[4].PIN[7].PmnPFS_b.PSEL = 0x09; //RTCOUTを指定 R_PFS->PORT[4].PIN[7].PmnPFS_b.PMR = 1; //RTCOUTを有効に R_RTC->RCR1_b.RTCOS = 1; //RTCOUT 64Hz出力 R_RTC->RCR2_b.RTCOE = 1; //RTCOUT出力許可 R_RTC->RFRH = 0; //LOCO補正 R_RTC->RFRL = 0xfe; //補正値 -1 RTC.setTime(startTime); //RTC動作開始 } void loop() { digitalWrite(13, HIGH); delay(500); digitalWrite(13, LOW); delay(500); }
補正を入れて実行した結果は・・・
案の定、周波数が上がり過ぎていて、RTCOUT端子の周波数は約64.09Hzとなった。
つまり、63.88Hzが64.09Hzなってズレ幅は64.00からと考えるとそれほど変わらないことに。
そりゃちょっと計算すればわかるよね。 (LOCO クロック周波数)÷ 128 - 1 ということは、32.768kHz ÷ 128 = 0.256kHzなので、このRFRLレジスタで補正できるのは、0.256kHzずつということになる。
RTCOUT端子出力で言うと、0.5Hzずつの補正しかできないことに。
計算が合ってるかわからないが、128秒で1秒以内のズレは補正できないということに・・・。
結論を言うと、内蔵オシレーターを使ってRTCを動かすのは正確性に欠ける。
外部からのサブクロック発振器を使った方がよい。
ということになるのかな。