google-site-verification: google3bd66dd162ef54c7.html

ArduinoのMsTimer2の精度の話、続編

 以前の記事の最後のあたりに、MsTimer2の割り込み間隔が、たまに数μSくらいずれることがありそう、ということを書きました。ただ、その時点ではクロックのソースがセラロックだったので、周波数の安定度が悪くて詳しく調べることが出来ませんでした。
 今回、和時計をブレッドボードで動かすようにした時にクロックのソースを水晶に変更。これで周波数の安定度はかなり改善されたはずなので、もう一度調べてみました。

 測定にはアドバンテストのユニバーサルカウンター、TR5822を使用。

▼TR5822
アドバンテスト TR5822
 ヤフオクで中古で買った古いカウンターですが、私には充分な性能です。

 いろんな測定をやったのですが、割り込み信号(1秒周期)でゲートをかけたCPUクロック数カウントが一番判りやすいので、その結果を示します。なお、測定中は和時計のスケッチを走らせています。

▼割り込みの間隔はぴったり16Mクロック
16M
 CPUのクロック周波数は16MHzなので、1秒周期の割り込みの間に16Mクロックがあるので問題無し。

 CPUと周波数カウンターでは全く違った仕組みで動いているのに、両者の結論がぴったり一致するのはすごいなー
、何しろ1600万パルスなんだから。と、感心して見ていると、あららら・・・

▼たまに64クロック多い時がある
64クロック多い
 なんでー、きちんと仕事しろよ。と思って見ていると、98や128が出ることも。

 98が出る理由は良く判らないですが、64や128はMsTimer2の内部処理で使っているCPUクロックのプリスケーラーの倍率と一致するので、たぶんここで数え落としが発生しているのではないかと思います。

 変な数字が出るといってもたまに出る程度。じゃ、どれくらいの誤差に相当するのか、1000回測定で平均させると、

▼1000回アベレージング
1000サイクル平均
 16Mの上位桁がオーバーフローして6だけになっちゃってますが、要するに平均すると10.8クロック多いことになります。

 10.8クロックは時間にして0.669μS、つまり1秒が約0.7μS長いことになります。まあ、時計の誤差に換算すると、日差0.1秒以内という僅かな誤差なので実害は無いのですが。

◆まとめ
・MsTimer2は誤差は累積しないことになっていますが、僅かですが誤差は累積しているようです。また、ジッタが8μS(128クロック相当の誤差の場合)くらいあるので、厳密なタイミングが必要なアプリでは注意が必要だと思います。

・調べていないので断言はできませんが、この誤差が割り込みの都度発生しているとすると、高頻度で割り込みをかけると、相対的に誤差の影響が大きくなる可能性があり、注意が必要かもしれません。

【追記】
 この記事を書いた後で気になったので高頻度の割り込みで測定してみました。

 やったのは、周期1mSでMsTimer2で割り込みを発生させ、割り込み処理ルーチン内では13番PINをHIGH→LOWにしてすぐに抜ける処理です。
 すると、本記事のような64クロックものジッタは発生せず、±2クロックでふらふら、つまり貸し借りがあって平均を1mSに保つような動作となりました。つまり、こういう条件ではMsTimer2はうまく動作しているようです。

 どうも、割り込み処理ルーチン内でどんな処理をやらせるかで誤差の出方が違ってくるみたいです。誤差を回避するためにはどういうコードを書けばいいんだろう。
関連記事

テーマ : ハードウェア
ジャンル : コンピュータ

コメントの投稿

管理者にだけ表示を許可する

カレンダー
02 | 2017/03 | 03
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -
プロフィール

ラジオペンチ

Author:ラジオペンチ
電子工作を中心としたブログです。たまに近所(東京都稲城市)の話題など。60過ぎて視力や器用さの衰えを感じつつ日々挑戦!
コメントを入れる時にメールアドレスの記入は不要です。なお、非公開コメントは受け付けていません。

記事が気に入ったらクリックを!
最新記事
カテゴリ
最新コメント
リンク
FC2カウンター
検索フォーム
月別アーカイブ
RSSリンクの表示
QRコード
QRコード