定電圧電源

ヤフーオークションで何となく実験用の定電圧電源、それも複数の出力があるものが欲しくなりましたが、高いのでなかなかGETできません。自分の場合は出力電流があまり必要なさそうです。そこで小型のものを作ってみることにしました。
[要求仕様]
とりあえず−側は15Vの1系統、+側が2系統の出力で、うち1つは15V以上出ること、もう一方は1.5V〜5Vをカバーすること。電流は100mA以上は絶対欲しいけど、それ以上は出たとこ勝負。出力電圧をいちいちテスターで確認するのはぜひ避けたいところです。
[概略設計]
心臓部は安直に3端子レギュレータを用います。−側の電圧も調整可能としたいところですが、ツマミが増えるとパネルが手狭になって操作性が悪くなるので−15V決め打ちとします。+側は2系統とも可変とします。
出力電圧表示ですが、アナログのメータは高価かつ場所も食います。デジタルでも出来合いのは同じことなのでA/Dの付いたPICとLCDを用います。実は以前PICに興味が沸いて、秋月電子のAKI-877ICEキットを購入して組み立てるところまでは行なっていました。(いつのまにかPIC16F87Xシリ−ズもサフィックスにAが付くものが出回るようになってきましたが、AKI-877ICEキットは対応できなかったりして…) あとは、手持ち部品の具合、ボチボチ買い集めていった部品を当てがってみて決めていきます。詳細設計はかなり行き当たりばったりで行ないました。そこが趣味の気楽なところです。

しかし、大写しにするとアラが目立つものですねぇ。実物は幅10cm、高さ9cmですので、アラはこれほどまでには目立たないのですが…
回路図やプログラム、失敗談などを書いて行きたいと思っています。
(つづく)
[回路図]
以下に回路図を示します。

sheet 1の回路だけあれば、定電圧電源として使い物になります。アース記号のところでアルミケースに接続しています。トランスの右側にある473/50Vのセラミックコンデンサと並列接続になっている3個のダイオードは整流用で数Aの容量のシリコンダイオードです。また、1Aと書いたダイオードは1Aクラスの整流用シリコンダイオードで、1N4007とか10D10(←コレは古い)を使用しました。なお、TA79015のI-O間のダイオ−ドの要否は不明です。またLEDと直列に入っている信号用SWダイオ−ドの要否も不明です。(LED自体の整流にまかせ、逆方向の耐圧も知りませんがが、流れてもおかまいなしとする方法で十分かもしれません。) LEDに逆向きの電流を流さないようにするには図の訂正1.のように赤枠内の回路を左下のように変更します。なお、訂正2.のVR2の配線は現在の図では直っていますが、以前は誤っていました。実物はOKですが、回路図のお絵かき中に誤ったようです。
トランスは最大3Aもあれば良く、レギュレ−タICの放熱器が小さい場合は2A程度でも余るかも知れません。今回は正側も負側も半波整流で、実質的に倍電圧整流なので本気で連続的に正負とも1Aとかを取り出そうとすれば3Aは必須、正側2系統とも1A程度取り出すならばもっと大きなトランスが必要でしょう。しかし、自分の今回のスペックは電流的には控えめなのでケ−スが非常に小さく、レギュレ−タICの放熱器も小さく、トランスも比較的小さくしています。トランスはヤフ−オ−クションで入手したもので電流のスペックは不明です。配線で気をつけたところは4700uFのコンデンサ付近で、LM317Tにつながる4700uFのコンデンサの負極2ヶ所とTA79015Sにつながる4700uFの正極1ヶ所の3点がなるべく短く結ばれるようにし、かつGND端子へ行く線がトランスの0V端子とコンデンサの接続点の間になるべく来ないようにしたことです。つまり、これらの接続はできれば5差路か少なくとも十字路のようにしてトランスの0Vからの線とGND端子への線は反対方向につなぐようにし、GNDへ行く線にはトランスとコンデンサ間の大きな脈流が流れないように気をつけたことです。
ところでボ−ドBにある負電源用TA79015Sの出力に1uFのケミコンを入れてありますが、104のセラミックコンデンサだけどたと、出力電流をある程度以上多く流すようにしたときに約500kHzの発振が生じたので追加しました。TA79015Sの標準特性はCIN=0.33uF、COUT=0.1uFなのにCOUTとして0.1uFのセラミックコンデンサだけだとこのような不都合が生じる場合があるので要注意です。ナショナルセミコンダクタのLM317Tの説明資料には0.1uFのセラミックコンデンサは500kHz付近でインピ−ダンスが高くなっている場合があるので0.1uFのセラミックコンデンサには要注意との記述があるようです。今回の件はセラミックコンデンサによるものかICによるものかは追及しませんでしたが、LM317Tの説明資料のことが記憶にあって波形確認したのが正解でした。ちなみにTA79015SのI端子とO端子間にダイオ-ドが必要かどうかは不明です。(多分不要。)ただし、電源の各出力とGND間のダイオ-ドは安全のためにあった方が良いと思います。たとえば-15V端子とGND間のダイオ-ドがないと、正出力と負出力間に電流が流れる場合、仮に正出力が先に立ち上がったとき正出力の電流が負出力に回り込んで負出力端子の電圧がかなりの正電圧になってしまうと負出力レギュレ-タの内部に正常時と逆のバイアスがかかって正常動作しなくなるおそれがあると思います。また正出力端子とGND間のダイオ-ドがない場合は正出力の立ち上がりが遅かった場合にLM317Tが正常動作しなくなるおそれがあると思います。
今回の回路でVRを24Φとしたのは24ΦのVRが1/4Wの定格であり、この程度の定格がないとVR2の最大値で規格割れを起こすためです。あるいはLM317TのO-A端子間の抵抗値を100Ωからもっと大きな値にして電流を減らす必要があります。O-A端子間の抵抗値は240Ωまで大きくすることは可能です。通電時の周囲温度が高くなることを考えるとO-A間の抵抗値を始めから大きく設計した方が良かったかも知れません。しかし、VRの定格電力が半固定抵抗の定格電力に比べて大きさの割になぜこれほど小さいのか、自分には良く分かりません。半固定抵抗はあまり摺動させないのに対してVRは頻繁につまみを回すことが前提になっているためでしょうか。

