【備忘録】arduioでのpulsein関数の精度が悪い2016年05月26日 13時47分50秒

arduioでサーボモータパルスを検出するプログラムを作っていたところ、pulsein関数で戻り値が不安定で精度がでない症状が現れた。

最初のテストでは、メインループの中でpulsein関数をコールして使うとほぼ想定内の値が戻ってくてる所までは確認。 諸々のタイマー割込を10msで動かしいろいろコードを付加していくと、pulsein関数の戻り値が不安定になってくることがわかった。

不安定さは割込処理内のコードを増やした分だけ多くなる感じです。 おそらく、このライブラリは他にこの関数の動作を邪魔をするものがいない条件で時間を計測しているみたいですね。

計測するパルス幅は2mSを越えることがないので、pulsein関数のある記述を割込処理に押し込んだら、この不安定は完全に解消。 自前でこの関数もどきをわざわざ作るのもめんどうなので割込処理内で計測されることにしました。

でも問題が・・・・追記へ続く

【追記】 実験していると色々見えてきました。 レファレンスにも書いてあったのですが、タイムアウト値を超えるパルスが入るとゼロを戻してきます。 戻り値で判定するときはこの点に注意しないと怪しい動きをすることになります。

ちょと使いにくいなぁ・・・、自前のライブラリを作ってしまいたくなりました。(でも、方法を調べて勉強しないと・・・苦笑)

その色々調べていたら、コールされるとそこからH区間をずーっと探し続けるので、タイムアウト値は周期分ないとダメな事がわかりました。(よく考えれば当然のこと、苦笑)

それから、puluse関数をコールして実行しているときは、割り込みを入れると計測誤差が一気に大きくなるので注意が必要です。

追記の前に前途したタイマーのなかにpuluseIn関数をいれるのは、1ms以内の計測であれば可能ですが、それ以上だとまともに動作させるのは難しいです。 そそれは、タイマー割り込みは仮に10mS間隔で設定しても基本は1mSで動いているので、この中にpulseIn関数をいれると1ms以内に抜け出ることができなくて割り込み処理のタイミングがめちゃくちゃになります。

【さらに追記】 内部構造を知る上でとても参考になるサイトがありました。 http://garretlab.web.fc2.com/arduino/inside/index.html

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※投稿には管理者が設定した質問に答える必要があります。

名前:
メールアドレス:
URL:
次の質問に答えてください:
このブログは○○じるし研究院のブログですが、さて○○は2文字は何でしょう?

コメント:

トラックバック

このエントリのトラックバックURL: http://hmg.asablo.jp/blog/2016/05/26/8096343/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。