温度測定

2023年11月 5日 (日)

今日の修理:熱電温度計

ガレージ仲間のFJKW君からのHELP。
 『金型の表面温度を測るのに熱電温度計が2つ
  あるんやけど、片っぽの調子が悪い。
  安いモンやし、新しいの買おうかと思ってる
  んやけど・・・』
という相談。
  「原因が分かれば直せるやろけど・・・」
生半可な私の返事。

ということで、修理品がやってきました。
2台は同メーカー品ですが、型番が違いました。
表面温度を測るためのプローブ(熱電対)が
付属しています。
  ※こっちが高そうな

熱電対の先端部↓
Kk24

調子の悪い方のケースを開けてみると・・・
ぱっと見は特に異常は見られません。
でも、4つある半固定抵抗に触れると(絶縁物で)表示が
パラパラ変動。
どうやら接触不良を起こしているようです。
アナログ的な調整をしているのでしょうから、
再調整の手順が分からないので、グルグル回して元に
戻すということはできません。
幸い、接触子が見えてますので、ここをピンセットの先で
つまみ上げる感じで「大阪魂:パーツクリーナー」を
噴射。
Kk21
Kk23

抵抗体と接触子の間に紙でも入れてぬぐいたいところ
ですが、調整角度が動くとダメですんで、わずかに
持ち上げるだけに。

作業後、2つのセンサーを段ボール箱に入れて、ヒートガン
で加熱。
130℃~140℃くらいまで上げても、似たような温度値が出て
いたので、作業完了としました。

で、不調とは関係の無いところで面白いものを発見。
Kk22
リード線がブラブラしないよう、液晶のピン間に
通してありました。
これを見つけた時、
  「わざと通さないと勝手に通るわけはないはなぁ」
っと。


 

| | コメント (3)

2023年10月10日 (火)

120W電子負荷 予備実験#2 冷やすのはファンだ!

2023年10月8日:12V・10A:120W電子負荷 予備実験の続き。
およその動きが見えてきたので、テストしたい
スイッチング電源につないでみました。

ところが・・・件の電源から12Vで10Aが出てくれません。
8.2Aくらいで保護がかかってしまい電圧が落ちるのです。
ということはこの電源のスペックは「12V・100W」のようです。
   ※中華のスペック表記、さすがです。

気を取り直して、温度を測れるようにしました。
使ったのはフィルムではさみ込まれた「103JT」サーミスタ。
応答性が良いのです。

写真のように4点の温度を測りました。

Tt11_20231010121501
Tt12_20231010121501

・TR8の表面温度
  サーミスタのフイルムをTR表面にくっつくよう
  圧着端子でおさえました。
・TR7の表面温度
  圧着端子の円筒圧着部にサーミスタを挿入して
  シリコンゴムで固定。
  これをTRにネジ止めします。
・ヒートシンク表面温度。
  TR7とTR8の間のネジ穴に、同じように作った
  サーミスタを固定。
・基準抵抗 0.1Ω 50W
  抵抗のネジ止め固定足に。

左のはサーミスタをシリコンゴムで圧着端子の円筒部
に固定。
右は直に押さえ込み。
Tt13

通電後、ヒートシンク全体が温まってきます。
10分ほど経過でTR8の測定温度が70℃を突破。
まだまだ上昇しそうです。
  この結果からファン無しという目論見は
  あきらめました。
Cap010_20231010121701

そこでヒートシンクの上にファンを乗せて冷やして
みました。

ファンを回すとヒートシンクが徐々に冷えて、全体
の温度が30℃ほど低下。
数分で安定しました。

Tt14

上にファンを置いて通風。
Tt15

※記された定格10Aを出力できなかった中華製の
 12V出力スイッチング電源
Tt21
   とりあえず100Wはクリア

| | コメント (1)

2023年3月23日 (木)

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)でゼロ除算エラー発生(の可能性)。

 

| | コメント (2)

