温度センサ LM61C の出力を Arduino UNO (R3) に渡すための DC 増幅器を考えてみようと思います。
前回までに、基本的な増幅回路と電気的特性なんかを確認してみましたが、まだまだわからないことばかりです。合わせてどうぞ。
DC 増幅回路を設計する
温度センサ出力
温度センサ LM61C の出力電圧は、温度 -30℃ のとき +300mV、+100℃ のとき +1600mV で、1℃ あたり 10mV の検出感度です。したがって、温度を T [℃] とすると出力電圧 VI [V] は、
VI = 0.01・T + 0.6
の式で表されます。
出力インピーダンスは 800Ω となっていますが、条件によっては 5KΩ です。出力段は NPN トランジスタのエミッタフォロワ回路で、出力電流は 10mA (ソース) です。
増幅率とバイアス電圧
Arduino UNO (R3) の AD コンバータの分解能は 10 ビットなので、0~5V の入力電圧が 1024 の数値に変換されます。そこで、0~50℃ の温度信号を 0.5~4.5V の電圧にして Arduino UNO (R3) に入力することにします。
LM61C から出力される電圧は 0℃ のとき 0.6V、50℃ のとき 1.1V です。これを 0.5~4.5V にするので増幅率 GV は、
GV = ΔVO / ΔVI = (4.5 - 0.5) / (1.1 - 0.6) = 8
図1 のようなグラフにするとイメージしやすいです。このグラフの式は、
VO = 8・VI - 4.3
VO は増幅器の出力電圧、VI は LM61C の出力電圧、つまり増幅器の入力電圧です。
VO が 0V のとき VI は、
VI = (VO + 4.3) / 8 = 4.3 / 8 = 0.54 [V]
これがバイアス電圧となります。
入力インピーダンスは 1MΩ とします。また、出力電圧を最大 5V に制限する必要があります。
AD コンバータの出力数値と温度算出式
増幅回路から出力された 0.5~4.5V の電圧 VO を Arduino UNO (R3) のアナログピンに入力します。AD コンバータの LSB (最小分解能幅) は 5/1024 ですので、デジタル変換された数値 DV は、
DV = (1024 / 5)・VO
です。これに上の式を代入して温度 T [℃] を求めると、
DV = 16.384・T + 102.4 より T = (DV -102.4) / 16.384
Arduino UNO (R3) のスケッチでこの式を計算すれば、温度が算出されます。
回路図
温度センサ LM61C の出力を Arduino UNO (R3) に入力する DC 増幅器として、図2 のように回路を作りました。いつものように、俺の計算は大雑把でテキトーです。
温度センサ LM61C の出力をオペアンプ U2A (LM358) に入力します。入力インピーダンスを 1MΩ とするために R5 を入れてあります。LM61C の出力インピーダンス ZO と C6 はローパスフィルタを形成します。出力インピーダンスを 5KΩ とするとカットオフ周波数 fC6 は、
fC6 = 1 / (2π・ZO・C6) = 1 / (2π x 5 x 103 x 0.1 x 10-6) = 318 [Hz]
LM61C の温度時定数は数秒のオーダーですので、影響はありません。
R4 は入力バイアス電圧のキャンセル抵抗です。
R4 = R7・R9 / (R7 + R9) = 68 x 10 / (68 + 10) = 8.7 [KΩ]
E6 系列から 10KΩ としています。
ボリューム RV1 は増幅率の調整用です。オペアンプ U2A の最大増幅率 GVmax は、
GVmax = 1 + (R7 + RV1) / R9 = 1 + (68 + 5) / 10 = 8.3
同様に最小増幅率は GVmin = 7.8 です。C8 はなくてもいいんですが、ノイズ除去用としていれてあります。R7、RV1 とローパスフィルタを形成し、カットオフ周波数 fC8 は、
fC8 = 1 / {2π・(R7+RV1)・C8} = 1 / {2π x (68 + 5) x 103 x 0.1 x 10-6} = 21.8 [Hz]
C8 はもっと小さくていいのですが、バイパスコンデンサなどに合わせて 0.1μF にしました。
オペアンプ U2B はバイアス電圧用のバッファで、RV2 によりバイアス電圧 0.54V を分圧調整しています。C9 はノイズ除去用です。バッファはなくてもよいかもですが、回路が余ってますので。
オペアンプの出力電圧は AD コンバータの入力電圧である 5V 以内としなければいけません。電圧リミッタとかも考えたのですが、オペアンプの電源電圧 VCC を +6.5V にすることにしました。三端子レギュレータ NJM317 を使用し、R1、R2、R3 をカットアンドトライで決定して、VCC は実測値で 6.36V となっています。データシートの回路例では抵抗器に 10mA 流していますが、負荷電流が小さいので 1mA 程度でもいいかなと思っています。オペアンプの最大出力電圧は 4.94V で、5V 以下になっています。
Arduino UNO (R3) のアナログピンのコンデンサ C7 は出力インピーダンスを下げる働きをし、AD コンバータ内部のコンデンサ CS/H の充放電を補助します。これも 0.1μF に合わせました。
LM61C とバイアス電圧用の電源として Arduino UNO (R3) の +3.3V 出力を利用しました。電源入力 VIN のダイオード D1 は電源の逆流防止用です。
Arduino スケッチ
Arduino の簡単なスケッチを描いて、シリアルモニタに温度を表示できるようにします。
- // LM61 thermometer v.0 2024.3.16 meyon230
- const byte inputPin = A1;
- void setup() {
- Serial.begin(9600);
- }
- void loop() {
- static int digitalValue = 0;
- static float temperature = 0;
-
- digitalValue = analogRead(inputPin);
-
- temperature = (digitalValue - 102.4) / 16.384;
-
- Serial.print(digitalValue);
- Serial.print(" ");
- Serial.println(temperature);
-
- delay(500);
- }
説明することもないです。13行目で DC 増幅器からの信号を読み込み、15行目で温度を算出、17~19行目でシリアルモニタに出力しています。
調整と測定データ
調整方法
増幅器の調整をしましょう。
調整用に適当な分圧回路を作って 0~1.2V ぐらいを出力できるようにし、増幅回路に入力します。
まず、入力電圧が 0.6V のとき増幅器の出力電圧が 0.5V になるように RV2 でバイアス電圧を調整します。次に、入力が 1.1V のとき出力が 4.5V になるように RV1 で増幅率を調整します。これを何回か繰り返します。
図1 のグラフでわかるように、増幅率は傾き、バイアス電圧は切片を調整することになります。
増幅器の出力電圧が調整できたら、シリアルモニタで入力電圧 0.6~1.1V が温度表示 0~50℃ になっていることを確認します。ぴったりというわけにはいきません。適当に再調整して、適当に妥協しましょう。
測定データ
図3 は、調整用の入力電圧に対してシリアルモニタに表示された温度のグラフです。
0℃ 付近がまだ調整しきれてないみたいですが、50℃ はいい感じです。中間の 25℃も大丈夫でしょうか。直線性も悪くはなさそうです。
下限はバイアス電圧で制限されます。上限はオペアンプの最大出力電圧です。こちらは AD コンバータの入力電圧を超えてはなりません。
調整用のボリュームは手元にあったものを使用したので細かい調整が難しいです。定数を検討して、多回転型にしたほうが良さそうです。
では、温度センサー LM61C を取り付けて ……
あれ?部品箱に LM61C が見当たらない。どこへやっちゃんたんでしょ? 探さないと。
いやぁ、探しものは自立神経を乱します。
やめましょ。
後記
締まらない話になってしまいましたが、アナログ信号を DC 増幅して AD コンバータに入れるという目的はうまくいったように思います。回路や定数についてはまだまだ悩みどころが多いですが、簡単に使うにはまぁ、こんなもんでしょ。
では次は、やっぱり AC 増幅器ですねぇ。オーディオにはあまり関心ないのですが、無線用の低周波増幅器とか考えてみたいです。