sheet 2は表示部を除く電圧計の部分です。sheet 1の回路、sheet 2の回路、LCD表示モジュールであるSC1602BS*Bを相互接続すると、電圧表示付きの定電圧電源となります。sheet 2は丸々ボードCで、左側になるコネクタの+V、GND、VN、V15、V5はいずれもsheet 1の回路から来る信号線ないし電源線です。sheet 2の上部のコネクタはAKI-877ICEキットの基板AE-877ICE_Bにある9ピンコネクタJ1との接続用で、PIC16F873ー20/SPのプログラムデバッグおよび書き込み時に用い、完成してしまえばヘソのように役立ちません。このコネクタと先の左側コネクタの黒くなったピンは逆挿し防止用にピンの刺さる穴を塞ぎ、対応するピンを折るなどしたものです。JPはジャンパピンの接続端子で、sheet 1の回路なし、すなわちボ−ドCとLCD表示モジュ−ルとICEだけで部分的に評価、チェックする場合にジャンパピンを挿入しました。9ピンコネクタの6、7ピンから+5Vが供給されます。sheet 1の回路を組み合わせて通電する場合はジャンパピンを挿入しません。PICの10ピンはCR発振の周波数確認時にクリップで挟みやすいようにスズメッキ線を数cm出しておいたものです。
VR3〜VR5は多回転のトリマが必要です。いずれも2kですが、まわりにJ級(5%級)の抵抗を使用するなら本当は5k程度のトリマを用いるべきものもあります。抵抗値の実力に期待しました。(結果オ−ライでした。)VR6は1回転弱の普通の半固定抵抗を使用しています。
7805のOとGの間の1uFのコンデンサはTaと記してありますがタンタルコンデンサです。また、7805のIとOの間のダイオ−ドの要否は本当のところ良く分かりません。(多分不要。)あと、AN4とVREF-の間のダイオ−ドは1Aの整流用を用いていますが、1S1588などの小信号SW用ダイオ−ドでOKのはずです。配線で工夫した点は7805のG、O端子をPICの4ピン、5ピンのすぐそばに配置してVREF+、VREF-の電位差をなるべく安定にしようとしたところです。
2SC732(GR)まわりはリセット信号作成回路です。シンプルな回路といえばトランジスタとその左側の103が2本、10uF、1S1588を削り、代わりに10uFをトランジスタのC-Eのあった位置に付け、1S1588を7805のOとトランジスタのCのあったところの間に付ければ良さそうです。しかし電源SWを切っても負荷が軽い場合はなかなか電源電圧が下がらないので、SWのオンオフを短い周期でくり返した場合に、PICの電源電圧が動作保証外の電圧に下がったのち、リセットがかかる程下がらずにまた復帰する可能性がありそうなので、今回の回路にしました。今回の回路は電源電圧がある程度急速に立ち上がるとリセットパルスが出ます。しかしこの図の回路では約1.4V以上電圧が上がらないとリセットパルスが出なさそうですから、トランジスタのBから103が2個というのはコンセプトが半端ですね。2SC732(GR)のB-E間の抵抗は104程度が望ましいと思います。
[ソフト]
ここにソフト(アセンブラソ-ス)があります。
この定電圧電源ソフトの全体フローチャートは次のようになっています。