2023年3月21日 (火)

A/Dコンバータでサーミスタの抵抗値を読む サーミスタをつなぐ場所は?

私の場合、サーミスタ読み取りのための接続は、
基準抵抗をVref側に持ってきます。
こんな具合。

A01_20230321164901
こうすると、サーミスタの片方をGNDにできるので
シールド線が使えます。
この場合、温度が上昇するとサーミスタの抵抗値が
下がり、それに連れてA/D値も下がってしまいます。

温度が上がるとA/D値が下がってしまうので、直感的に
これを嫌う方が居られるのでしょうか、こんな具合に
基準抵抗をGND側につないでいる回路例を見かけます。

A02_20230321164901
こうすると、
 温度が上がる
   ↓
 サーミスタの抵抗値が下がる
   ↓
 A/D値が上がる
と、温度上昇でA/D値が上昇と、まぁ見た目の感覚に
合うような気がします。
しかしちょいと問題が・・・

RaあるいはRbの値を固定して、その時のA/D値から
反対側の抵抗値を計算する方法を見てみましょう。

VrefとVin、そしてRaとRbの関係式です。
A2_20230321165001
VrefとVinは何ボルトという実値でなくてもかまいません。

Vinは「ゼロ~フルスケール」。
8bitのADCなら「0~255」、10bitなら「0~1023」と
いう範囲の値になります。
そして、Vrefは「フルスケール値 + 1」

まず、サーミスタをGND側につないだ時
Raが基準抵抗。 Rbがサーミスタ。
VinからRb値を計算します。
A4_20230321165201

分母の「Vref - Vin」に注目。
サーミスタがGNDに短絡して0ΩになってVin=0になると
分子がゼロでRb=0が出てきます。
そして、分母はVrefそのもので計算可能。

サーミスタ入力がオープンになってVinがフルスケールに
なっても、分母の「Vref - Vin」は「1」になって計算可能
です。
  ※Vref=フルスケール値 + 1 が重要!

問題がサーミスタを電源側につないだ時の計算。
基準抵抗がGND側。
Raがサーミスタ。 Rbが基準抵抗。 
A3_20230321165401
サーミスタ入力がオープンになると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 問題】だけじゃなく【ゼロ除算問題】が
  見えてきました。

| | コメント (0)

2023年3月19日 (日)

トラ技の目次検索 『サーミスタ』

サーミスタでの温度測定に役立ちそうなトラ技の目次検索結果です。
「※」の行が私のコメント。
~~~~~~~~~~~~~~~~~~~~~~~
●1982,7,サーミスタ温度センサの応用,,特集,244,10,土屋憲司
 ※実温度との校正手法。
  区間B定数を計算してその値を表に。

●1986,6,サーミスタと温度計,センサ回路設計ノート,連載,423,10,土屋憲司
 ※サーミスタに関する3つの基本公式の解説。
  温度,抵抗,B定数。

●1988,3,センサ回路の設計,白金測温抵抗体/サーミスタを効果的に使うために,特集,408,13,上窪 兼/土屋憲司
 ※サーミスタの抵抗変化を周波数に変換する回路。

●1993,7,温度センサの基本的な使い方,基本的な温度センサ ~サーミスタ,白金測温抵抗体,熱電対~,特集,228,16,松井邦彦
 ※熱放散定数,熱時定数の解説。

●1993,7,サーミスタの使い方と温度コントローラの設計法,サーミスタの使い方から安全な回路の構成法まで,特集,278,10,土屋憲司
 ※温度コントローラへの応用。
  1988年3月号の周波数に変換回路が再登場。

●2003,1,抵抗1本でリニアライズし電圧から温度を直読できる! サーミスタ室温計の製作,作りながら学ぶ初めてのセンサ回路<第1回>,連載,115,6,島田 義人
 ※103ATを使ったアナログ出力温度計回路。
  リニアライズの方法,

