DS18B20
いろいろ忙しいのだけれど、とある用事で、ちょっと高精度の温度センサがほしくなる。
サーモカップル、とまではいらないんだけれど、長く引っ張るのでデジタル系がいいよなあ、ということで、秋月でも扱っているDS18B20+を試してみる。
今はマキシム扱いだけれど、ダラスセミコンダクタの頃から知ってはいる。
結構古いチップだ。使うのは初めてだけど。
入手して、データシートを眺める。
せっかくなので、1-wire を使ってみようか。
------
双方向シグナル1本で、電源も含め、全部やってしまう規格。
プロセッサとの接続は、GNDとこの一本だけだ。
オープンドレインで駆動して、外部は4.7kでプルアップね。
電源電圧は3~5Vか。
いまどきからすると、ちょっと高めだね。
で、データのやり取りは、CPU側からの立下りエッジをもとに、一定時間後のバスの状態で、”0”、”1”を指定している。
1usecとかの、幅の狭いパルスを要求するようだ。
で、デバイス側のサンプリングは立下りエッジから、15usec後か。
プロセッサ側は30usecあたりで、サンプリングするようだ。
タイマー割り込みを使うか、時間待ちループで待つか微妙な時間帯だなあ....
まあ、とりあえず、ごりごりコーディング....
------
これって、バスがLの間は、デバイスは完全に無電源になるんだよなあ。
でもデバイスもバスをLに維持できてるってことは、このICパッケージの内部の電荷だけで、高々数十usecとはいえ、動作維持してるってことか。
各動作シーケンスの最初のリセットパルスは480usecとあるから、このくらいのOFF期間だとパワーオンリセットがかかるってことか?
いや、温度変換のデータは内部SRAMに保持できているから、480usecでは、コールドリセットがかかってるわけじゃないのか。ふーん。
さらに、どうしても保持しなきゃいけないデータは、EEPROMに入っていて、毎回起動時にSRAMにコピーされるようだ。
なんだか凝ってるなあ...(無駄に?)
------
温度変換をしている間、(ADCが動作している間)は、さすがにプルアップ抵抗経由の電源では動作できないようで、変換リクエストを出した後は、速やかにもっと低いインピーダンスでバスを電源側に引っ張る必要がある。
時間は10usec以内とある。せわしないなあ。
要求されるのは数mAなので、通常はCPUのGPIOをオープンドレインで使用して、しかるべきタイミングで、プッシュプルに切り替えれば十分用は足りる。
変換終了までは、電力供給を維持しなければならない。ふむふむ。
------
で、変換を開始して、しばらく待って読み込もうとすると、うまくいかない。
うーん...途中で、バスが落ちているようだが、これは...
制御用のタイミングが、どれも十数usecなんてオーダーなので、勝手な印象で、変換開始から数十msecくらい待って読み込みを開始していたんだけれど、どうも早すぎるようだ。
busy/readyフラグなんて物もないので、時間で決め打ちなのだけれど、ちょっと伸ばしてみても、状況は変わらない。
あらためてデータシートを読むと、驚愕の変換時間750msecとの記述がある。
1秒近く待つのか。ちょっと待ったくらいじゃ全然届いてない...
デフォルトの12ビット分解能だと750msec。
ビットを1つ減らすと、変換時間が半分になるようだ。
と、いうことは....こいつは積分型AD変換器なのか。
久しぶりに見たかも。
積分型なら、この長い変換時間も納得。
4096カウントで750msecだから、内部クロック5kHzくらい?
------
なんだかんだで、まあ動くようにはなった。
普通の温度計と見比べても、ほとんど同じ値を示すようだ。
MPL115の内蔵温度センサは、個体によっては3度くらいずれているが、こいつは温度計としても正しく使えそう。
微妙に早かったり、えらくゆっくりだったり、ちょっと普段付き合ってる人たちとは毛色が違うけど、これはこれで使えそう。
なかなか寄り道が多くて、本筋に戻ってないけど、まあ趣味なのでよし。
| 固定リンク | 0
コメント