Arduino Nano Every のクロック †Arduino Nano Every を買った. Arduino Nano / Nano Every を載せて格安中華 LCD と接続できる基板を作ったので,載せてみた. I2C に温度センサをつないで,ついでに時刻を表示させてみた. で,4時間ほど経つと… 表示時刻が 24 秒も進んでいる. Nano Every の回路図を見てみると,水晶発振子が無い. マイコン内蔵の発振器を使っていて,クロック周波数が不正確なのだろう. Nano のほうには水晶発振子は乗っているので,Nano Every の非互換の1つと言えるだろう. データシートを読む †ここで Arduino Nano Every に載ってる ATmega4809 のデータシートを読むと
が載っている. プログラムを読む †で,ArduinoIDE 側の SDK のソースコードを読んでみると
という状況. 強引に補正してみる †というわけで,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時間経過しても「やや遅れてるな」という程度まで追い込めた. |