●2003,12,温度センサとセンサICの実用知識,熱電対,測温抵抗体,測温用サーミスタ,ワンチップ温度センサICなど,特集,143,16,小川 実吉/幾島 康夫
 ※温度測定ICの一覧。

●2004,7,無調整多点温度計の製作,本誌4月号付録マイコン基板とサーミスタを使った,一般,253,7,北野 優
 ※H8/3694マイコンのADCで4ch入力,
  103AT,103JTサーミスタを使用。
  エクセルでデータテーブルを作る。
    液晶モジュールをR/W制御有の
    4bitモードで使いながら
    DB0~3をGNDにしてる。

●2004,11,センサ・インターフェースの設計,C言語/OS/ICEを使って最先端の開発にチャレンジ 新世紀 マイコン教室〈第6回〉,連載,273,7,北野 優/中林 歩
 ※リニアライズの方法。
  エクセルで折れ線近似。
  回帰分析による手法。

●2009,2,乾電池動作のサーミスタ方式風速計,ノイズ対策のフィルタにDSP機能を活用する,一般,246,8,高野 慶一
 ※2つのサーミスタ(測温用と加熱用)の温度差から風速を推定

●2009,12,サーミスタ活用のコモンセンス,マイコンと組み合わせ使いやすさ向上,一般,176,4,野尻 俊幸
 ※サーミスタの一般的な話。
  電子体温計への応用(ブロック図的解説)。

●2012,7,高精度NTCサーミスタ NCP15XH103F03RC,私の部品箱〈8〉 温度モニタや温度特性の補正に便利! 20年以上愛用,連載,222,1,細田 隆之
 ※A-D入力回路例。

●2012,1,アナログ2 : 計測&センサ,誤差やICの取り扱いでエライ目に遭ったベテランのひと言,特集,82,12,荒木 邦彌/石井 聡/鈴木 正俊/中 幸政/星 聡
 ※3-6 抵抗分圧比をA-D変換するときの基準電圧ICは無駄使い。
  Vref電圧に関係なくサーミスタの抵抗を測定。
  A-Dコンバータの出力コードが1LSB変化するときの
  温度変化量のグラフ。
     (2^N - 1)と間違った式が記されている。

●2015,5,高感度温度センサ「サーミスタ」,研究室で役に立つ!センサ応用回路集〈2〉,連載,163,6,松井 邦彦
 ※誤差を生む自己加熱,熱時定数,公称値のばらつきを解説。

●2020,7,,入門19 サーミスタを利用した温度計測,特集,62,2,小川 敦
 ※簡易リニアライズの方法とその結果。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
※1982年7月号
この記事に載っていた「区間B定数を算出」する
という考え方が面白かった。
「温度・抵抗値表が神様」という温度算出方法に
つながる。
温度・抵抗値表を、計ったサーミスタの抵抗値で
スキャンし、そこから区間B定数を算出。
温度範囲の狭いB定数を使うことで温度計算の
精度が向上。
一般記事で解説されている25℃~85℃という
広い温度範囲(60℃)ではなく、B定数算出の
温度範囲を狭くすることで、ずいぶん誤差が
減らせる。

2021年8月4日:103JTサーミスタ対応温度計 ArduinoとLTC2460を使って

| | コメント (0)

2023年3月 8日 (水)

こんなところに「256-1」が

トランジスタ技術2012年1月号
特集が「エレクトロニクス格言集」
その中の第3章 アナログ2:計測&センサ

・3-6 抵抗分圧比をA-D変換するときの
    基準電圧ICは無駄使い

Ad12

サーミスタの抵抗値を直列に入れたRpの値から
求めようという手法の解説です。
抵抗の算出式から基準電圧値は不要で、
ADCの分解能が分かれば良いと。

この「?」と記したところに「2^N - 1」が出現!
8ビットA-Dなら255に、10ビットなら1023にという
ことなんですが・・・これは間違い。
フルスケール値 + 1、つまり分解能で計算しなくては
なりません。

