できるか? 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を動かすのは正確性に欠ける。
外部からのサブクロック発振器を使った方がよい。
ということになるのかな。