Siglent SDS1000X-EとZEROPLUS LAP-Cを比べた場合、SDSのほうが柔軟なトリガが設定できる。また、SDSはトリガパルスを出力できる。このパルスをロジアナのトリガに使うと、オシロで設定したトリガで(オシロと同期して)ロジアナを開始できる。
DS18B20を9bitモードで変換して、変換開始から100msec後に読みだした例。
読み出し時の拡大。
2バイト目を読みだした段階でUnknownとなり、デコードが停止している。
その周辺の拡大。
さらに拡大。
ノイズが出ていて、これが1wireのデコードでエラーとして認識されている。
その付近のオシロの拡大。
ある程度広い範囲の表示だが、オシロの波形では、少なくとも見えるようなノイズは出ていない。
更に拡大してみると、立ち下がりが1.6V付近で一瞬鈍るので、ロジアナから見るとそれをノイズとして認識してしまうのかもしれない。
LAP-Cはメニューからフィルタを選択できる。
フィルタを適用すると、正常にデコードできるようになる。
このノイズ、毎回確実に2バイト目の後端にノイズが出るのが謎い。
今回はオシロのトリガ出力を試してみたかったのでこのような構成にしたが、ただフィルタを通すだけならロジアナ単体でもできる。ノイズ探しも、オシロの画面でビット位置を目視で確認していけばいい。
オシロもロジアナも、バーの位置の分解能が0.001ms程度しかないのと、トリガの遅延?で多少ずれたりして、マイクロ秒単位で位置を合わせるのは難しい。1wireは結構早いパルスを使うので、なかなか大変。
STM32F4用の1wireドライバを書いてる。最大32bitを割り込みで完結して転送できるので、コンテキストスイッチが頻発せずに通信できる。コードの簡略化と割り込み回数の削減を目的に送信の処理が少し遅れるので、1wireの通信速度は微妙に遅いが、そもそも1wireはカリカリに高速化したところでたかが知れてるので、割り込みのコストを減らすことを優先している。
温度センサ1個だけなら変換開始コマンドは2バイト送れば済むが、複数のセンサを使う場合は最初に8バイトでアドレスを指定する必要があるので、一気に4バイト送れると便利。 コンテキストスイッチでスレッドに処理を戻すと単純な処理でも数十マイクロ秒程度かかる。割り込みで完結すると2マイクロ秒未満で処理できる。1bitの転送に110マイクロ秒程度かかるので、その中の数十マイクロ秒はかなりデカイ。割り込み内での処理なら割り込みを抜けて直ちに他のスレッドを再開できるので、RTOS的にも良い。DMAを使えば頻繁なコアからの制御は不要になるが、ストロングプルアップの処理や、そもそもDMAは使えるリソースが少ないことを考えれば、割り込みでも十分。
とりあえず、UARTとEXTIで処理している。主な処理をUARTで行い、プレゼンスパルスの検出とストロングプルアップの開始をEXTIで行っている。EXTIは割り込み内で処理が完結するので、タイミングクリティカルな処理(10マイクロ秒未満の指定)を高い優先度に設定できる。UARTは基本的にいくら遅延しても構わない使い方なので、優先度は低めに、また1wireを制御するスレッドの優先度も低く設定できる。
以前はストロングプルアップの検出もUARTで行っていたが、UARTのタイミングから逸脱したタイミングでパルスが来るので、稀に検出できないことがある。ストロングプルアップでEXTIを使っているので、プレゼンスパルスの検出にもEXTIを使うことにした。
UARTは1pinで送受信するモードがあるし、そのpinをEXTIで使うこともできるので、STM32から1wireを使う場合は1pinだけでストロングプルアップも含めて処理できる。STM32の内蔵プルアップは30-50kΩなので、1wireのプルアップに使うには足りない。今回は3.3Vに3.3kΩで釣っているが、待機電力すらも無視できないような状況であれば、GPIOから3.3Vを出して釣ってもいいはず。
マイコン1個にボタン電池1個で半径数十m程度の範囲の温度数十箇所分を数分に1回計測して1週間分記録する、位のモノは作れそう。作って何に使うんだって話だけど。。。医薬品とか特殊な物の輸送なら、輸送中の温度管理とかは重要だけど、まぁその用途はすでに市販品があるしね。
当面は窓の外に出した温度計から読んで表示する、位の機能を目標に開発していこう。
0 件のコメント:
コメントを投稿