Arduino サーミスタを使った温度測定で 【ゼロ除算問題】
2023年3月21日:A/Dコンバータでサーミスタの抵抗値を読む サーミスタをつなぐ場所は?
この続き。 ゼロ除算問題が見えてきました。
あれこれ検索。
★電源側にサーミスタ
・VasteeLab:Arduinoで火災報知機をつくってみた
int val = analogRead(PinTemp); // get analog value
resistance=(float)(1023-val)*10000/val; // get resistance
val値が0ならゼロ除算。
★サーミスタをGND側に持ってきた例
・今日から始める電子工作 【初めてのArduino】6.サーミスタ|ハンズオンで学ぶ初心者向け入門コース
サーミスタはGND側。
しかし、Vref値を1023としているため、抵抗値算出の時、
A/D値がフルスケールの1023ならゼロ除算エラー発生。
正しくは「/ (1024 - readValue)」。
//アナログ値を読む
float readValue = analogRead(analogPin);
//Rtを計算する
float Rt = Rd * readValue / (1023 - readValue);
※1023が出るのはサーミスタが外れた時。
0が短絡なんで、回路の異常報知案件。
・みのや電子工作所:なんちゃって自作体温計の製作
電圧計算に1023を使っているので、A/Dの
フルスケール値を読み出したときはV0が5.0Vと
なり、抵抗値算出の/(5.0-V0)でゼロ除算エラー。
val*5.0/1024.0にしておくのが正しい計算で、
これで、ゼロ除算エラーを回避できる。
val = analogRead(AN0); //アナログ値読込み
V0 = val*5.0/1023.0; //アナログ値から電圧換算
THR = 10000.0*V0/(5.0-V0); //電圧値からサーミスタ抵抗値換算
・adafruit.com:Using a Thermistor
な、なんなんだ、この式は!
A/D値が0でも1023でもアウト。
float reading;
reading = analogRead(THERMISTORPIN);
reading = (1023 / reading) - 1; // (1023/ADC - 1)
reading = SERIESRESISTOR / reading; // 10K / (1023/ADC - 1)
◆正しく計算 (コメントしたところも)
・アイデアノート:Arduinoとサーミスタで温度測定
・jh4vaj:Arduinoでサーミスタを使って温度計を作るのに、電圧を求める必要はない
・プチモンテ:サーミスタ(NTC)の使い方 [Arduino]
・arduino.stackexchange.com:How to include Vref in thermistor temperature calculation?
あれこれ議論。
◆基準電圧で誤差が出るかも
・ラジオペンチ:Arduiono を使ってサーミスタで温度を測る
(電圧算出に1/1023を使っているのも気になる←修正済)
◆イイこと書いてある
・Qiita @c_in_g:analogReadの値の変換を誤解していた話(1023、1024問題)
引用させて頂きます。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
長々と書いたが、ぶっちゃけ、255/1023と256/1024の
違いなんて微々たる差(1%にも満たない)で考慮する必要ない
だろと思う。 こういうことは言ってはいけない
:
初心者はこんなクソ細かいことを気にするより色々作ってみた
ほうがいい。 こういうことも言ってはいけない
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
★エラいことにつながるかも
『1023 vs 1024 問題』が【ゼロ除算問題】にまで膨らんじゃ
いました。
1023 vs 1024は「ちょっとした誤差やん」で見逃せた
んですが、ゼロ除算は笑って済ませられないかもしれ
ません。
『ミサイル巡洋艦・ヨークタウン ゼロ除算』を検索すると、
「ゼロ除算エラーでシステムがダウン。航行不能に」なんて
記事が見つかります。
・コンピュータのトラブルで漂流したアメリカのイージス巡洋艦 の考察
◆ゼロ除算エラーの話
・PLCが突然停止、原因は割り算の演算エラー
・【中級編】GX Works3 除算演算エラー回避方法 0で割らない
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
※追記
サーミスタでの温度計算とゼロ除算問題、式との相性が良い(!)
のかあれこれ見つかります。
「1023 vs 1024」と絡むのも面白いかと。
・理系男子の電子工作:【PIC】ADCの使い方 サーミスタで温度測定
サーミスタはGND側。
エクセルでA/D値→温度テーブルを作っておくという
手法です。
このように↓言い切られています。
『A = 0, 1023 の時にゼロ除算のエラーが
発生しますが、測定値がそのような値を
とることは考えられないので気にする
必要はありません。』
A/D値(A)からサーミスタ抵抗(R)の計算で
「R = (r × A) ÷ (1023 - A) 」
としているのを、1023→1024にするだけで
フルスケールでのゼロ除算が回避できます。
1024だと半値もちゃんと出るし。
(log(0)エラーの問題は置いておいて)
前もってデータテーブルを作るときのエラーですんで、
実行時のエラーとは違う話になります。
しかし、「いつも気にしておく」のが設計という
ものです。
・Digi-Key:正確なサーミスタベースの温度検出回路を迅速に作成
デジキーの技術解説。
サーミスタは電源側。
Vadco A/D入力電圧
Dout A/Dデータ
2^N A/D分解能
Rth サーミスタ抵抗
R25 GND側抵抗
Vadco = Vref × (R25 ÷ (R25 + Rth))
Dout = 2^N × (Vadco / Vref)
Rth = R25 × ((2^N ÷ Dout) - 1)
(2^N ÷ Dout)でゼロ除算エラー発生(の可能性)。
最近のコメント