こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

回答受付中の質問

温度センサー ADT7310 SPI通信について

ADT7310(アナデバ温度センサー)の温度データをSPI通信で取得するのですが、
基板上の実装ではなく、ケーブルで接続して離れた位置の温度を取得したいのですが、20cm程度であれば問題ないのですが、1Mになると、温度データが取得できません。こちらからのコマンドを受けつけていないようです。
何か延長する良い方法ありましたら、ご教授をお願い致します。

投稿日時 - 2018-11-09 18:29:03

QNo.9556180

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

回答No.1 です。
ホストはArduinoということでしたが、ライブラリにはADT7310用のスケッチは無いようなので
まずはこちらのページを参考にしてみてください。
http://www.wsnak.com/wsnakblog/?p=249
http://www.wsnak.com/wsnakblog/?p=270
http://www.wsnak.com/wsnakblog/?p=679
http://www.wsnak.com/wsnakblog/?p=826
http://www.wsnak.com/wsnakblog/?p=1045
http://independence-sys.net/main/?p=3804

あとSPIのレートは こちらを参考に
https://garretlab.web.fc2.com/arduino_reference/libraries/standard_libraries/SPI/setClockDivider.html
最大で通常の32倍遅いレートに設定できますよ。

投稿日時 - 2018-11-10 20:36:01

お礼

ご教授ありがとございます。参考にさせていただきます。

投稿日時 - 2018-11-11 08:58:58

ANo.3

ツイストであれば動作するということであれば、寄生容量ではなく、ノイズ重畳を疑います。
(ツイストすると2線間の平均距離が小さくなり、寄生容量が増えるため)

ノイズによりクロックを誤認識し、通信に失敗している可能性を疑います。
(過去、リレーを用いた同期通信でクロック信号チャタリングでの通信失敗に悩まされた経験あり)

回路全体をシールドしてみて動くか確認してみてください。
(アースに接続したアルミ箔で回路全体をくるむ、アースした金属製の箱に入れるなど)
シールドで安定するならケーブルをシールド線に変えるのがお手軽です。

RS422のドライバーとレシーバーの組み合わせやRS485トランシーバーを用いて差動伝送にするという方法もあるにはあります。
以下が参考になりそうです。
http://iizukakuromaguro.sakura.ne.jp/226_ltc1485/226_ltc1485.html

投稿日時 - 2018-11-10 17:52:53

補足

ご教授ありがとうございます。その後調査していて、SPI通信でデータを読むとき、こちらからのクロックの立下りで、ADT7310がデータをセットしてくれます。そして、クロック立ち上がりで、こちら側はデータ判断しますが、どうも、クロックの立下り時にリンギングがあり(1V程度)、これが次の立下りと認識して、次のデータをセット(今のデータをクリア)しているようなのです。
現状、このアンダーシュートのリンギングを取る方向で再度確認しています。

投稿日時 - 2018-11-11 08:55:12

ANo.2

恐らく、ケーブルの寄生容量などでクロック信号のエッジが鈍り、伝送が不安定となっているものと推測します。
また、シングルエンド伝送ですのでノイズ重畳も疑う必要がありそうです。

対策として単純確実なのは、マイコンなどでRS485などの長距離用通信規格に変換してしまうことでしょう。

SPIとしての延長が必要で有れば、適切な終端(インピーダンスマッチング)をした配線を用いた上で、シュミットトリガー回路によりシャープなクロックエッジを再生する方法が考えられます。
また、シングルエンドでなく、差動伝送にすれば、ノイズ耐性を向上できます。

ただ、絶縁型SPIコントローラーICを使う方がコンパクトで簡単かも知れません。

投稿日時 - 2018-11-09 19:18:50

補足

ご教授ありがとうございます。マイコンはArduinoを使用しています。
ケーブル1Mの状態で、計測できている状態とできない状態となり、安定しません。CLOCKラインのケーブルを動かすと、やはり取れたり取れなかったり、変化してしまいます。
CLOCK信号をGNDでツイストしてもっていき、ICのGND端子で共通にすると、動作してくれます。
ただ、ICの所ではプローブでコンタクトするという事情で、ツイストしたGNDラインをICの所で共通にできません。
終端抵抗として、CLOCKラインとツイストしたGNDケーブル間に100Ω程度付けてみたのですが、安定しません。
できれば、SPIとして延長したいのですが、難しいようであれば、他の方法で検討しようと考えますが、その場合、送信先に何かしらの回路が必要ということになりますか?
また、何かご教授いただけると助かります。

投稿日時 - 2018-11-09 19:36:53

ANo.1

基本的には2つの手段があります。
(1)SPIの伝送レートを下げる。
 SPI通信を行うICのSPIレート設定を下げてみてください。
(2)SPI信号をバッファリングする。
 http://akizukidenshi.com/catalog/g/gI-02819/ とかのバッファICを
 センサ側とホスト側にそれぞれ入れてください。(パスコンも忘れずに)
 例では2段直列にして3本の信号を非反転バッファリンスするようにしてください。

投稿日時 - 2018-11-09 18:57:15

補足

ご教授ありがとうございます。
SPI通信レートですが、マイコンはArduinoを使用していて、一番遅い設定にしています。
まずは、LS14でバッファしてみます。

投稿日時 - 2018-11-09 19:52:38

お礼

ご教授ありがとうございます。LS14をマスタ側とセンサ側に配置して行ってみましたが、安定しません。オシロでみた波形は綺麗になっていると思われますが。センサーのICのGNDに直接オシロをあたっていると、安定しています。GND-アースでの状況かと思ったのですが、オシロからケーブルを外しても、データが取れます?まったくわかりません。ただ、GNDの状態でデータを受けたり受けなかったりしているようです。
現状対策案がありません。何かありましたら、教えてください。
宜しくお願いします。

投稿日時 - 2018-11-10 11:57:46

あなたにオススメの質問