2017年7月22日土曜日

STM32F4で1Wire

 STM32F4で1Wireの温度センサを使ってみた。

 例によってロジアナキャプチャ。







 上から、全景、AD変化開始付近、データ読み出し付近、全景、ADC変換開始付近、データ読み出し付近。最初の3枚はロジアナ、残りの3枚はオシロ。

 ZEROPLUS LAP-Cは最近になってプロトコル解析が全て無料で行えるようになった。1Wireも含まれているので、データ転送を見るだけなら便利。ただしLAP-CではSEARCH ROM COMMANDの、アドレスツリー探索は正常にデコードできない。まぁアドレスツリー探索は例外的な動作ということで、脳内デバッグをすれば。とても面倒だけど。
 あと、LAP-Cの1Wire解析はデフォルトでMSBファーストとなっている。1WireはLSBファーストな仕様なので、ちゃんと設定しておくこと。

 1Wireはだいぶ前にFT232で温度センサを試したことが有る。1Wire通信だけなら問題ないが、パラサイトパワーではAD変換時にストロングプルアップ機能が必要になり、FT232ではこれを実現できないので、あんまり作り込んでいなかった。

 今回はSTM32F4のUART4を使用して1Wire通信を行っている。手持ちのセンサはパラサイトパワーのタイプなので、ストロングプルアップが必用。
 UART4はAF_ODで初期化するが、AD変換コマンドを送信後にOUT_PPに変更する。予めOutputはSetしてあるので、OUT_PPにすればマイコンからおよそ20mA(66mW)程度の電力を取り出すことができる。DS18B20のAD変換/EEPROM書き込み時の電流はtyp1mA max1.5mA @5Vとのことなので、マイコンからの出力でも問題ない。はず。
 本来はオープンエミッタ、あるいはオープンソースのようなピンモードがあれば楽なのだが、STM32F4にはそういう機能はない。ぐぐってもそういう使い方はないようだ。大体オープンコレクタ・オープンドレインで事足りるもんね。
 
 今回はDQを3.3Vに4.7kOhmで釣り上げ、20kOhmでGNDに落として、約2.7Vになっている。またストロングプルアップの時は3.3Vに短絡状態となるため、3.3Vになる。
 実際、オシロの波形ではAD変換中は3.3V、それ以外は2.6V程度となっている。
 ちなみにDS18B20の動作範囲は3.0-5.5Vなので、仕様どおりに使いたいなら分圧抵抗は外す必要がある。とりあえずストロングプルアップの動作確認に一時的に装着してるということで。

 1Wireはかなりアナログ寄りなデジタル通信なので、オシロとかあると便利。ロジアナも有ったほうがわかりやすいけど。
 アナログ寄りのデジタル通信というと、I2Cがあるが、それよりもさらにアナログ寄りだと思う。I2Cはクロックストレッチは有るが大抵のデバイスは必要ないし、クロックストレッチだってロジアナである程度把握することができるはず。ストロングプルアップを分圧抵抗で見ようとするとオシロスコープが必須。まぁ、I2Cのレベル変換ICとかはインピーダンスで自分の信号かほかデバイスの信号かを切り分けてるから、そのあたりは超アナログだけど、少なくともセンサをちょっと使いたいくらいなら気にする必要ないし。

 1Wireの通信は、今回はリセットパルスの生成に18.75kbaud、送信に125kbaud、受信に180kbaudを使っている。
 送信時は、0を出す時は0x00、1を出す時は0xFFを送る。受信時は0xFFを送り、0xFF以外なら0、0xFFなら1と認識する。
 リセットパルスは0x00を送信し、2バイトを受信できればデバイス有り、1バイトしか受信できなければデバイスなし、1バイトも受信できなければハードウェアに不具合がある。不具合の種類は1) 送信の問題、2) 受信の問題、3) 送受信間の接続の問題、等が考えられる。だいたいCANバスの自己診断に近い感じ。

 この通信方法では1Wireの1bitを送るのに、TTL232の10bitを送る必要がある。送信は12.5kbit/sec、受信は18kbit/secくらいの速度になる。
 デバイスの指定に64bitが必要だし、コマンドを送るのにも8bitが必用。データの読み出しの場合はさらに72bitが必要になる。AD変換開始コマンドを送るには約6ミリ秒、データの受信には約10ミリ秒がかかる。ただしDMAやNVICを使えるので、CPU負荷はあまり大きくない。
 すべてソフトウェアで作るとなると数マイクロ秒の精度で制御する必要があるので、ソフトウェアで回す必要があるし、割り込みを禁止したりとかする必要もあるだろうから、かなり厳しいと思う。その点、UARTモジュールを使うのは理にかなったやり方だと思う。


 ということで、STM32で1Wireを使ってみたよ、という話でした。
 今のところ、手持ちのデバイスがDS18B20が1個しか無いので、あんまり1Wireらしくないけど。もうしばらくしたら秋月でいくつか買って、多点温度計測をやってみたいなーと思う次第。

 ちなみに現在の室温は30.5±0.5℃くらいらしい。今日は曇ってるので日照は強くないけど、暑いことに変わりはない。



0 件のコメント:

コメントを投稿