2012年3月18日
ここでは、太陽電池の電圧や、充電電流を、PICマイコン(PIC16F886)内蔵のADコンバータで計測する方法を、実験をしながら考えます。計測回路では、様々な理由で誤差が発生するので、よく考えて使う必要があります。
組み立てた様子
太陽電池からニッケル水素電池に充電したり、ニッケル水素電池から負荷に放電したりする制御は、太陽電池やニッケル水素電池の電圧や、ニッケル水素電池への充電電流などを計測しながら行う必要があります。
計測の対象と目的を、以下にまとめました。
太陽電池の電圧を測ることで、ニッケル水素電池に充電できるかを判断します。
負荷へ放電中の電圧を測ることで、ニッケル水素電池を使い切ってしまったかや、太陽電池から負荷に十分な電圧が供給されているかを判定します。
ニッケル水素電池の充電電流を測ることで、充電が完了したかを判定します。
電圧や電流の量は、アナログの量ですが、マイコンで扱うためには、デジタルの値に変換する必要があります。
なるべく簡単な回路で、少ない消費電力で、正確に測れる方法がよいです。
アナログの量をデジタルに変換する方法を調べ、実験してみることにしました。
アナログの量をデジタルに変換する代表的な回路には、次の2種類があります。
アナログの電圧を、デジタルの量(数値)に変換する回路です。
以下の図では、0から4の範囲で変換できるADコンバータの、入力と出力の関係を、模式的に示しています。
入力が一定の幅変化するたびに、出力の値が離散的に変化し、階段のような形になっています。
実際には0から4ではなく、もっと多くの数値に変換できます。例えば、分解能が10bitのADコンバータでは、電圧の値を0から1023の範囲で数値に変換できます。
図:ADコンバータの機能(模式図)
アナログの電圧を、基準となる値よりも大きいのか、小さいのか判定する回路です。
結果は、「1」(大きい)か「0」(小さい)の2通りしか得られません。
以下の図では、コンパレータの入力と出力の関係を、模式的に示しています。
先ほどの階段型のグラフを、一段だけにしたのと同じです。
図:コンパレータの機能(模式図)
今回の工作では、電圧や電流を、量として扱いたいので、ADコンバータを使うことにしました。
PICマイコン(PIC16F886)には、ADコンバータ(分解能は10bit)が内蔵されているので、決められたI/Oピンにアナログの電圧をかければ、すぐに計測ができます。
ところが、実際に実験を行ってみると、計測は簡単にできるものの、計測の結果がデジタルマルチメーターで測った値とは、食い違うことが分かってきました。
簡単なようで、奥が深い回路ついて、実験をしながらいろいろと考えてみました。
図:28ピンのPIC16F886
ちなみに、このPICマイコン(PIC16F886)には、ADコンバータだけでなく、コンパレータや、シリアル通信、PWM波形生成など、多くの機能が内蔵されています。これだけ入って1個170円(「秋月電子通商」で購入当時)というのは、お買い得と言っていいのかな・・・。
ADコンバータを使う回路を組み立てる前に、考えたことを以下にまとめます。
今回の工作では、太陽電池の電圧や、ニッケル水素電池の充電電流を測ります。
ところが、PICマイコン内蔵のADコンバータで測れるのは電圧だけです。
電流を知りたい場合は、電圧に変換する必要があります。
電流と電圧を対応づける一番簡単そうな方法は、オームの法則です。太陽電池からニッケル水素電池に充電を行う回路で、以下の図のように、充電電流が流れる経路に抵抗器をはさみ、抵抗器の両端に、充電電流に比例する電圧を発生させることにしました。
この電圧を測れば、充電電流が求められるはずです。
なお、図中では、ADコンバータの入力を電圧計、太陽電池をフォトダイオードのような図記号で表記しています。
図:充電回路の模式図
電流値は、次のオームの法則から推定できます。
I(電流) = V(電圧) ÷ R(抵抗)
なお、Iは抵抗器を下向きに流れる充電電流、Vは抵抗器の両端に生じる電圧、Rは抵抗器の抵抗値を示しています。
抵抗値のRは、取り出せる電圧の大きさと、電流の流れやすさのトレードオフを考えて決める必要があります。
抵抗値を大きくすると、同じ電流であれば取り出せる電圧は大きくなりますが、負荷に対する電圧降下もそれだけ大きくなるため、取り出せる電流が小さくなり、運用に支障が出る場合があります。
抵抗値を小さくすると、電流が流れやすくなりますが、取り出せる電圧が小さくなり、計測の誤差が大きくなりやすいです。
製作する回路では、抵抗値は0.51オームとし、電流値の半分くらいが電圧値となるようにしました。
抵抗値を決めた根拠は、ニッケル水素電池から放電したときに、抵抗に発生する負方向の電圧の大きさにあります。
ADコンバータの回路は、-0.3Vよりも低い電圧をかけると、壊れる可能性があります。
放電時の最大電流を500mA程度としたかったので、そのときに-0.25V程度の発生となるように、0.51オームを選びました。
この方法では、充電電流により発生する電圧もわずかしかありません。100mAの充電電流で、わずか51mVです。
従って、計測が不正確になるリスクをはらんでいます。
また、ADコンバータにもわずかながら電流が流れますので、誤差をうむ可能性があります。測定したい電流はmA単位ですが、ADコンバータに流れる電流は高々マイクロアンペアのオーダなので、気にするほどではないようです。
ADコンバータが電圧を測るときは、測りたい電圧だけではなく、計測の基準となる電圧の入力が、もう1つ必要です。
計測の結果は、基準となる電圧に対する相対量として得られます。
測りたい電圧です。例えば、太陽電池の電圧や、ニッケル水素電池の充電電流を抵抗器で変換した電圧値のことです。
計測の基準となる電圧です。
計測したい電圧が、ちょうどこの電圧になったときに、ADコンバータから得られる値がもっとも大きくなります。
PICマイコンでの基準となる電圧は、マイコンの電源電圧をそのまま使う方法と、別の端子から基準となる電圧を入力して使う方法から、選べます。
計測したい電圧を横軸、計測の結果を縦軸に取ると、両者の関係は以下の図のように、計測したい電圧が基準電圧(5V)になったときに、ちょうど最大値の1023が得られるような直線の関係になります。
図:入力電圧と変換後の値の関係
ちなみに、実際の特性は上の図から少しずれます。なるべく、ずれの影響を受けないように回路やプログラムを作ることが大切です。
今回の工作で、基準電圧を何ボルトにするかを、考えてみました。
マイコンの電源電圧は5Vに安定化しようとしているので、電源電圧の5Vを基準の電圧として使えます。
しかし、ニッケル水素電池を使い切ったときや、太陽が出ていないときは、マイコンの電源電圧が5Vよりも低くなる可能性があります。
電源電圧が低下すると、基準電圧も下がるので、計測した電圧が何ボルトなのか分からなくなります。
基準電圧をもっと低くすれば、電源電圧の変動に強くなります。
約2.46Vを出力する、シャントレギュレータのIC(NJM1431A)を外付けして、電圧の基準として使うことにしました。
図:シャントレギュレータNJM1431A
こうすることで、マイコンの電源電圧が、約2.5V以上あれば、基準電圧源のICは約2.46Vの電圧を供給するので、太陽電池やニッケル水素電池の電圧が低下しても、広い範囲で計測の基準となる電圧を一定に保てます。
図:ADコンバータの基準電圧と太陽電池等の電圧の関係
ちなみに、基準電圧をどんどん下げれば、マイコンの電圧がさらに下がっても基準電圧を一定に保てるので、よさそうに見えますが、そうとも言えません。
基準電圧を低くすると、回路が持つ誤差が目立つようになり、計測の結果が不正確になりがちです。
たいていの物事にはトレードオフがあり、一方にばかり目をやると、他方で問題が起こるようです。
計測の対象となる太陽電池の電圧は、定格で8Vですので、基準電圧の2.46Vよりもずいぶんと高いです。
ADコンバータで計測ができる電圧の範囲は、0Vから基準電圧までです。
基準電圧よりも高い電圧は測れません。
ADコンバータに基準電圧を超える電圧を入力すると、計測結果はたいてい、最大値(1023)に固定されます。従って、基準電圧よりも高い電圧が、具体的に何ボルトなのかを知ることはできません。
また、マイコンの電源電圧を超える電圧を入力すると、マイコンが壊れてしまいます。
負の電圧は測れません。
入力すると、計測結果は、たいていは0となります。
負方向に絶対値が大きい電圧をかけると、やはり、マイコンが壊れる可能性があります。
太陽電池の電圧を測れるようにするために、次の図のように、抵抗器を2本使い、小さい電圧に変換してから測ることにします。この形の回路を、分圧回路といいます。
図:分圧回路
計測される電圧Vは、太陽電池の電圧をPとすると、オームの法則により、次のようになります。
ただしこの数式は、ADコンバータの入力回路には電流が流れ込まないことを前提としています。実際には、わずかながら電流が流れ込みますので、誤差が発生します。
今回の工作では、R1=4.7キロオーム、R2=100キロオームとしたので、太陽電池の電圧を0.0449倍して測ることになります。
ちなみに、当初はADコンバータの基準電圧を0.6Vとして設計していました。
PIC16F886には0.6Vの電圧源が内蔵されているので、ADコンバータの基準電圧に使えると考えたのです。
計測する対象は、抵抗器で0.6V未満となるように分圧しました。
その後、データシートをよく読むと、0.6Vの電圧源は、測定の対象としては使えても、基準電圧としては使えないことが判明し、先ほど紹介したシャントレギュレータ(NJM1431A)の2.46Vが新しい基準電圧となりました。
測定する電圧が、絶対量としても、基準電圧に対する相対量としても、たいへん小さくなってしまい、計測が不正確になる原因を作ってしまったようです。
作品の回路図を考え、ハードウェアを組み立てました。さらに、PICマイコンに計測用のソフトウェアを組み込んで、実験を行ってみました。
実験の目的は、太陽電池の電圧や充電電流に相当する量を、PICマイコンでどれほど正確に計測できるかを調べることです。
PICマイコンでの計測結果と、デジタルマルチメータで測った値を比較し、結果を考察します。
製作した回路の回路図を、以下に示します。
図:回路図
全体を簡単に説明すると、次のようになっています。
太陽電池は、直射日光を正面から受ければ、8Vの電圧、0.5Aの電流を供給できる定格です。
太陽電池の電圧を、R4=100キロオーム、R5=4.7キロオームとした分圧回路で、0.0449倍に下げて、「PV」という信号名でADコンバータに送っています。
負荷に供給する電圧も同様に、R6=100キロオーム、R7=4.7キロオームの分圧回路で、0.0449倍に下げてから、信号名「LV」でADコンバータに送っています。
ニッケル水素電池は、単3形で1.2Vのものを4本直列にし、4.8V 1900mAhとしました。同じものを2バンク用意しているので、あわせて8本あります。一方がAバンク(BATTA)、もう一方がBバンク(BATTB)です。
ニッケル水素電池の充電電流は、R13とR18の抵抗器(0.51オーム)を電流の経路につなぎ、電圧値に変換して、それぞれ「AI」「BI」の信号名でADコンバータに送っています。
基準となる電圧源として、NJM1431Aをマイコンにつなぎ、必要に応じて2.465V程度(±2%の誤差あり)の電圧を供給します。
計測は、PICマイコン(PIC16F886)が内蔵するADコンバータで行います。
分解能が10bitなので、計測結果の値は0~1023となります。
ADコンバータの入力ピンは多数あり、プログラムでどのピンを使って計測するかを選べるので、測定対象を切り替える回路を用意する必要はありません。
計測結果は、液晶モニタSC1602Bで表示します。
モニタは1行16文字で、2行あります。
電気二重層コンデンサを設け、ニッケル水素電池を外した状態でも、多少(数十秒間)は使えるようにしてあります。
ちなみに、回路図にある「×」のマークは、組み立てた後で不要と分かった部分です。よく考えて設計してから組み立てることは大切ですが、実際に作り始めてから気づくことも多々あります。これを、成長と言うのだろうか・・・。
ADコンバータで計測を行い、結果を液晶画面に表示する、PICマイコン(PIC16F886)のプログラムを書いてみました。
各種計測対象の電圧値を、約1秒ごとに計測して、液晶モジュールの画面で確認できます。
なお、ニッケル水素電池の充電や放電を制御する機能は、未完成です。暫定バージョンとして、充電は常にオン、放電は常にオフにしてあります。
プログラムのソースコードを以下のリンク先に示します。
プログラムは、個人的な趣味に限りお使いいただけます。
このプログラムは、MPLAB IDEというソフトウェア(マイクロチップ・テクノロジー社のホームページから無償でダウンロードできます)を使いアセンブルすれば、PICマイコンに書き込むHEXファイルに変換できます。
HEXファイルは、PICマイコンの書込装置を使えば、PICマイコンのフラッシュメモリに書き込めます。以下は、手持ちの書き込み装置の写真です。
図:PICマイコンの書込装置(PICSTART Plus)
プログラムでは、以下の計測と表示を行っています。
計測対象 | 計測方法と信号名 | リファレンス電圧 | 液晶表示 | 表示内容 |
---|---|---|---|---|
太陽電池の電圧 | 抵抗で0.0449倍に変換(PV) | 2.465V(NJM1431A) | p | 10bitのうち下位8bitを表示 |
負荷回路の電圧 | 抵抗で0.0449倍に変換(LV) | 2.465V(NJM1431A) | l | 10bitのうち下位8bitを表示 |
マイコン内蔵0.6V定電圧源 | マイコンの内蔵機能 | マイコンの電源電圧 | d | 10bitのうち上下1bitずつ取り除いた中央の8bit |
充電電流 | 抵抗で0.51倍に変換(AIまたはBI) | 2.465V(NJM1431A) | i | 10bitのうち下位8bitを表示 |
「液晶表示」は、示した文字の右側に16進数2桁で、計測データを表示することを意味します。
ニッケル水素電池をセットするなどして電源を入れると、液晶画面には、次のような表示が出ます。
図:画面表示
表示は、情報の種類を示すアルファベットと、16進数による数値を連ねたものです。
"t0015C3"は、起動してからの経過時間が、16進数で0015C3であることを示します。
"p00"は、太陽電池の電圧(PV)の計測結果が16進数で00であることを示します。
なお、右下の"x0000"は、デバッグのために、太陽電池の電圧(PV)を10bit分全て表示したものです。"p00"の部分にはない、上位の2bitも見られます。
"l20"は、負荷の電圧(LV)を示します。
"d3B"は、マイコンの電源電圧(VDD)を基準とした、マイコン内蔵の0.6V電圧源を示します。
マイコンの電源電圧が上がると、0.6Vは相対的に小さく見えるようになるので、計測結果の値は小さくなります。
"c000000"は、累積の充電電流を示します。ただし、充電電流を加算する機能が未完成なので、今は0しか表示できません。
"i00"は、充電電流(IA)を示します。
"イ"は、PICマイコンの個体を識別するために表示しています。
PICマイコンで工作を行うときは、同じ型番のマイコンを複数用意して、同じようなプログラムを書き込んで使うことが、よくあります。
マイコンにプログラムを書き込むときに、"イ"の部分がマイコンの個体毎に変わるように、プログラムの更新とアセンブルをやり直しておけば、プログラムを実行している個体がどれかを、画面表示から確認できます。
このような表示は、プログラムのバージョン毎に変えてみるのも面白いと思います。
ちなみに、「マイコン内蔵の0.6Vの電圧源」は、ADコンバータの基準電圧としては使えませんが、ADコンバータの計測対象にはできます。
この電圧源を使うと、電源電圧を推定できます。電源電圧を基準電圧として、0.6Vを計測すると、1023×(0.6÷電源電圧)に相当する値が得られます。
今回の工作では、2.46Vのシャントレギュレータを基準電圧に使いますが、マイコンの電源電圧が2.5Vを下回った場合は、正しい基準電圧とはならないです。この0.6Vの電圧源を使い、電源電圧が2.5Vを下回ったことを検出すれば、誤った計測を行わないように制御ができます。
以下に、プログラムでADコンバータを使う方法を説明します。
まず、ADコンバータで使うI/Oポートを入力に設定します。
PIC16F886のI/Oピンには、ADコンバータの入力に使えるものが11本あります。
このうち4番ピン(AN3/VREF+)は、基準電圧用(正)の接続にも使えます。
ADコンバータにつなぐピンを、入力に設定します。
bsf STATUS,RP0 ; バンク1を選択 movlw B'00101111' ; A7,A6,A4が出力 movwf TRISA ; Aポートの入出力設定 bcf STATUS,RP0 ; バンク0を選択
さらに、ADコンバータにつなぐピンを、アナログ入力に設定します。
bsf STATUS,RP1 ; バンク2を選択 bsf STATUS,RP0 ; バンク3を選択 movlw B'00011111'; AN0,1,2,3,4がアナログ入力 movwf ANSEL bcf STATUS,RP0 ; バンク2を選択 bcf STATUS,RP1 ; バンク0を選択
ADコンバータでの計測の実行は、ADCON0とADCON1のレジスタを使って行います。
定型的な処理なので、計測を行うサブルーチンを作りました。
; ADコンバータ操作 ; 入力 ; ADCON0には設定を入れてから来る(モジュールもオン) ; WレジスタにADCON1に入れたい内容をセット ; 出力 ; ADRESHにHの結果が入っている ; WレジスタにADRESLの結果が入っている ; 開始時点 ; バンク0を選択している ; 終了時点 ; バンク0を選択している ; ADコンバータはオフにしている adread bsf STATUS,RP0 ; バンク1を選択 ; ADCON1に設定を書く movwf ADCON1 ; Vref+の電源オン bcf STATUS,RP0 ; バンク0を選択 bsf bufa,4 movf bufa,W movwf PORTA ; ADのPIR1をクリア bcf PIR1,ADIF ; ADのPIE1をセット bsf STATUS,RP0 ; バンク1を選択 bsf PIE1,ADIE ; INTCONをセット bcf STATUS,RP0 ; バンク0を選択 bsf INTCON,PEIE ; PIEの設定を使う bsf INTCON,GIE ; グローバル割り込みフラグオン ; AD変換開始 bsf ADCON0,1 ; 変換開始 SLEEP NOP NOP ; Vref+の電源オフ bcf bufa,4 movf bufa,W movwf PORTA ; 割込の設定を降ろす bcf INTCON,GIE bcf INTCON,PEIE bcf PIR1,ADIF bsf STATUS,RP0 ; バンク1を選択 bcf PIE1,ADIE ; 下バイトをWレジスタに入れる movf ADRESL,W bcf STATUS,RP0 ; バンク0を選択 return
ADCON0に設定をセットし、さらにADCON1に設定したい値をWレジスタにセットしてから、このサブルーチンをコールします。
サブルーチンを呼ぶときに設定を行うADCON0とADCON1には、ADコンバータの設定情報を入れます。
ADCON0には、計測する対象のI/Oピンなどを設定します。
例えば0xc1を設定すると、AN0のピンが計測の対象になります。
なお、ADCON0の最下位ビットを上げた時点でADコンバータの電源が入り、入力端子にかかっている電圧をコンバータ内の計測用コンデンサに充電します。
ADCON1には、基準電圧を、電源電圧とVREFピンのどちらから取るかや、計測結果を格納するフォーマットを決めます。
例えば0x80を設定すると、基準電圧に電源電圧を選び、格納方法を右詰めフォーマットとします。
サブルーチンの実行が終わると、計測結果が得られます。
計測結果は合わせて10bitあります。ADCON1で右詰めフォーマットを選択した場合は、以下の内容となります。
Wレジスタには下位8bitの計測結果が入っています。
残りの上位2bitは、ADRESHレジスタの下位2bitに入っています。このレジスタの上位6bitは、内容が定義されていません。ゴミデータが入っているかも?
サブルーチンの内部では、ADコンバータを作動させ、I/Oピンの電圧を数値に変換します。
計測中は、SLEEP命令でプログラムの実行を止め、ノイズを減らしています。SLEEP命令は、AD変換が終わったときの割込により終了します。
AD変換が終了したときに実行される、割込処理を書きます。
org H'0004' ; 割込 interruption ;AD変換の割込フラグを下げる bcf PIR1,ADIF retfie
割込のプログラムは、4番地から始まります。
割込処理の内容は、発生した割込の原因フラグ(AD変換完了フラグ)を下げて戻るだけです。
ちなみに、基準電圧を作るIC(NJM1431A)の電源は、ADコンバータを使うときだけ入れています。
太陽電池から充電したニッケル水素電池を使い切らないようにするために、無駄な電流の消費を極力抑える必要があるからです。
各部の電圧を測定してみました。
デジタルマルチメータを使い、各部の電圧をおおむね1%以内の誤差で計測し、PICマイコンのADコンバータで計測した結果と比べてみます。
図:デジタルマルチーメータ
実験に先立ち、デジタルマルチメーターでシャントレギュレータNJM1431Aの電圧を計測したところ、2.460Vでした。データシート上は2.465V±2%ですので、矛盾のない結果です。
まず、太陽電池の電圧を測ってみました。
デジタルマルチメータで測った太陽電池の電圧そのものと、いろいろな測り方で得た値を、電圧値に換算した結果を以下に示します。
図:太陽電池の電圧の計測結果
横軸は、デジタルマルチメータで計測した、確からしい値です。縦軸の値を以下で説明します。
ピンクの線は、デジタルマルチメータの値をそのまま表示しているだけです。横軸と縦軸で、同じ値を指しています。
緑の線は、PICマイコンのADコンバータの計測結果に、0.05368をかけて、太陽電池の電圧値に変換したものです。
幅広い電圧の範囲で、本来の電圧よりも、0.6V程度低い結果になっています。
ADコンバータの出力値としては、本来の電圧を示す値よりも、10程度低い値が計測されています。
グラフの傾きは、本来の出力に近いです。本来の値から、定数だけ引いたような結果になっています。
次に、充電電流を計測してみました。
抵抗器R13(0.51オーム)に発生した電圧をデジタルマルチメーターで測り、電流値に換算した値と、ADコンバータで得た数値に4.725をかけて電流値に換算した結果を比べた結果を示します。
図:充電電流の計測結果
横軸は、デジタルマルチメータで測った抵抗器の電圧降下の大きさです。グラフのそれぞれの線は、次の意味があります。
青い線は、デジタルマルチメータで得た電圧降下の大きさを、そのまま電流値に変換したものです。電圧の値を抵抗値の0.51で割ると、電流の推定値になります。
赤い線は、PICマイコンのADコンバータで得た値を電流値に換算したものです。こちらも抵抗値は0.51オームであると仮定して求めています。
ADコンバータから得られる値は、本来得られるはずの値よりも、約15mA低くなっています。ADコンバータの出力値としては、本来の電圧を示す値よりも、3程度小さくなっています。
グラフの傾きは、本来得られるはずの結果に近いです。
次に、マイコンが内蔵する0.6Vの電圧源を、電源電圧(5.01V)を基準電圧として計測してみました。
PIC16F886を4個用意し、同一のプログラムを書き込んだ上で、計測したところ、下の表に示す値が得られました。
デジタルマルチメータで測った電源電圧(5.01V)が正しいと仮定すると、0.6Vの電圧源の電圧は、表中の値と解釈できます。
PIC16F886の個体名 | 0.6VのAD変換結果 | 0.6Vの電圧推定値(V) |
---|---|---|
ア | 0x37 | 0.539 |
イ | 0x3a | 0.569 |
ウ | 0x37 | 0.539 |
エ | 0x38 | 0.549 |
なお、0.6Vの電圧源は、デジタルマルチメータでは直接は測れません。
電圧源の電圧が本来の0.6Vよりも低いのか、ADコンバータから実際の電圧よりも低い値しか得られていないのかは分かりませんが、計測結果は0.6Vよりも低く、ばらついています。
0.6Vの電圧源は、それほど高い精度はないと考えたほうがよいでしょう。1割くらいずれていると考えれば、使えるのかも。
ADコンバータで計測した値は、本来の物理量よりも、いずれも小さな値となりました。
その理由を考察します。
どんな計測装置にも、性能には限界があります。
マイコンのデータシートを調べ、性能の特性を確認してみました。
まずは、データシートでADコンバータの入力回路の等価回路を調べてみました。
図:ADコンバータ入力回路の等価回路
この等価回路から、以下のことが分かります。
±500nAと書かれた電流源により、計測される電圧に、誤差がうまれます。
計測される電圧の誤差は、信号源として描いた電圧源(SIGNAL)と、信号源のインピーダンス(Rs)が関係して決まります。
オームの法則 V(電圧) = R(抵抗) × I(電流) が、ここでも使えます。
仮に電流源に500ナノアンペア流れるとすると、信号源のインピーダンスが10キロオームだとすれば、計測される電圧の変化は、
104×(5×10-7)= 5×10-3 = 5ミリボルトに対応します。
ADコンバータの出力は、入力が約2.4ミリボルト上がる毎に、1上がるようになっています(基準電圧が2.465V、出力が0~1023のため)。従って、入力が5ミリボルト変化すると、出力のずれは2程度となります。
今回の工作では、太陽電池の電圧を測る回路の信号源インピーダンスは、約4.5キロオームです。従って、等価回路の電流源は、計測の結果を1程度ずらす可能性があります。
太陽電池の電圧を測定した結果は、実際はADコンバータの出力値として10程度低い方向にずれていました。
これだけでは、説明が不十分です。
CHLODと書かれたコンデンサを十分に充電できないまま計測を行うと、誤差が発生します。
CHOLDへの充電は、ADコンバータの電源が入り、計測対象となるピンがセットされてから、実際の計測が始まるまでの間に行われます。
この時間が十分あれば、コンデンサに十分充電できます。
データシートによれば、電源電圧が5Vのときは、信号源のインピーダンスが10キロオームあっても、5マイクロ秒程度確保すれば、問題ないそうです。
今回のプログラムは、31kHzの内蔵クロックで動作しており、きわめてゆっくり処理を行っているので、ここで問題が起きることはなさそうです。
等価回路以外にも、ADコンバータの誤差を示す情報があります。
オフセットエラーが、ADコンバータの出力値として1.5程度あるそうです。
オフセットエラーは、計測対象の電圧の大きさにかかわらず、常に一定量ずれているような誤差をいいます。今回の計測結果のずれかたは、まさにこのタイプでした。
1.5というのは、基準電圧が5.12Vのときらしいので、基準電圧を2.465Vとしている今回の工作では、ずれが2倍くらいになっても不思議ではありません。
そう考えれば、3くらいずれることになりますので、充電電流の測定結果とよく合っています。
「ゲインエラー」が、出力として1程度あるそうです。
ゲインによる誤差、というのは、入力電圧と出力電圧の関係を示したグラフの傾きのずれを示していると思われますが、詳しい定義がよく分かりません。
計測結果への影響が、ADコンバータの出力として1程度に収まるとすれば、わずかな誤差とは言えるのでしょうけれども。
太陽電池の電圧が、本来よりも低く計測される問題は、まだ説明がついていません。
実験を追加して、さらに考えてみました。
データシートでは、電流源の形をした誤差要因は、計測中であってもなくても、同じように電流を消費するように描かれています。
しかし、実際にはそうでもないようです。
回路のインピーダンスには、直流的なインピーダンスと、交流的なインピーダンスがあります。
直流的なインピーダンスは、一定の電流を流し続けようとするときに見えるインピーダンスです。下げたければ、信号源を本質的に改良するか、演算増幅器などでインピーダンスを変換する必要があります。
交流的なインピーダンスは、一瞬だけ大きな電流を流そうとしたときなどに見られるインピーダンスです。下げたければ、コンデンサを取り付けます。
データシートの等価回路を見る限りでは、直流的なインピーダンスを下げないと、計測結果を改善できないように見えます。
しかし、あえて回路にコンデンサをつなぎ、交流的なインピーダンスを下げる実験をしてみました。
太陽電池の電圧を計測する回路で、ADコンバータの入力と並列(R5と並列)に、0.1マイクロファラドのコンデンサをつないでみました。太陽電池の電圧をADコンバータで計測した結果を、下図のオレンジの線に示します。(緑の線はコンデンサをつける前の結果、ピンクの線はデジタルマルチメータによる結果です。)
図:ADコンバータの入力にコンデンサを追加した結果
計測結果は、本来の値(デジタルマルチメータで測った結果)と比べ、約0.2V小さいです。この低下幅は、ADコンバータの出力としては3程度であり、充電電流を計測したときと同程度となりました。
コンデンサをつける前の結果では、本来の値と比べ約0.6V(ADコンバータの出力として10程度)も低く観測されていたので、ずいぶんと改善しました。
この結果であれば、データシートのオフセット誤差で説明がつきます。
従って、信号源の交流的(瞬間的)なインピーダンスは、計測結果に影響を与える重要性を持っていたことが分かりました。
計測結果が一度に7も変わる現象は、データシートからは説明がつきません。
ただし、信号源の交流的なインピーダンスを下げることが、計測結果をより正確にするために、必要であることは、確かなようです。
実験と考察の結果から、よりよい回路とするためのアイデアを出してみました。
ADコンバータの入力回路につなぐ信号源のインピーダンスは、低いほうがよいです。
データシートからは説明がつきませんが、入力と並列にコンデンサをつないで、交流的なインピーダンスを下げるだけでも、それなりに効果があります。
例えば、太陽電池の電圧を測る回路に、下図のように0.1マイクロファラド程度のコンデンサを追加すれば、計測結果を改善できると思われます。
図:分圧回路にコンデンサを追加
コンデンサを付けることで、時間的な変化への追従が鈍くなります。太陽電池の電圧は、急激に変化するものではなく、計測も1秒に1回だけなので、とくに問題はありません。
一方で、ADコンバータの等価回路に含まれる電流源による誤差は、信号源の直流的なインピーダンスを下げないと、改善が難しいです。
直流的なインピーダンスは、以下の図のように、演算増幅器の回路を使えば、低い値に変換できます。
図:演算増幅器を用いる例
ただし、部品を加えていくと、加えた部品の誤差も計測結果に加わっていきますので、どれほど複雑な回路がよいかは、減らせる誤差と、新たに加わる誤差の関係から、よく考える必要があります。
今回の実験では、計測の誤差の大きさは、計測対象の電圧の大きさとはほとんど無関係で、ほぼ一定値でした。
誤差を計測対象の振幅の相対値として考えると、入力の値を大きくしたほうが、相対的な誤差は小さくなります。
例えば、10bitの値として12ずれて計測された場合、10bitの下8bitを見るとずれは12のままですが、同じ値を上8bitだけ見れば3ずれているだけにしか見えません。
計測結果が下8bitにおさまるような小さな振幅のときは、4倍に増幅してから計測すれば、上位のbitをフルに活用した計測ができ、相対的な誤差を小さくできます。
入力と出力の関係を図にしてみました。上位ビットまで用いる場合は、ADコンバータで利用可能な電圧の範囲を全て使っていますが、下位8bitだけ見るときは、その4分の1程度しか使っていないことが分かります。
図:ADコンバータの入出力の関係
ADコンバータの入力にかける電圧を大きくする方法を考えます。
抵抗器による分圧比を変えるとよいです。
今回の工作では、下図の分圧回路で、R1=4.7キロオーム、R2=100キロオームとしていました。太陽電池の電圧を22分の1にしてから、ADコンバータに届けています。太陽電池が仮に12Vを出力しても、ADコンバータの出力は224で、最大値(1023)の4分の1にもなっていません。
R1=12キロオーム、R2=47キロオームとすれば、電圧を約5分の1に下げるだけなので、太陽電池の電圧が約12Vのとき出力が1023となるようにできます。これまでよりも4倍以上の値が出力されるので、相対的な誤差は小さくなるはずです。
図:分圧回路
ニッケル水素電池への充電電流を測るときは、下図のように、電流の経路に抵抗器を挿入していました。
図:充電回路の模式図
この抵抗値を大きくすれば、取り出せる電圧も大きくなります。
しかし、充電回路に発生する電圧は、そのままエネルギーの無駄となります。電圧降下が大きくなると、太陽電池からの充電電流が流れにくくもなります。
さらに、ニッケル水素電池から放電するときに、大きな逆方向の電圧が発生すると、ADコンバータの入力回路を破損する可能性もあります。
1つの解決策は、下図のように、演算増幅器を使って取り出す電圧を増幅することです。例えばR1=0.51オーム、R2=12キロオーム、R3=100キロオームとすれば、約0.5A流したときにADコンバータから1023が得られるように調整できます。
図:電圧を増幅してから測定する場合
もうひとつの対策は、上図のR1と並列にMOS-FET等をつないで、ニッケル水素電池から放電しているときは、R1に電流が流れにくくすることです。ただし、今回の工作では、R1が0.51オームで、放電電流を0.5A以下と考えているので、電圧降下は0.3Vに満たず、この対策を行う必要はありません。
図:MOS-FETで放電中は電圧降下を抑制
電子回路は、常に誤差やノイズとともに動作しているので、常に完全に正しい計測ができるわけではありません。
計測結果が多少ずれていたり、一時的に誤った値を得たりしても、プログラムの側で、トラブルを回避する工夫が必要です。
例えば、以下の工夫を考えることができます。
何度か繰り返して計測し、結果を組み合わせて判断を行うことで、より確実な制御ができます。
例えば、ニッケル水素電池を使い切ったかを調べるために、負荷の電圧を測るときは、電圧が1回基準値を下回っただけで放電終了とはせず、何度か計測して、基準値を下回っていることのほうが多くなってきたら、放電終了とみなしたほうが、ノイズの影響が小さくなり、確実な判断ができるでしょう。
充電の完了を判断するために、充電電流を測るときは、計測結果を繰り返し加算していけば、充電できた電流の累計値から判断ができます。
このときは、多少ノイズが乗っていても、累計値では平均化されているので、問題は小さいです。
充電電流が全く流れていないのに、0以外の値が偏って記録されてしまうときは、ずれた量を差し引いて考える必要があります。このあたりは、実際に計測して確かめてみるしかありません。
ADコンバータの基準電圧は、マイコンの電源電圧が変化しても、変動しないことが望ましいです。
ところが、マイコンの電源電圧が変化すると、どうしても一定には保てない場合があります。
電源電圧の範囲に応じて、正しく計測できているかを自己判断できる仕組みがあると、便利です。
今回組み立てた回路では、次のようになっています。
マイコンの電源電圧が2.1V未満のときは、「ブラウンアウトディテクト」(BOD)の機能により、マイコンが動作しないようになっています。
マイコンの電源電圧が2.1V~2.5V程度のときは、NJM1431Aによる2.465Vの基準電圧が、正しい電圧になりません。
マイコンが内蔵する0.6Vの電圧源は機能しているので、こちらを計測して、電源電圧を推定し、2.5Vに達していないと推定されるときは、正常な計測ができないと判断することが可能です。
マイコンの電源電圧が2.5V以上のときは、2.465Vの基準電圧を使って、正しい計測ができます。
上記の判断を、プログラムに組み込むことで、制御を適切に行うことができます。
マイコンや抵抗器、コンデンサなどの電子部品は全て、回路定数にいくらかの誤差があります。
マイコンでいうと、内蔵する0.6Vの電圧源の電圧は、手持ちのPIC16F886の個体それぞれで、異なっていました。
どれくらいの誤差がありそうなのかは、製品のデータシートに書いてあるので、読んでおく必要があります。
部品として許容される範囲内で最大の誤差に対して、十分対応できるように設計する必要があります。
ちなみに、部品の特性にばらつきがあっても、入手した個体に合わせてプログラムや回路を念入りに調整すれば、問題なく使えることもあります。
例えば、充電電流とADコンバータの出力の関係を、テスターで詳しく計測しておき、計測結果をもとに、充電完了を判断する電流量のしきい値を設計すれば、その回路に搭載した部品専用のパラメータを用意できるので、実用上は問題のない動作を期待できます。
ただし、経年変化などにより、特性がずれていくことも考えられますので、データシートで特性の範囲を確認するにこしたことはありません。
ここでは、PICマイコンのADコンバータで、太陽電池と負荷の電圧、ニッケル水素電池の充電電流を計測する方法を考えました。
今回の作品は、以下のように作ることにしました。
計測には、PICマイコン(PIC16F886)が内蔵しているADコンバータを使います。
電圧は、分圧回路を使い、PICマイコンのADコンバータで計測可能な電圧に変換してから計測します。
電流は、流れる経路に抵抗器を設けて、両端に発生する電圧を計測します。
電圧の基準値を供給するICを外付けすることで、PICマイコンの電源電圧が変動しても、適切に計測ができるようにします。また、PICマイコンの電源電圧を、PICマイコンが内蔵する電圧源(0.6V)で評価することで、電源電圧が下がりすぎて、正常な計測が期待できない状況を検出します。
計測には、誤差を伴うことが分かりました。電圧と電流は、あらかじめデジタルマルチメーターを使って、より正確な値を測り、PICマイコンによる計測結果との対応関係を調べておくことで、PICマイコンの計測結果を補正して利用することにします。
PICマイコンで計測された値と、デジタルマルチメーターの計測結果を比べながら分かったことは、次の通りです。
信号源のインピーダンスを下げると、計測の誤差を小さくできます。直流的なインピーダンスだけでなく、交流的なインピーダンスを下げるだけでも、効果が出る場合がありました。
計測可能な範囲をいっぱいに使って測定したほうが、小さな電圧だけを測定するよりも、相対的な誤差は小さくなると期待されます。電圧を大きくするには、抵抗器による分圧比を変えたり、演算増幅器で信号を増幅したりします。
ADコンバータや各種電子部品には、特性にばらつきがあります。例えば、PICマイコンが内蔵する0.6Vの電圧源は、個体により違った値が計測されました。計測結果が多少ずれても問題が起こりにくいように、ハードやソフトを工夫する必要があります。
手前の記事:液晶モジュール (SC1602)の制御ソフトを作る
トップページ→ちょっとだけ電子工作(もくじ)→電圧と電流を測る--PICマイコン内蔵のADコンバータを使用
著者のメールアドレスは、トップページからご覧ください。
製作・著作:杉原 俊雄(すぎはら としお)
(c)2012 Toshio Sugihara. All rights reserved.