LCメーター(電卓LCD使用)
おじさん工房 TOP へ
◇ LCメーター回路図
◇ AVR Cプログラムソース(ITRON風OS含む)
2005/09/20 以前よりLCメーターを作りたいと思い、いろいろ回路を考えていました。 普通のLCメーターのように交流電圧と電流の振幅、位相を測ってインピーダンスを計算するのが一番精度が出るのでしょうがいかんせん回路規模が大きくなってしまいます。 (多目的測定器で使ったベクトル検波器を使えばそれほど大規模にならないと思いますので、そのうち試作したいと思っています)
簡単に作るには発振周波数からLとCを計算するのがよいと思い発振回路をどのようにしようか考えていました。 ウェブをつらつらながめているとLCメーターを作っているサイトがありました。 ここでは回路図も公開されておりLM311(コンパレータ-)を使った簡単な回路でした。
早速LM311で発振回路をつくり実験してみましたが、電源電圧3V以下では発振しません。 電卓のLCDを表示に使おうと思っているので2V程度まで発振する必要があります。
LM311の発振回路はフランクリン型の変形のように見えますのでCMOSのTC7WU04を使ったフランクリン型発振器(トラ技2003年8月号参照)を試して見たところ1.6V程度まで安定に発振することが分かりこの回路を使ってLCメーターを作ることにしました。
■発振周波数考察

発振回路部分を抜粋したのが左図です。
発振回路を使ってLCメーターを作る場合、発振周波数がいわゆる
1/(2π√(LC))
からずれていることを考慮する必要があります。
浮遊容量と増幅回路(TC7WU04)の伝播遅延(位相差)がその主なものです。
浮遊容量は上記LCメーターと同様に値のわかっているコンデンサ(C2)を並列につないだときの周波数変化から補償すれば取り除くことができます。
しかし伝播遅延は電源電圧、アンプ入力の振幅によって変化し計算上発振周波数に数%の誤差を生じます。
発振必要条件は入力からアンプをとおってLCの回路をとおって再び入力に戻るまで360°の位相差とゲイン=1です。
R3−L1//C1の部分はL1//C1の共振周波数で位相は0°になりますが実際の発振はアンプの伝播遅延の分ずれてトータルの位相差が360°となった周波数になります。 ゲインは飽和していますから自動的に条件を満たします。
この実際の発振周波数foscはLとCによる共振周波数をflcとしたとき、
fosc=flc*(R/(Tpd/C+R))
となります。
この式をみるとRを切り替えることでTpdを測定できそうです。 ところが実際にRを10Kと5KにしてTpdを測定しみましたが実測値とは合いませんでした。 実はTpdは入力の振幅に依存しているからです。 10Kのときと5Kのときでは振幅が150%に変化します。 振幅補正をすると実測値とほぼ合うようになります。
振幅補正もいれて伝播遅延を測定し補償することを考えたのですが、
・Cが大きくなると消費電流も数mA増え、電池がへたってきたときに数10mVの変動となりTpdも変化する
・これを抑えるには定電圧化するしかないが電池が3Vと低いので面倒
・Tpdによる発振周波数の誤差はシミュレーションでは測定値にほとんど影響しない程度
なのでやめてしまい単純にLCの共振周波数から計算することにしました。
結局、単純に計算すればよいのね。
■全体図

100uHのインダクターを測定しています。
使っているマイコンはAVRのAT90S8515でLCDの下に少し見えています。 ポートのほとんどをLCDにつないでいます。
タクトスイッチは電源ON/OFFとCALです。 短時間押すとCALで約2秒押していると電源OFFです。
その上にある切り替えスイッチはL測定モードとC測定モード切替です。
電池はCR2032です。 公称220mAHなので40時間ぐらいは持つはずです。
切り忘れ防止のためCALを5分行わないと自動で電源OFFします。
■LCDの裏側

使ったLCDは100円ショップで売っていた表示部が可動式になっている電卓のものです。
LCDと電卓ICの間をカッターで切断して0.26UEWで中継基板に配線しています。
この写真の1番右側を1番とし左端を27番とすると1、2、27の3本がコモン線です。 3〜25の24本はセグメント線になります。
■LCDの構造(表側から見た図)

全部で8桁ありますが途中の桁を省略しています。
1、2、27番がコモン線です。 1番のコモン線は緑色のセグメントすべてにつながっています。 2番は黄色のセグメント、27番は青色のセグメントです。
セグメントは3個づつが一緒につながっています。
表示するときはコモン線に3Vを加えセグメント線に0Vを与えるか、コモン線に0Vを加えセグメント線に3Vを加えます。 すると電圧差は3Vとなり表示(黒色)になります。
表示しないコモン線には1.5Vを加えます。 するとコモンとセグメント間の電圧は1.5Vとなり非表示になります。
要はコモン線を横線(Y)、セグメント線を縦線(X)とみなして、XとYの交差する部分にかかるコモンとセグメントの電圧差(絶対値)が1.9Vを超えていれば黒くなり、超えていなければ透明のままです。 コモン線は3本ありますので順番に走査しますのでセグメントあたり1/3の時間だけドライブしていることになります。
■実際のLCD駆動電圧(一番右にHを表示中)

LCDのドライブは1/3デューティ、1/2バイアスです。
約4msごとに3本のコモン線を順次切り替え、その後反転した電圧で順次切り替えますので約24msで一巡します。 反転するのは交流にするためで 直流を加えると劣化するためです。
コモン1でセグメント24を1−24という風に表記したとき、一番右の桁は文字"H"を表示中なので、1−24、1−25、27−24が表示、27−25が非表示です。
0− 4ms:27−24表示、27−25非表示
4− 8ms: 1−24表示、 1−25表示
8−12ms:コモン2の表示時間。
12−16ms:0−4msと同じ表示で電圧反転している。
16−20ms:4−8msと同じ表示で電圧反転している。
■ソフトウェア
自作ITRON風OSを使用しました。 ノンプリエンプティブですがスタックを消費しない(コンテキストスイッチをしない)のでAVR程度のマイコンにはちょうど良いと思います。
周波数カウンター部分は割り込み回路とタスクを協調動作させて行っています。 いままでにこのような構成のものは見たことがないのですが、簡単に正確な周波数カウンターをつくれ他の動作にほとんど影響を与えないのはメリットだと思います。
具体的には4msのタイマー割り込みで16ビットカウンターを監視しオーバーフローの回数を数えます。
タスク側ではカウンター動作をはじめる直前と終える直前にスリープモードに入り正確なタイミングで割り込みが入りカウンターの開始、終了をするようにしています。
また別のタスクではスイッチ入力を検出し、それに伴って測定開始、測定値の計算、表示(VRAMへの転送)をおこなっています。
このように処理単位ごとにタスクとしてプログラムし、それぞれが実行するタイミングをほとんど考慮する必要がないのがOSを使うメリットです。
表示データをLCDに送る(上記、信号波形を作っている)のは4msごとのタイマー割り込みルーチンの中に入っています。
なおデバッグにELMさんのところで公開されているシリアル出力ルーチンを使わせていただきました。 この場を借りてお礼を申し上げます。