Arduino Nano Every のクロック

Arduino Nano Every を買った.

IMG_20200620_151928.jpg

Arduino Nano / Nano Every を載せて格安中華 LCD と接続できる基板を作ったので,載せてみた.

IMG_20200620_223939.jpg

I2C に温度センサをつないで,ついでに時刻を表示させてみた.

で,4時間ほど経つと…

IMG_20200621_060332 (36d4e615).jpg

表示時刻が 24 秒も進んでいる.

Nano Every の回路図を見てみると,水晶発振子が無い. マイコン内蔵の発振器を使っていて,クロック周波数が不正確なのだろう. Nano のほうには水晶発振子は乗っているので,Nano Every の非互換の1つと言えるだろう.

データシートを読む

ここで Arduino Nano Every に載ってる ATmega4809 のデータシートを読むと

  • 内蔵発振器の周波数の補正値は,工場出荷時に fuse (ライトワンスのメモリ)に書かれている
  • UART のボーレートジェネレータでの補正値を使った補正例

が載っている.

プログラムを読む

で,ArduinoIDE 側の SDK のソースコードを読んでみると

  • クロック周波数のズレに横断的に対応するようなコードがあるけど,機能していない
  • UART には独自に補正がかかっている
  • tick timer には補正無し

という状況.

強引に補正してみる

というわけで,sketch の setup() 内で強引に補正をかけてみた.

  //
  // millis() speed adjust. for Arduino Nano Every
  //
  extern uint16_t millis_inc, fract_inc;
  if ( ( millis_inc == 1 ) && ( fract_inc == 24 ) ) {
    uint32_t tick_us = millis_inc*1000L + fract_inc;
    int8_t sigrow_val = SIGROW.OSC16ERR5V;

    tick_us = ( tick_us*1024 + ( 1024 + sigrow_val )/2 ) / ( 1024 + sigrow_val );
    // adjust manually
    // tick_us += 1; // faster
    // tick_us -= 1; // slower

    millis_inc = tick_us / 1000;
    fract_inc  = tick_us % 1000;
  }

未補正時の +6 sec/hour の時計の狂いが +3 sec/hour 程度に改善された. さらに手動補正で tick_us -= 1 してみると,1時間経過しても「やや遅れてるな」という程度まで追い込めた.


添付ファイル: fileIMG_20200621_060332 (36d4e615).jpg 169件 [詳細] fileIMG_20200620_223939.jpg 181件 [詳細] fileIMG_20200620_151928.jpg 188件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-06-22 (月) 20:03:51 (493d)