これだとA-D値が1/2(半値)になるとき、「Rx = Rp」
となりません。

で、仮にADCが8ビットとすると
  Nx = 255 * Rx/(Rx+Rp) これを変形していくと
  Rx = Rp * (Nx / (255 - Nx))

Rx 未接続のとき、つまり∞の時。
この時のA-D値はフルスケールになってNx=255
すると、分母の (255 - Nx) がゼロになってしまい、
DIV0エラーに!

255じゃなく、256だと 256 - 255 = 1で
 Rx = Rp * 255。
Rp値の255倍以上の時(無限もOK)に
A-D値255が出てきます。

ということで 「2^N - 1」は大間違い。

半値や1/4値、3/4値で確かめれば「なんかおかしい」
っと思うはずなんですが・・・。

| | コメント (0)

2022年10月 6日 (木)

5chサーミスタ温度計のA/D入力、map関数を使って補正

スカタンな応用例ばかり出てくるArduinoのmap関数
サーミスタ103JTで計った温度をシリアル出力 でのA/D変換値補正
で使ってみました。

まず、A/D入力電圧実測値と基準電圧値から真のA/D値を計算します。
  ツールはデジタルテスター。
  それと電圧発生器、あるいは抵抗を組み合わせて
  安定した入力電圧を得ます。
マイコンにはその時のA/D値をシリアル出力させます。
0に近いある値と1023に近いある値の2点をチェック。
どちらも同じなら補正の必要はありません。
ちょっとのズレなら「直線補間」の出番です。

今回の回路、サーミスタをつなぐch1~ch4はポートAでしたが
ch5だけがポートB。
この間でちょっとズレが出ていました。
まず0Vに近い方。
正値20に対してch1~4が17と-3。
ch5が16と-4と低めの値が出ていました。
フルスケールに近い方は、正値991に対して
ch1~4が992にと+1。ch5は誤差なし。

パラメータのテーブルにはこれらの値を10倍して設定します。
  ※浮動小数点にするとメモリーを食うので。
読み込んだA/D値も10倍してmap関数に食わせて補正を
行い、出てきた値の1の位を見て四捨五入。
10倍することで四捨五入の処理ができます。

これで、ずいぶんと温度測定の調子が良くなりました。
サーミスタの抵抗が低くなる高温域ではA/D値が小さくなります。
A/D入力電圧の低いところで誤差が生じていたのでこの補正が
うまく働いたのでしょう。
80℃付近ではA/D値の1bitが0.3~0.4℃の差になります。

map関数の応用例ということで、ご覧下さい。

