2017年2月24日金曜日

STM32F1のI2C


 ためしにADT7420で計測してみました。青のt1が生データ、赤のt2が10サンプルの平均です。若干ノイズが大きい気がしますが、振幅は0.1℃程度なので、それなりにカタログスペックが出ているのかもしれません。
 センサは1SPS、16bitで初期化し、FreeRTOSのTaskDelayで1000msecウエイトをかけて約1Hzで取得しています。一応グラフの横軸は時系列になっていますが、タイムスタンプを出していないため、何らかの理由でデータが止まっててもログに残らないので、時間精度はあまりないと思います。


 今回、久しぶりにSTM32F1のI2Cペリフェラルを使用しました。このI2Cはかなり厳密に管理されており、上手く使うのはかなり大変です。
 今のところ転送完了をソフトウェアループでポーリングしているわけですが、例えば3軸センサを読む場合、9バイトの転送に0.2ミリ秒ほどかかります。200マイクロ秒というと大した事はない気もしますが、72MHzのマイコンなら200マイクロ秒でおよそ15k(1万5千)サイクル分あります。実用的なセンサ数だと1秒あたりこの数百倍ほどの実行時間をポーリングに使っていることになります。かなり無駄な気がしますよね。
 ということで、せっかくRTOSが乗ってるので、I2C転送中は別のタスクを行えるようにしたいのですが、なかなか大変そうです。
 STM32F1のI2Cは苦い思い出が多いので、もうちょっといろいろと試してみようと思っています。数日はI2Cにかかりっきりかな。

0 件のコメント:

コメントを投稿