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)でゼロ除算エラー発生(の可能性)。
| 固定リンク
「Arduino」カテゴリの記事
- パルスジェネレータをI2C液晶で動かす(2025.01.28)
- EEPROMを使ったシリアル受信バッファ 512kバイトに増設(2024.12.26)
- 1/nカウント方式とDDS方式の2相パルス発生回路(2024.10.13)
- おっと。map関数の計算桁に注意(2024.10.06)
- DDS方式の2相パルス発生回路、周波数スキャン機能を付ける(2024.10.05)
「重箱の隅」カテゴリの記事
- 1/1023監視団 活動中!(2025.03.10)
- DIPのLMC6482えらい高くなった(2025.03.07)
- 因縁のボリューム記号 トランジスタ技術2025年3月号(2025.02.17)
- ボリューム記号のボヤキ、トラ技2025年3月号の別冊付録に再掲載(2025.02.10)
- NECは3段タイプの発振回路をすすめてる(2025.01.31)
「温度測定」カテゴリの記事
- コテ先温度を読みたいゾ う~む。(2024.05.24)
- ハンディ熱電温度計 AD-5602(2024.05.21)
- サーミスタでの温度測定、「inf」の出現に耐えられるか?(2024.05.13)
- 今日の修理:熱電温度計(2023.11.05)
- 120W電子負荷 予備実験#2 冷やすのはファンだ!(2023.10.10)
「1023 vs 1024」カテゴリの記事
- 1023 vs 1024:AVRマイコンとPICマイコンのデータシートより(2025.03.19)
- 1/1023監視団 活動中!(2025.03.10)
- おっと。map関数の計算桁に注意(2024.10.06)
- サーミスタでの温度測定、「inf」の出現に耐えられるか?(2024.05.13)
- トラ技2024年5月号に「3.3/65535」(2024.04.07)
コメント
ご指摘有難うございます。1023で割るのは間違いということが判るようにコメント入れて修正しておきました。
Vref基準で分圧すれば抵抗比だけの話に出来るのですが、分解能が悪くなるのが嫌であんなことやったと思います。PID制御やるので刻みは出来るだけ小さくしておきたかったです。
あとVrefを5Vにするとサーミスタの自己発熱問題。1.1Vにするにはオペアンプのボルテージフォロアが必要になって面倒という事情も。
投稿: ラジオペンチ | 2023年3月23日 (木) 22時29分
ラジオペンチさん、修正ありがとさんでした。
で、サーミスタを電源側に持ってきたときの計算式。
分母にA/D値を示すVin(8bitなら0~255)が来るからゼロ除算の可能性が出てくるわけです。
読んだA/D値Vinを+1して処理すれば、8bitなら1~256が数値範囲になって丸くおさまるんじゃないかと考えたんですが、半値がちゃんと出ませんわ。
投稿: 居酒屋ガレージ店主(JH3DBO) | 2023年3月24日 (金) 09時58分