ウォッチドッグタイマの初期化については後述します。
LCDモジュールの初期化LCDモジュールの設定について
秋月電子から購入した時に付属していた説明書(英文)ではプログラムするのに不足だと思います。
・まず、命令によるLCDモジュール初期化のフローチャートでは100秒以上WAITという部分があって「使えん!」ということになります。これは100秒→100u秒の誤りのようです。
・もう1点はLCDに文字を出力する場合、DDRAMアドレスの設定を行ないますが、表示位置とアドレスの関係について記載がないことです。
しかし、これらの記述は製造元と思われるSunlike Display Tech. Corp. のホームページにあるデータそのもので、ここにも表示位置とアドレスの関係についての説明はなさそうでした。
DDRAMアドレスと表示位置の関係は次のようになっています。
表示器は16桁×2行になっています。上の行のアドレスは左端の桁が0番地で1桁右に行くごとに1番地ずつ増えていき、右端(16桁め)が0F16番地となっています。下の行のアドレスは少し飛んでいて左端の桁が4016番地で1桁右に行くごとに1番地ずつ増えていき、右端(16桁め)が4F16番地となっています。LCDモジュールは電源の立ち上がりで初期化するだけでは、やはり電源スイッチパチパチに対して不安ですから、命令で初期化するようにします。バス幅は8ビットとして配線しているのでそのように設定しますが、最初は4ビットのモードか8ビットのモードか不定になっているという前提で考えます。といっても初期化方法は説明書のフローチャートに従い、wait more than 100 s を wait more than 100 us に読みかえればOKです。
まず、LCDモジュールに対してE、R/W、RS信号をPICから与える必要があるので、対応するPICのポートRB2〜RB0は出力にしますが、'H'レベルを与えるか、'L'レベルを与えるか決めてから出力モードにします。また、今回不使用のRB7〜RB3も静電気破壊対策のおまじない(通電中のみ有効)として出力ポートにしてインピーダンスを下げておきます。RB7、RB6はデバッグで使用中はユーザプログラムの設定は効きませんからデバッグの支障にはなりません。
DB0〜DB7は今回BUSYか否かを見るときにLCDモジュールからの出力を調べるために入力モードにしますが、それ以外はLCDモジュールに対して出力するので出力モードにします。最初は命令を与えるので命令の値をRC7〜RC0に設定してからこれらを出力モードにします。
電源電圧が4.5V以上になってから15ms以上待った後ファンクションセットを行ないます。8 bit バス、2行、5×7ドットを設定します。設定後4.1 ms以上待った後、再度 8 bit バス、2行、5×7ドットを設定します。今度は100 us以上待ちます。これによりバスが4 bitであったとしても8 bitであったとしても8 bitバスになり、2行、5×7ドットも設定されそうです。ここまではBUSYフラグ(BF)が役立たないとのことです。次からBUSYフラグが有効なのかその次から有効になるのか説明を見ても自分には良く理解できませんでした。試してみてBUSYが有効だったとしても確率の問題かも知れませんので、次の命令もBUSYフラグを信用しないことにしました。また、先ほど8 bit バス、2行、5×7ドットを2回設定すれば良さそうと書きましたが、説明書のフローチャートでは都合4回設定しているようなので自分もそうしました。4回目からはBUSYフラグを見るようにしています。BUSYフラグをチェックしてLCDモジュールの設定を行なう部分はサブルーチン化してあり、設定したいRSの値をlcdrsに設定し、DB7〜DB0に出力したい値をWレジスタに設定してlcdsetルーチンを呼び出します。ルーチンではlcdrsの値は破壊されません。
その後ディスプレイオフ&カーソルオフ&ブリンクオフの設定、クリアディスプレイの実行、ディスプレイオン&カーソルオフ&ブリンクオフの設定、エントリモード(インクリメント&ノーシフト)の設定を行なってLCDの初期化完了です。(最初、クリアディスプレイを実行するとディスプレイオンになるだろうと勝手に思い込んでいて悩みました。実際はディスプレイオンは別途設定する必要があります。)
※ところどころで待ち時間を設けますが、待ち時間を設定するにはPICの動作速度を知っておかなくてはなりません。ここではRC発振モードを用いていますからデータシートのグラフからおよその周波数しか分かりません。周波数カウンタを用いて回路図のTPポイントの周波数を測定すると64.1kHz程度でした。これが発振周波数の1/4です、発振クロック4サイクルで1つ実行されるCPU命令が多いので通常の命令実行時間は1/64.1kHz=15.6us程度です。ジャンプ命令などではその2倍の時間がかかります。決まった時間以上の待ちを設ける必要があるので未知の変動要因を考慮し、15.6usの代わりに10usとして時間待ちのプログラムを行ないました。
A/Dコンバータまわりの初期化
結果右詰めフォーム&AN4, V+, V-, AN1, AN0有効を設定、静電気対策のおまじないとして不使用のRA4を出力に設定、A/D変換クロックとして内蔵RC使用"/Dコンバータイネーブルに設定してA/Dコンバータの初期化完了です。内蔵RC使用時のA/Dクロックは2〜6usで、変換開始させてから11か12クロック後に結果が得られるようです。
以上で初期化は完了です。
続いてメインとなる各出力電圧のモニタ表示ルーチンです。
(つづく)
* 出力電圧表示ルーチン
その前に…
このプログラムはメインルーチンをグルグルまわり続けます。メインルーチンの先頭で1度ウォッチドッグタイマをクリアしてリセットがかからないようにしておきます。
そしていよいよ出力電圧の表示です。順番としては次の図にあるように、たまたま−15V出力の電圧表示、+15V可変出力の電圧表示、+5V可変出力の電圧表示の順となっています。しかし最も簡単なのが3番目の+5V可変出力の電圧表示、反対に考え方が少しややこしいのが1番目の−15V出力の電圧表示です。説明はやさしい順である図の3.、2.、1.の順番にします。

