私の場合、サーミスタ読み取りのための接続は、
基準抵抗をVref側に持ってきます。
こんな具合。
こうすると、サーミスタの片方をGNDにできるので
シールド線が使えます。
この場合、温度が上昇するとサーミスタの抵抗値が
下がり、それに連れてA/D値も下がってしまいます。
温度が上がるとA/D値が下がってしまうので、直感的に
これを嫌う方が居られるのでしょうか、こんな具合に
基準抵抗をGND側につないでいる回路例を見かけます。
こうすると、
温度が上がる
↓
サーミスタの抵抗値が下がる
↓
A/D値が上がる
と、温度上昇でA/D値が上昇と、まぁ見た目の感覚に
合うような気がします。
しかしちょいと問題が・・・
RaあるいはRbの値を固定して、その時のA/D値から
反対側の抵抗値を計算する方法を見てみましょう。
VrefとVin、そしてRaとRbの関係式です。
VrefとVinは何ボルトという実値でなくてもかまいません。
Vinは「ゼロ~フルスケール」。
8bitのADCなら「0~255」、10bitなら「0~1023」と
いう範囲の値になります。
そして、Vrefは「フルスケール値 + 1」、
まず、サーミスタをGND側につないだ時。
Raが基準抵抗。 Rbがサーミスタ。
VinからRb値を計算します。
分母の「Vref - Vin」に注目。
サーミスタがGNDに短絡して0ΩになってVin=0になると
分子がゼロでRb=0が出てきます。
そして、分母はVrefそのもので計算可能。
サーミスタ入力がオープンになってVinがフルスケールに
なっても、分母の「Vref - Vin」は「1」になって計算可能
です。
※Vref=フルスケール値 + 1 が重要!
問題がサーミスタを電源側につないだ時の計算。
基準抵抗がGND側。
Raがサーミスタ。 Rbが基準抵抗。
サーミスタ入力がオープンになるとVinは
RbでGNDに落ちて、Vinはゼロ。
この時、「Vref ÷ Vin」の分母がゼロになってしまって
ゼロ除算エラーが発生して、正しく計算できません。
このようなつなぎ方の時、A/D値「Vin = 0」をチェック
して、ゼロ除算エラーを回避する処置が必要です。
例えば、「0なら1に」するような。
Arduino UNOだとint値をゼロで割っても答えを「0xFFFF」
(intだと-1)にしているようですし、floatだと「inf」
無限大を出して、「ゼロで割ったから停止!」とはして
いません。
ネットに上がっているいろんなサンプル、ゼロ除算エラー
を無視しているのが多いようです。
マイコンを使っての計算でこれは「ちょっとなぁ」です。
~~~~~~~~~~~~~~~~~~~~~~~~~~~
※追記
サーミスタによる温度計測で、ゼロ除算エラーが
発生する可能性のある回路やスケッチの例。
※ネットを検索
・Arduino 入門 Lesson 18 【サーミスタ編】:おもろ家
サーミスタは電源側。
「Rth = ((Vin/Vout) - 1) × R1」として
サーミスタ抵抗値Rthを計算。
VoutがA/D入力値で、「0」だとアウト。
・https://asukiaaa.blogspot.com/2021試行錯誤な日々:Arduino(ESP32)でサーミスタを使い温度を取得
サーミスタは電源側。
「(double)(analogMax - analog) / analog * resistorPullDown;」
でサーミスタ抵抗値を算出。
analogがA/D値。 「0」だとアウト。
12bit ADCだが、「#define ANALOG_MAX 4095」として
「フルスケール+1」を使っていない。
考え方として、これもダメ。
・NOBのArduino日記!サーミスタの使い方! その2( 実測編!)(103JT-050)
サーミスタは電源側。
「R1 = ((Vcc × R2) / Vout) - R2 」で
サーミスタ抵抗値R1を算出。
VoutがA/D入力値で、やはり「0」だとアウト。
・初めてのロボット組立:Arduinoにサーミスタを接続して温度を測定する
サーミスタは電源側。
「10000.0 * ((1024.0 / tempReading - 1))」でサーミスタの
抵抗値を算出。
tempReadingがA/D入力値で「0」だとアウト。
※LCDのコントラスト調整の半固定抵抗記号に
んっ? ボリュームの記号が!
で紹介した表記が使われている。
電子回路エンジニアの皆さん、
ほんとにこれ、どうにかして!
・まったりYO$HI日記 気の向くまま(・∀・)【Arduino】サーミスタで温度測定
サーミスタは電源側。
「R = R1 × ((V / Vt) - 1)」でサーミスタの
抵抗値Rを計算。 R1はGND側の抵抗100kΩ。
VtがA-D入力値。 これが0ならアウト。
・基礎からの IoT 入門Arduino IoT とは? 温度を測る ~ サーミスタの利用
サーミスタは電源側。
「R = ((Vin / Vout) - 1) × R1」で計算。
VoutがA/D値。 0ならアウト。
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Arduino UNOのような単純な8bitマイコンだと
機械語として割り算命令は持っていませんので
ゼロ除算によるトラップ(例外処理)は考慮しなくて
かまいません。(勝手には止まらない)
しかし、高機能なマイコンだとトラップに引っかかり
制御がそこで止まってしまうかもしれません。
(そんな仕掛けをしていたら)
int値のゼロ除算なら結果はおそらく「-1」。
(符号無しなら最大値に)
ゼロ除算を無視するのなら、この「-1」がその後の
計算にどんな影響を与えるのかを考えておかなくて
はなりません。
単純な表示でも、想定する桁数を越えちゃうと、表示
が「グチャ」っとなるかもしれません。
何かの制御に使っていたら・・・ちょっと怖い。
浮動小数点なら「NaN:Not a Number」や
「inf:infinity」てなところでしょうか。
今回はサーミスタの抵抗値計算での話ですんで、
「マイナスの抵抗値」が出現てなことに
なっちゃうかも、です。
やはり、どこかで数値のエラーチェックが必要でしょう。
0での割り算をしちゃう大もとの、A/D値のゼロを
排除というのが簡単かと。
これ、あれこれ書いてきましたが、
サーミスタをGND側につないだ時は
大丈夫なんですよ。
10bitのADCなら0~1023の範囲で
ちゃんと答えが得られます。
うだうだ言ってますが、結局はサーミスタの接続が
外れなければ大丈夫。
しかし・・・
・接触不良がおきたら?
・コネクタやプラグを使って抜き差しできる
構造なら、抜いた時は?
・サーミスタへの配線が切れたら?
と、Vinが0Vになる可能性があるのなら、
ゼロ除算エラーが生じる可能性もあるわけです。
このつなぎ方をするのなら、ソフト的な対策は必要か
と思うのです。
★続き
↓
・Arduino サーミスタを使った温度測定で 【ゼロ除算問題】
サーミスタを使って温度計測の手順から、
【1023 vs 1024 問題】だけじゃなく【ゼロ除算問題】が
見えてきました。
最近のコメント