//  A/D補正パラメータ
// 四捨五入のためA/D値を10倍にして
// x0とx1に実測値を設定する
// Rs = 10kΩで
// Lo側 200Ωでy0=20  Hi側 300kΩでy1=991
const struct{
const word x0; // in min (Lo)
const word x1; // in max (Hi)
const word y0; // out min
const word y1; // out max
}adj_tbl[] PROGMEM = {
{ 170, 9920, 200, 9910 }, // ch1 ADC1 PA1
{ 170, 9920, 200, 9910 }, // ch2 ADC2 PA2
{ 170, 9920, 200, 9910 }, // ch3 ADC3 PA3
{ 170, 9920, 200, 9910 }, // ch4 ADC7 PA7
{ 160, 9910, 200, 9910 }, // ch5 ADC8 PB0
};
/***** 線形補間 *****/
long map(long x, long in_min, long in_max, long out_min, long out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
/***** A/D値補正 *****/
// in ad : 0~1023 A/D値
// ch : 0~4 ch1~ch5
// 10bitの範囲でリターン
word adadj(word ad, byte ch)
{
long a, d;
a = map((long)ad * 10L, // 線形補間
(long)pgm_read_word(&adj_tbl[ch].x0), // in_min
(long)pgm_read_word(&adj_tbl[ch].x1), // in_max
(long)pgm_read_word(&adj_tbl[ch].y0), // out_min
(long)pgm_read_word(&adj_tbl[ch].y1)); // out_max
d = a / 10; // 1の位で四捨五入 10の位を+0か+1,-1
if(a >= 0){ // プラス
if((a % 10) >= 5) d++;
}
else{ // マイナス
if(((-a) % 10) >= 5) d--; // 正にして1の位で判定
}
if(d < 0) d = 0; // マイナスは0に
else if(d > 1023) d = 1023; // 最大は1023
return (word)d; // wordにしてリターン
}


5chの温度測定で重要なのが「Rs」=「神様抵抗」。
今回の製作では「0.1%」精度のを使ったので、
補正テーブルの「y0、y1」(out_min、out_max)は5chとも
同じになっています。
Rsの誤差は、この値の変更で吸収できます。

使っているAVRマイコンは14ピンのATtiny841。
ROMが8kバイトにRAMが512バイト。
現在のプログラムサイズが3826バイト。
このうち2048バイトが10bit ADC→0.1℃温度データ
の変換テーブル。
プログラムは実質1778バイト。BSSエリアが58バイト。

浮動小数点使わず。sprintf使わず。
この結果だと。

ROM、RAM容量半分のATtiny441にも入るかしら。

| | コメント (0)

2022年10月 5日 (水)

サーミスタ103JTで計った温度をシリアル出力

サーミスタ103JTで計った温度をアナログ出力
この製作で使ったマイコンは8ピンのATtiny85
内蔵タイマーが8ビットで、PWM出力でD/Aするには
分解能不足。
そこで、DACを使ってアナログ電圧を出力しました。

今回の「ダイソー ミニケース 5個組」を使った工作
やはりサーミスタ103JTを使った温度計なのですが、
シリアル出力でデータを得ようと目論見ました。

14ピンのATtiny841を使って、5つのサーミスタを
つなげられるようにしています。

ブロックダイヤグラム
C51_20221005170901
1秒間隔で測定値を出力します。
先頭が6桁数字が連番。
  データ抜けをチェックできます。
スペース区切りで5つの温度を出力。

セミテックの103JT温度・抵抗値表が元データ。
-30.0℃~125.0℃をテーブルにしています。

  ※10bit A/D値から温度データテーブルを
   直に呼び出すことで、浮動小数点関数計算
   を使わなくて済みます。
   ATtiny841のROMサイズは8kバイトしかあり
   ません。
   浮動小数点や「sprintf」による数値→文字列
   変換関数を使うと、ROM領域が足らなくなって
   しまいます。
   可能ならROM半分のATtiny441でも動くようにと。

ところが・・・ここでも失敗に遭遇。
  ATmega328Pを使ったピピちゃん温度計
では、外に取り出した内蔵基準電圧1.1Vを使っての
サーミスタ抵抗測定がうまく行ったので、ATtiny841でも
大丈夫だろうと考えたのです。

  ※ATtiny841と同じ14ピンのATtiny84は
   内蔵基準電圧を外に取り出せない。
   そして、外部からの基準電圧も2.0Vが
   最低というスペックで断念。
   ・回路設計はデータシートの熟読から。 スペックをちゃんと調べろ!

こんな接続をしたかった。 (ATmega328Pでは実績あり)
C52_20221005171201
ATtiny841のAREFピンからちゃんと1.1Vは出てきました。
これを低オフセット電圧のオペアンプでバッファします。
しかし、この出力を「神様抵抗」のプラス側としてA/D変換
すると・・・オープンにしても(10kΩでAREF電圧につながる)
フルスケールの「1023」が出てこないのです。
5つのチャンネルとも、計算値より低い値が出るのです。
フルスケールに近い電圧の高い所だと2~3。
電圧が低い所だと、3~4、出てくるA/D値が小さいのです。

全体に下へシフトしてる感じです。
  ※ATmega328Pではこんなことには
   ならなかった・・・

そこで、外部から基準電圧を供給してみることに
しました。
  ※基準電圧を出力するAREF端子。
   ノイズ低減のためにパスコンを入れる
   ためのもの。この電圧出力を利用
   できるとは、データシートには記され
   てない。
  ※ATtiny85や84では2.0Vが最低電圧
   という制限あり。
C53
そうすると大丈夫に。
  ※完璧に誤差がないというわけではく
   そこそこエエ感じ。

ということで、
 「同じシリーズのチップでうまいこと行った
  経験があっても、始めて使うチップは、何が
  あるかわからへんでぇ」
と、あたりまえの結果に。

ダイソーのプラケースに入れるとこんな感じ。
Cc1_20221005171601

  ※L型ダブルのピンヘッダーが無かったんで、
   オムロンのツメ付ヘッダーを切断改造。

| | コメント (0)

2022年10月 3日 (月)

サーミスタ103JTで計った温度をアナログ出力

失敗談、2022年9月28日:回路設計はデータシートの熟読から。 スペックをちゃんと調べろ!
この発端の製作物です。

「温度→電圧」変換はLM35やTMP35あたりのセンサーが
便利なんですが、ブツに接触させて温度を測るときにちょいと
問題があるんです。
 ・形状のせいか応答が遅い。(TO-92パッケージ)
 ・足から熱が逃げるのか、低い目の温度が出る

  ※型番、LM35は、昔はナショセミ。今はTIに。
   そしてTMP35はアナログ・デバイセズに。
   ややこしいぞ。

応答が早くて間違いなくブツに接触できる温度センサーという
ことで、「セミテックのサーミスタ103JT」を使って、
 ・センサーの抵抗値から温度を算出。
 ・温度をD/A出力。
という方法で、アナログ値を得るようにしました。
  ※単純なことをするのに、むちゃたいそうな回路。

Tn85_thm1

ATtiny85を選んだんがそもそも失敗。
でも、作りかけたんで、完成形に仕上げてみました。

測定温度範囲は0~80℃。
10bit分解能のA/Dで温度を得てますんで、分解能は
ざっと0.1℃。
これを0.0V~4.0Vの電圧に変換します。
1℃あたり0.05Vのスケールです。

AVR studioでプログラムを組んでます。
フォルダーごと圧縮。
   ・ダウンロード - thm_85_da1.zip

10bitのA/D値から2kバイトのテーブルで温度に変換
という手抜き手法。
複雑な算術関数は使っていません。

回路を組み込んだプラケースはダイソーの「ミニケース5個組」
M31
M32

この回路の電源は、
Arduino-UNO 12bit×4chアナログ SDカードデータロガー完成形
から供給します。

さて、温度センサーIC:LM35(TMP35)とサーミスタ103JTの
違い、どんなもんかと調べますと・・・

15Ωのホーロー抵抗の側面にセンサーをくっつけて、
抵抗を通電して発熱させます。
その時の温度変化を電圧として記録しました。

M11_20221003101301

M12_20221003101301

まずは、センサーを軽く貼り付けした状態から。
M13_20221003101301
すると・・・
Cap004_20221003101401
センサーICとサーミスタの出力に差が生じます。
時間が経過してもそれが埋まりません。

M14_20221003101301
テープでぐるぐる巻きにして、温度が逃げないように
したつもりでも・・・
Cap005_20221003101401
途中で段ボール箱をかぶせましたが、時間が経っても
2℃くらいの差が埋まりません。

そこで、2017年11月6日:液晶表示器「焼き鈍し」
で使った「保温箱」で試してみました。
この2種以外にも、センサーICとサーミスタを加えます。
M21
2と4が今回のセンサー。
1はセンサーICの外周を熱収縮チューブで覆っています。
4は同じ103JTですが、先端近くまで熱収縮チューブが来ています。

センサー部分はむき出しのまま、電線のところでマスキングテープを
巻いてまとめました。

65℃で保温された箱の中に投入しますと、数分で4つとも温度が
安定、収束します。
  ※電線部分、およそ20cmは保温箱の中に入っていて、
   先端のセンサー部と同じ温度になっているかと。
Cap006_20221003103401

また、4つのセンサーを箱に入れたまま、箱を室温
から加熱した場合も20分ほどで65℃に到達し、
その後の温度差はそれほど感じません。

Cap007_20221003103401
  赤:保温箱温度制御センサー
  緑:サーミスタ 4
  青:サーミスタ 3
  マゼンタ:センサIC 2
  シアン: センサIC 1

発熱体に直接接触させて温度を測る場合と、周囲の空気ごと
温度を測るということで差が生じるのでしょう。

このあたりをもうちょい勉強しようとすれば、何を
調べれば良いでしょうか?

| | コメント (6)

2022年9月29日 (木)

103JTサーミスタの自己発熱。 5Vで10kΩはちょっとなぁ

前記事2022年9月28日:回路設計はデータシートの熟読から。 スペックをちゃんと調べろ!
は、サーミスタを使った温度測定に絡みます。

Arduinoにサーミスタをつないで温度測定・・・
複雑な計算式も入るし、サーミスタを指で触れば温度変化が
出てくるし。
マイコンを活用してる気分になれます。

しかし・・・ちょっと待てぇ
  そのやり方は正しくない。
  サーミスタが持つ性能をつぶしているぞ。
という例を見かけるのです。
  ネットでも初心者向けの本でも。

安価で入手しやすいからとよく出てくるのが
セミテックの「103JT」
  応答性が良いので私も愛用しています。

このサーミスタの特性を分かって「こんなもんだ」と
使っているのなら仕方ないのですが、きっと分かって
ないのだろうなぁというスペックが「熱放散定数」。

サーミスタに電流を流した時、その消費電力で自分が
発熱してしまい、測定温度に誤差が生じます。
その影響度合いで、単位が「mW/℃」。
「ンmWの測定電力で1℃上がる」という指標です。
103JTだと「約0.7mW/℃」というスペックが出ています。

  ※形状の大きな103AT-11だと3mW/℃、
   103AT-2だと2mW/℃。
   大きくなると頑丈になりますが、応答が
   遅くなります。

103JTの約0.7mW/℃、これ、なかなかキツいスペックなんです。
よく出てくる例がこの図のような接続。
【図1】
T1_20220929114401
サーミスタに直列に10kΩの抵抗を入れて5V電源に接続。
ArduinoのADCは、基準電圧=5Vで変換。
   ※
サーミスタを使って温度測定という解説記事、
    たいていはこれ。

これだとどうなるか。
サーミスタの抵抗値とRsが同じ値になったときが
最大の消費電力になります。
   ※103JTだったら10kΩの25℃
どれだけの発熱があるかをグラフに。
Cap036
各温度での抵抗値からサーミスタの消費電力を算出し、
熱放散定数で温度上昇を計算しました。
  ※5Vだけでなく、3.3V、2.5V、2.0V、1.25Vの
   電圧の時も示しています。

測定電圧=5V、Rs=10kΩだと10~40℃の温度域で
およそ0.8℃の温度上昇が生まれると。
Arduino UNOの10bit ADCだと、0.1~0.2℃が
分解能です。
それに0.8℃が積み重なるのは・・・ちょっとなぁ。です。
  ※これをどうにかしたいと思うか、
   こんなもんでエエやんと置いとくか・・・

この温度測定方法でサーミスタの消費電力=発熱を
減らすには・・・
 ・測定するときだけ通電する
 ・測定電圧を下げる
 ・Rsを大きくする
この3つです。

Rsを変えた時の様子がこのグラフ。
15kΩと20kΩにした時の発熱です。
Cap037
Cap038
Rsを大きくするより、サーミスタへの供給電圧を
下げる方が効果があります。
   (電力の計算式 ExE/R、IxIxR)

※Rsを4.7kΩにしたら・・・
Cap001_20220930145401
40~50℃あたりで、自己発熱が1.9℃ほど積み
上がってしまいます。

~~~~~~~~~~~~~~~~~~~~~~~~
サーミスタへの供給電圧を下げての測定方法、
どんなのが・・・
例えば、こんな回路。
【図2】
T2_20220929114901

サーミスタへの供給電圧とA/Dコンバータの基準電圧
を分けてやると、測定温度範囲が自由に決められます。
ところが、この回路だとやっかいな問題が出てくるの
です。
VthmとVzが変動したら、それが測定系の誤差に
つながります。
サーミスタの抵抗値を正しく算出するにはVthmとVzの
絶対値が必要なのです。
どちらかの電圧が動くとアウト。誤差が生じます。
  ※動くなら二つが比例して。
  ※VthmをそのADC測定系で計るのも方法。

それを改善するのがこの方法。
【図3】
T3

【図1】は5V電源でしたが、ADCの基準電圧と
サーミスタへの供給電圧を両方とも下げて発熱を
防ぎます。
二つを同じ電圧にというのが重要で、サーミスタの
抵抗値はRsを基準に算出でき、Vzは計算式から除け
ます。
このRsは「神様抵抗」(俺が正しい!)となります。

Arduino UNOで使っているATmega328Pマイコンのように
Vref電圧が外に取り出せるなら、こんな方法も可能です。
【図4】
T4
Arduino UNOだと「1.1V」が取り出せます。
  ※測定電圧が低い方が自己発熱が小さくできる。


サーミスタを使った測定で、もう一つのグラフを示しておきます。
ADCの分解能を変えた時、測定温度の最小値がどう変化するかを
描いています。
神様抵抗Rsを10k、15k、20kにした時を計算してみました。
Cap039_20220929115501
Cap040_20220929115501
Cap041_20220929115601

Arduino UNOの10bit A/Dだと、常温域で0.1~0.2℃の
分解能がギリギリになることが見えます。
発熱の影響を小さくしようと、Rsを大きくすると、
サーミスタの抵抗値が小さくなる高温域での分解能が
落ちてしまいます。
  ※Vz=ADCの基準電圧=Vthmとしてのグラフです。
   Vz=Vthmが変わっても分解能は変わりません。

 

※関連
2021年8月11日:サーミスタ温度計、何ビットのA/Dコンバータがいるか?
2021年7月31日:16bit A/Dコンバータ LTC2460 サーミスタ103JTを使った温度測定で・・・
2018年2月13日:ピピちゃん温度計・ヒータ制御

※ネット検索
ラジオペンチ:Arduiono を使ってサーミスタで温度を測る(2019-11-08)
ラジオペンチ:ペルチェ温度コントローラーの製作 (温度センサーをサーミスタに変更)(2019-11-11)
セッピーナの趣味の天文計算:サーミスタで正確な温度を測るコツ - 基準抵抗(R0)、B定数、熱拡散係数(2015年2月18日)
マカロニペンギンの健忘録:#arduino で温度測定-自己発熱対応版(2011年11月17日)

あれこれ見てますと・・・
サーミスタの抵抗測定の手順で、A/D電圧を求める時、
件の「1/1023」 が多く出現しています。
例えば、
Decent dress:Arduino Nano と NTCサーミスタで温度計測 (2018/11/29)

本来、Rsを神様抵抗としての測定系では、A/D変換の
基準電圧値は数式から除外されます。
しかし、電圧計算の1/1024を1/1023にしてしまうと
「‰」単位の誤差が生じます。   ※10bitのADCで

jh4vaj:Arduinoでサーミスタを使って温度計を作るのに、電圧を求める必要はない(2021/3/9)
jh4vaj:ArduinoのADコンバータ、1023?1024?( )

| | コメント (0)