+5V可変出力のA/D変換
VREF+は3端子レギュレータ7805の約5V出力、VREF-には0Vが印加されています。AN0端子に3端子レギュレータ7805の出力である約5Vがそのまま印加されたとするとA/D変換結果は210-1、10進数でいうと1023になります。+5V可変出力は最高電圧でも10V未満ですから仮にINに10Vが印加されたときにA/D変換結果が10進数の1000になるように、あるいはINにピッタリ5Vが印加されたときにA/D変換結果が10進数の500になるように、すなわちINに印加される電圧の約1/2が出力電圧MとなるようにVR5を調整するならばA/D変換結果を2進数から2進化10進数に変換し、さらにASCIIコードに変換したり、途中に小数点を表示したりすればOKです。
具体的には次のようになります。
・AN0の変換を開始させて、フラグを監視して変換終了を待ちます。
・変換終了したら結果の上位をRAM上のadh、下位をRAM上のadlにコピーします。
・2進数を2進化10進数に変換するサブルーチンB2_BCDをコールする。結果は上位1桁がRAM上のR0の下位4ビット、中位2桁がRAM上のR1、下位2桁がRAM上のR2に格納されます。このサブルーチンはMicrochip社のホームページからたどれる数学ライブラリの中にあったものをほとんどそのまま使用しています。PIC16C55/PIC16C57用ということですが問題無く使えるようです。元のプログラムは16進数を基数としたコーディングに対応していましたが、自分は10進数を基数としたコーディングに対応するように記述を少し変えただけです。クロックサイクルは885サイクルであるとの記述がありますので心に留めておきます。
・まず表示位置アドレスを4A16番地に設定し、次に+x.xxVと表示していきます。始めにDDRAMアドレスの設定します。RAMのlcdrs番地を0に設定してRS=0を指定します。DB7に"1"を立てる必要がありますから8016+ 4A16= CA16をWレジスタに入れてlcdsetサブルーチンをコールします。
・次にDDRAMに'+'のASCIIコードを書き込みます。そのためにRS=1を指定しますからlcdrs番地の内容を"1"に設定します。WレジスタにASCIIコードの'+'を設定してlcdsetサブルーチンをコールします。
・2進化10進コードの下3桁を出力します。最初にR1の内容をWレジスタにコピーし、上位4ビットを0にします。(始めから0になっているはずですが…) これで1の位の10進数が得られたことになります。これにASCIIコードの'0'を加算すると1の位のASCIIコードが得られます。RS=1は先に'+'を書き込んだときに設定済みですから、すぐにlcdsetをコールできます。次に"."のASCIIコードをWレジスタにセットしてlcddsetをコールします。次に0.1の位を表示するためにR2の上位4ビットをWレジスタの下位4ビットにセットしASCIIコードにしてlcdsetをコールします。R2の上位4ビットをWレジスタの下位4ビットにセットするためにRAM上のtemp番地を使用して4ビット分右ローテートさせ、さらにその下位4ビットを取り出しました。次に0.01の位を表示するためにR2の下位4ビットをWレジスタにセットし、ASCIIコードの'0'を加算して0.01の位のASCIIコードを得、lcdsetをコールします。
・最後にASCIIコードの'V'をWレジスタにセットしてlcdsetをコールします。以上で+5V可変出力電圧の表示ができました。
以上がA/D変換のさせ方と得られた2進数の結果を表示位置指定して表示する方法です。
+15V可変出力のA/D変換
この出力は20V以上になることがありません。先ほど、10V未満の電圧はINの電圧を1/2してこれをA/D変換し、1/100すれば良いことが分かりました。今度の場合はINの電圧を1/4にしてAN1に印加すればVREF電圧をオーバーすることはありません。ただ、仮に20VがINにかかるとAN1は5VとなってA/D変換結果は約100010となるため1/100すると当然1010となりINの電圧値の1/2となってしまいます。したがってA/D変換値を2倍すると良いわけです。2倍するのは2進数であれば左に1ビットシフトするだけでOKです。したがってA/D変換後に結果をすぐ左1ビットシフトします。その後、2進数を2進化10進数に変換してLCD表示していきます。表示開始アドレスは4216で、表示フォーマットは+xx.xxVとしています。
−15V出力のA/D変換
この出力は常にほぼ一定のはずですが、たとえば負荷のショートが発生すると約0Vになることもありますから、モニタしておくこともあながち無意味とはいえないと思います。手抜きで−15Vの出力電圧をモニタする方法として次のように考えました。
A/Dコンバータの入力レベルは0V以上でなくてはなりませんから-15V出力と正の安定した電圧、すなわちPICの電源の間で分圧することにします。
先の1.の図で回路の両端間の抵抗に対するAN4とVREF間の抵抗の比 k を考えます。
正の安定した電圧VREFをC[V]、約−15[V]の端子電圧を−G[V]、A/DコンバータのAN4入力電圧をM[V]とすると
M = C - (C + G)k ----------- (1)
これを変形してGを求める形にすると
G = {(1 - k)C - M} / k
と、なります。C = 5.12、k = 0.25 のとき
G = 3 × 5.12 - 4M
VREF=5.12[V]、AN4の入力電圧がM[V]のとき、A/D変換値をADとすると、AD=200Mなので、
100G = 1536 - 2AD --------- (2)
となります。
したがってこの関係式を使えば、−15V固定出力端子の出力電圧が−15.36[V]〜0[V]であれば表現できることになります。プログラムとしては、まずAN4の入力をA/D変換したのち(2)式の計算を2進数のまま行ない、その後に10進数に変換して表示しています。表示開始アドレスは0016で表示フォーマットは−xx.xxVとしています。
VREFが5.12[V]でなく5[V]だった場合でも固定出力電圧が正常出力されているときに正しい値を示すようにVR3を調整すれば実用的には十分と思います。この件はすぐ後に検証を行なっています。また、不幸にして固定出力端子の出力電圧が−15.38[V]かそれ以下だった場合は1536の定数を多少大きくしてやる必要があります。このようにして通常時の電圧を合わせた場合、0V付近では誤差が多少でるでしょう。また、5V、−15Vの3端子レギュレータや、各抵抗の誤差によってはVR3の調節範囲で−15V付近の電圧が合わせ込めない可能性があります。その場合はVR3を2kΩでなく5kΩにしてやるか、両側の抵抗のいずれかに1k〜1.5kΩを足してやると良いでしょう。
仮にVREF=5[V]で−15V固定出力端子出力電圧が−15[V]、このときの表示電圧を−15.00Vに調整した場合、
(1)式にC = 5、G = 15 を代入して
M = 5 - (5 + 15)k ------------- (3)
また、プログラムが(2)式になっているので−15.00Vを表示するとき(2)式に G = 15 を代入して
100 × 15 = 1536 - 2AD
であるからA/D変換値 AD は
AD = (1536 - 100 × 15 ) / 2 = 18
このようなA/D変換結果になるAN4入力電圧Mは
M = 5 × (18 / 1024)
これを(3)式に代入して
5 × (18 / 1024) = 5 - (5 + 15)k
k = (5 - (5 × 18 / 1024)) / 20 = 0.2456 ---------- (4)
となります。つまり、VR3は抵抗の比がこのようになるように調整します。
また、このように調整された状態で−15V固定出力端子の出力電圧が0[V]になった場合の表示は、まず(1)式にC = 5、G = 0、および(4)式の結果を代入して
M = 5 - (5 + 0) × 0.2456 = 3.772[V]
このA/D変換値ADは
AD = 1024 × 3.772 / 5 = 773
これを(2)式に代入して
100G = 1536 - 2 × 773 = -10
すなわち+0.10[V] ということですから、その程度の誤差ということです。しかし、自分の電源の場合は出力をGNDとショートさせても値が0V付近となり、アンダフローが生じたような値とならなかったため、プログラムには100Gが負の値となったときの対策が入っていません。(2004年4月18日現在) いけませんねぇ…
しかし、同じことは例えば+5V可変出力についても言え、+15V可変出力とショートして+5V可変出力が10V以上になった場合、表示は+0.00V〜+0.23Vになることでしょう。個人用としてはそれでもOKという割り切りかたもあるかとも思います。本当はそれなりの例外処理を行なう方が気持ちいいですね。それほど手間がかかるわけでもないと思いますし。でも、今は手抜き…
* ウォッチドッグタイマの設定
ここでウォッチドッグタイマの設定について触れておきます。
実際はリセット後、すぐにこの初期化を行なっています。ウォッチドッグタイマの目的は、システムが変調をきたして正常ループから外れて戻って来なくなったときに、これを検出して何とかすることにあります。PICの場合はPIC自体のリセットを行なうことが「何とか」に相当します。ウォッチドッグタイマを有効にすると、ある設定された期間が過ぎるとリセットが行なわれます。その期間が過ぎる前にウォッチドッグタイマのカウントをクリアすればリセットは行なわれませんが、クリアされた直後から再び設定された期間が過ぎるとリセットが行なわれます。したがってウォッチドッグタイマのカウントクリアは繰り返し繰り返し行なう必要があります。逆に言うとカウントクリアがしばらく行なわれなくなったら正常ループを外れてしまったということになります。しかしまた、カウントクリアが定期的に行なわれているからといって正常動作を行なっていることが保証されるわけではなく、異常であっても偶然ウォッチドッグタイマのカウントを行なう変てこなループをまわっている可能性も捨て切れません。結局、強いか弱いかはあっても番犬程度の安心度ということです。
ウォッチドッグを設定するにあたって、初期化やループをまわる時間を知っておくべきです。正常動作中にウォッチドッグタイマでリセットがかかってしまっては飼い犬に手を噛まれるようなもので、シャレになりません。
初期化ルーチンのほとんどは時間待ちです。最初に4.1ms待ち、続いて100us、80us待ちます。これらの待ち時間は実測のクロック(1命令15.6us)よりも早まった(1命令10us)場合を想定して、長めに待つように設計していますが、ウォッチドッグタイマについて考える場合は実測のクロックより遅くなった場合を想定すべきでしょう。したがってそれぞれ8.2ms、200us、160usかかるとしましょう。そのあと1命令20usと考え、大雑把にDisplay off, Cursol off, Blink offで1.7ms(LCD反応待ちで決まる)、Clear displayで1.7ms(LCD反応待ちで決まる)、Display on, Cursol off, Blink offで0.5ms、Entry mode: Increment, No shiftで0.5msとします。合計は約16msとなります。
次にメインルーチンです。−15V測定ルーチンではメインプログラムが20μs×約60ステップ、A/D変換72μsMax、B2BCDルーチン(20/4)×885μs呼び出し1回、LCDSETルーチン約0.5ms×8回呼び出しとなり、合計約9.7msとなります。続く+15V測定ルーチンではメインプログラムが20μs×約50ステップ、A/D変換72μsMax、B2BCDルーチン(20/4)×885μs呼び出し1回、LCDSETルーチン約0.5ms×8回呼び出しとなり、合計約9.5msとなります。最後の+5V測定ルーチンではメインプログラムが20μs×約40ステップ、A/D変換72μsMax、B2BCDルーチン(20/4)×885μs呼び出し1回、LCDSETルーチン約0.5ms×7回呼び出しとなり、合計約8.8msとなります。したがって無限ループは1周期が9.7+9.5+8.8=28msとなります。ただし、ある部分の時間は無視されていたりする一方、LCDSETルーチンなどは相当サバを読んでいたりして全体としてはかなり長めに見積もられていると思います。ウォッチドッグタイマは200716番地のConfigビット2を"1"にセットすることで有効になります。これはアセンブラで定数として記述せずにフラッシュ書き込み時に指定するやりかたもあります。ともあれウォッチドッグタイマは分周しない場合、標準で18ms、最短7msでリセットが発生します。そこで4分周して28msを確保することにします。この設定はイニシャライズの始めの方で行なっておきます。念のためプリスケーラの設定直後にウォッチドッグタイマをクリアしておきました。あとは無限ループのはじまりでウォッチドッグタイマのクリアを行なうようにしておきます。(ウォッチドッグタイマのクリアとは本項の始めで述べたようにウォッチドッグタイマのカウント値をクリアするもので、ウォッチドッグタイマの設定を初期化してしまうものではありません。なお、ウォッチドッグタイマはICに内蔵されたウォッチドッグ用の発振回路出力をカウントします。)
* 製作編
まず、ケースが必要です。ヒューズやヒューズホルダ、電源スイッチも、電源コードも電源コードがケースに入る部分でコードがケースと擦れてコードの被覆が破れないようなコードブッシュも必要です。ケースのどこに何を収めるかを慎重に検討したら、潔くケースに穴あけを行うことになります。すぐ下の写真は穴をあけたケースを正面側から写したものです。出力端子本体が回ってしまうのを防止するために端子を取り付けるためののねじは両側が削られたようになっていたので、ケースもそれに合わせるように長円形となるように電気ドリルとリーマで円形の穴にした後、ヤスリで広げました(ケース下部の5個の穴)。しかし、広げる向きは失敗でした。出力のナイロン端子(http://www.satoparts.co.jp/site/Products/t/jp/3025.htm)を取り付けてみると、外につける電線を通す穴は左右方向に貫通する向きになり、たとえばテスタリード棒をうまく差し込むことができません。メーカ製であれば、穴が上下方向になるように取り付けてあることでしょう。しかし一番便利なのはおそらく穴が5個とも斜め方向に揃っていることだと思います。つまり、ケースの穴は縦方向でなく、斜め方向に長円形になっているのがベストだっただろうということです。LCD用の穴はドリルでポツポツと穴を開け、丸ヤスリで広げて隣同士をつなげて平ヤスリで地道に仕上げました。角は一部三角ヤスリで整えようとしたところもあったと思います。

まぁ、本当はいらないものを片付けてから作業するのが好ましいですね。下の写真は一部の部品を取り付けて、斜め上から写したもの。電源スイッチやボリュームを取り付けるとき、アルミのケースに直接とめるだけでは見栄えが悪くなりそうだったので、余ったプリント板をかませるようにしました。ちなみにボリュームの本体が回ってしまうのを防止するポッチをはめる穴のうち片方はボリュームの取り付け方向を変更したため、最終的には役に立たなくなりました。

下の写真はいかにも過密なケース内部の様子(斜め後ろから撮影)。これでもまだ、表示系の回路が入っていない状態。-15V電源はケミコンの右側にころがっています。(特にシリーズレギュレータというか、スイッチング電源でないタイプ)は発熱するものなので、強制空冷にしない場合は一般的に高密度にしないのが吉。温度が高くなると流せる電流が減りますし、故障率も高くなります。ただ、実験用でそれも軽負荷で間歇的に使用する場合は小型の方が便利という面はあります。しかし、今回はコネクタで基板間を接続しようとしましたが、中継タイプを含め、コネクタを実装する余地がありませんでした。そこで熱収縮チューブを通しておきビニール線同士を半田付けして接続し、半田付け部にチューブを移動させてドライヤで収縮させて他と絶縁させるようにしています。かろうじて表示系だけはコネクタを用いることができましたが、故障や改造時のメンテナンス性にかなり問題があります。

上の写真とは逆サイドから撮影したものです。-15V電源を本来の位置に取り付けました。3個のケミコンが隠れて見えなくなりました。電源トランスの角のグレーに見えるものはビニールテープを貼ったものです。ヒューズホルダーの半田付けは一応からげ配線にしてあり、トランスとの距離もある程度とっていますが、変なショート事故がおきにくいように気休めのビニールテープを貼りました。

下の写真は真上から見たところです。黒い放熱器に3端子レギュレータが取り付けてありますが、写真の上から順に+5V用、+15V用、-15V用です。

そして下の写真が正面から見たところです。表示系がまだありませんが、電源としては使える状態になっているはずです‥ 端子は向かって左から-15V、GND、+15V、GND、+5Vの順に並んでいます。また、つまみは中央が+15V、右側が+5Vの調節用です。ちなみにLCDパネルは左上が-15Vの表示、その下少し右が+15V、右端が+5Vの表示になるようにPICをプログラムしました。これで端子とつまみ、LCD表示の関係がある程度自然な感じになります。

電源が正常かどうか、いろいろ確認中‥ 下の写真は-15V出力を確認しているところです。

正電源出力と負電源出力間に電流が流れるようにして電源を投入した場合、先に立ち上がったほうに引っ張られて遅かった方のレギュレータが正常な動作領域に入れなかったりすることはないか、などというチェックも行いました。回路的にはダイオードで最悪の状態にならないようにしたつもりではありましたが‥ 負荷抵抗のワット数が足りないようですが、そこは短時間ということで、目をつぶります。

それは良かったのですが、負荷電流が大きくなったときに-15V出力波形が異常になることがわかりました。下の写真をご覧ください。時間軸が示すようにこれは西日本の電灯線周波数60Hzを整流したこととは関係ない周波数が出力に現れています(約500kHz)。これは要対策です。

対策後が下の写真です。めでたし、めでたし。

対策方法ですが、-15V電源、TA79015Sの出力とGND間には当初1uFのケミコンを入れていませんでしたが、これを加えることで直りました。回路図にはすでにこの対策が盛り込んであります。
下の写真は秋月電子のAKI-877ICEキットとシリアルケーブルで接続しているところです。LCDモジュールの後ろにPICの載った基板(Board C)があり、コネクタとビスでつながっています。

下の写真は表示系を後ろ側から写したもので、回路図のBoard Cです。小さいネジのついて縦に3個並んでいるものが多回転トリマで上からVR3、VR4、VR5になります。回路図Board Cほとんどそのままの配置になっています。したがって右端にLCDモジュールSC1602BS*Bとのコネクタがありますが、コネクタは裏側に生えていますので写真で見えているのはコネクタの足の半田付けされているところになります。VR5は手持ちの関係で実際は1kΩを用いていますね。この段階ではPICの電源を本体からとっているのでJPは接続していません。シリアルケーブルとの接続は基板が小さいため10ピンのスリムなコネクタに切り替えています。このコネクタを用いてデバッグと最終プログラムの書き込みを終了すると、このコネクタもJP同様なにも接続しない状態になって完成です。(向かって左のコネクタは最終の状態でも接続ありです。)もっと下に基板をさらに大きく写したものがあります。

下の写真はLCDモジュールとのコネクタ接続とネジを外してBoard Cを左右ひっくり返し、裏を撮影したものです。したがってLCDモジュールとの接続コネクタが左側に見えます。基板下部に見える10uFは扁平なものでLCDモジュールと合わせたときも衝突しないようになっています。その左に見えるのは2SC732(GR)です。

下の写真はBoard Cを再度ひっくり返したものです。今度はコネクタ類が外れているのでさっきより見やすいと思います。プログラムの説明ではゴチャゴチャ書きましたが、パネルのボリュームVR1で5.00V、VR2で15.00Vになるよう、デジタルマルチメータ(テスタ)で設定します。パネルの表示が5.00VになるようVR5を調整、パネルの表示が15.00VになるようVR4を調整、-15Vは出力電圧をマルチメータで測定し、パネルの表示がマルチメータの値と同じになるようにVR3を調整すればOKです。

下の写真はケースのカバーに放熱用の穴を開けているところです。まずポンチでくぼみをを付け、ドリルで穴を開けたらリーマで穴を大きくします。放熱口はカバーだけである程度重い部品の付く本体側には設けません。下に穴を開けても基板で空気の流れが遮られて効果が少なそうですし、強度が減ったり何かのクズの侵入で動作不良となるリスクを考えると下部の放熱口はやめたほうが良さそうだと判断しました。

下の写真はまさにリーマで穴を広げているところです。

下の写真はシャーシパンチで最終的な丸穴を開けているところです。回す取っ手がケースの内側に来て多少回しにくいのですが、これで良いと思います。逆に取っ手をケースの外側にして加工すると、アルミの切り口がケースの外側を向いてしまいます。

下の写真は放熱口に網状に見えるアルミのパンチングメタルをエポキシ接着剤で裏側から貼り付けて完成させたものです。

* まとめ
実験用のミニ定電圧電源は一応の完成をみたわけですが、いくつかの問題点を残しました。
整理すると
・ケースが小さいので、放熱に限界があり小電流しかとれないのは当初予定通りですが、メンテナンス性も悪くなってしまいました。
・端子の取り付け方向が悪かったので、電線やテスタリードを差し込みにくい、あるいは差し込めなくなってしまいました。
・異常時の電圧表示への配慮をしていません。変換結果を判定し、>10Vとか、<0Vといった表現をさせることが可能なはずです。
・結果として出力電圧の表示はかなり正確ですが、測定対象に入力を切り替えてからすぐにA/D変換させています。当初の心積もりではA/D変換後、次の測定対象に入力を直ちに切り替えておくことにしていました。その方がA/Dコンバータの入力回路のコンデンサを十分にチャージすることができて、より安心です。
・正面パネルにツマミの意味と目安となる目盛があったほうが安心です。また、端子にも どの出力かを示す表示があったほうが良いでしょう。個人使用でもツマミの周りに出力電圧の目安となる目盛はあるほうが望ましいです。
・整流用ダイオードにセラミックコンデンサを並列に入れてラジオ用電源とした場合もまずまず使える状態になりましたが、表示系からのノイズがまだ侵入しています。フェライトのノイズフィルタがある程度の効果を現しますが内蔵させるのは大変そうです。また、完全に抑えきれるかどうかも良くわかりません。結局小型ラジオ用の電源は手持ち部品があったので別に専用のを作ってしまいました。(ラジオは良く聞くので)
このように問題はありますが、出力電圧が可変の電源で出力電圧がテスタなしにいつも確認できるのは便利で、まずまず気に入っています。
(定電圧電源の項、終わり)