|
Also available in
English and
Korean (한국어).
電源コントローラ回路
基本的には、エンジンをかけたら勝手にPCが起動し、エンジンを切ったら 勝手にシャットダウンして電源が切れるようにしたい。 (さらに言えば、5分や10分車を離れている間は起動しっぱなしにし、 再起動の待ち時間を減らしたいところだが、いずれにしろ今回の 電源回路はエンジンスタートに耐えられないため、それは次の課題だ) イグニッションキーの信号で起動させればいいように思えるが、 注意しなければならないのは、 エンジン始動による低電圧時には、リレーでPCを切り離しておかないと、 良くてもリブート、悪ければ「ブラウンアウト」状態でハングアップ、 いずれにしても大きなストレスをDC-DCボードに与えてしまうことだ。 これに対処するには、イグニッションがONになったあと 一定時間待つ方法があるが、確実とは言えないので、 供給電圧そのものをアナログレベルで検出する方法をとった。 ATX以降のPCを起動させるには、リレーで電源をつなぐだけでなく、 電源ボタンを押す必要がある (Auto bootというBIOS設定項目は、期待したようには動作しなかった)。 また、ACPI対応のPCでは、電源ボタンを押すとシャットダウンを 開始するように構成でき、これを利用すれば、 専用のプログラムを作らなくても、OSを問わず安全にシャットダウンできる。 そこで、電源コントローラからマザーボードの電源スイッチのピンに パルスを送れるようにした。 シャットダウン開始後は、一定時間待ったあと、リレーをオフにするようにした。 PC側の電源が切れたのを検出するとより良いように思えるが、 そもそもPCが自分で電源を切った後はごくわずかのスタンバイ電流しか消費しないし、 シャットダウン中にハングアップする場合に備えて、 いずれにしろ一定時間後には強制的に電源を落す必要があるので、 あまり意味がない。 シャットダウン中にイグニッションキーが再びONになった場合は、 エンジン始動に備え、強制的にリレーをオフする。 まとめると、電源コントローラの動作は以下のようになる。
起動シーケンス中は、イグニッションがOFFになったら、 即座に初期状態に移行する (リレーをOFFにする)。 同様に、シャットダウン中はイグニッションがONで初期状態に戻す。 このような動作は、アナログコンパレータとRCによるタイマでも、 実現できるとは思うが、アナログ回路は苦手なので、 PICマイクロコントローラ を使った。 PICはメモリや周辺回路を集積したワンチップの8ビットマイコンで、 フラッシュメモリでプログラムが書き換えられる品種はアマチュアにも人気があり、 安く入手できる。 今回は、電圧検出に使うアナログコンパレータを内蔵した、18ピンの 16F628 を採用した。 これはリセット回路やクロック回路まで内蔵しているため、 電源ピンの他は全て入出力ピンとして利用できる。 プログラム容量や速度から言っても、 より小さい8ピンの 12Fxxxシリーズ でも十分であったが、手持ちのライターが未対応なので断念した。 回路設計
PIC用の+5Vには、手持ちのS81350を使った。78L05でも置換できると思う。 この耐圧は15Vで、 レギュレートされていない供給電圧をつなぐのはやや不安だったので、 レギュレータ回路を通った後の12Vをつないだ。
イグニッション信号は12Vで入ってくるため、 5VのPICのレベルに合わせる回路が必要になる。 よくダイオードでクランプする方法がとられるが、 ここでは回路全体の消費電流が非常に少ないため、 PIC電源の5Vが12Vから流入する電流によって持ち上げられて、 PICを破壊してしまう可能性がある (3端子レギュレータは出力が持ち上げられると何もできない)。 抵抗を大きくすれば流入電流は少なくできるが、 あまり大きくしてもノイズに弱くなりそうだ。 そこで、トランジスタを使ったスイッチング回路とした。 入力電流は全てGNDに流れる。 トランジスタは手持ちの2SC1815を使ったが、 小電流用のNPN型なら何でも使えると思う (ピンアウトには注意)。 入力インピーダンスは低めにしている (ノイズによる誤動作防止)。 入力電圧を約1/10に分圧することで、 VBE=約0.6Vの10倍の6Vぐらいがスレッショルドになる。 トランジスタはオープンコレクタになっているが、 実際にはPICの内蔵プルアップ抵抗によってプルアップされている。
PIC内蔵のアナログコンパレータに入力するための、 バッテリ電圧分圧回路。 コンパレータは、PIC内蔵の基準電圧モジュール (VDDを分圧するだけ) を使った 1.25V と比較している。専用の基準電圧を用意する程の精度は必要無いと判断した。 バッテリ駆動(約12V)かオルタネータ駆動(約14V)かを判別するのに使うので、 VRで入力の13Vあたりが1.25Vになるように調整する。 抵抗の値は、ばらつきの吸収のため調整範囲がやや広くなるように選んでいる。 ここもインピーダンスを低めにしていて、電流が多めに流れるため、 電圧は常時電源でなくイグニッションから拾うようにした。 クリップ用のダイオードはここでも入れていないが、 電圧自体を約1/10にしているので、 簡単なRCフィルタのみで済ませた (PICを破壊するには50V以上の入力が必要なことになる)。 基準電圧を1.25Vと低くとったのはこのためだ。
リレーのコイルは30mAほど流れるし、入手したものが12V用だったため、 PIC直接でなくトランジスタ(2SC1815)を通した。 リレー自体はレギュレータボードのほうに実装してある。 プルダウン抵抗は、ないと、電源投入時に一瞬誤動作することがあった。
EPIAの電源スイッチのヘッダは、片側はGND、 もう片側は3.3Vにプルアップされているようだ (このときPSUから供給されているのはスタンバイ用の+5Vだけなので、 EPIAは+5VSBから3.3Vにレギュレートする回路を持っているらしい)。 これを、ボタンが押されたのと同じように制御するには、 オープンコレクタでも十分だが、 ちょうど手元にあった古いモデムの電源回路にフォトカプラがついてたので、 これをサルベージして使った。 これならスイッチが+電源とプルダウンの組合せだったとしても動作するし、 電気的に絶縁されるので、余計な心配をしなくて済む。 フロントパネルの本物の電源スイッチも並列につないで、 こちらも使えるようにした。 動作確認のため、LEDをひとつ入れた。 これは5つのモードで点灯するようにプログラムした。
このほか、電源スイッチを導通させている間(100ms)は、消灯するようにした。 これで、LEDひとつだけでプログラムの動作状態が分かるようになった。 検出電圧のVR調整にも十分だ。 製作レギュレータボードと同じく、部品の配置と配線を決めるために pcb で図を書き、ユニバーサル基板にスズメッキ線で配線した。 こちらの基板は大電流が流れるわけでもないので、 それほど気を使うところはない。
PICプログラミングPICのプログラム開発にはLinux上で動作する gpasm を使った。PICへの 書き込みには秋月電子の AKI-PIC Ver.3 と、Linux用の書き込みソフト akipic を使用した。
クロック生成には外部のクリスタルやセラミック発振子を使うか、 内蔵のRC発振器で済ませるかという選択肢がある。 今回の場合、それほど時間計測に精度が要求されるわけではないので、 内蔵で済ませた。 また、内蔵のRC発振では約4MHzと約37KHzの選択ができる。 37KHzを選べば消費電力は最小になり、待機時にSLEEP (省電力モードへ移行) する必要もなくなる。 そこで、37KHzで組んでみて、 処理が追い付かなくなったら4MHzに切替えるという方針をとった。 LEDをメイン処理と非同期に、かつ安定して点滅させたいので、 タイマ割り込みを使い、時間計測にもこれを用いるようにした。 タイマ割り込みの周期は1/100秒とし、時定数を10ms単位で書けるようにした。 プログラミングは、まずLEDのみを接続して、 割り込みによって指定した通りのパターンで点滅させるところから始めた。 LEDの点滅パターンは、8ビット値の0か1で指定して、 1秒で1ループするように組んだ。1ビットあたり1/8秒ということになり、 1/100秒のタイマでは割り切れないが、そもそもRC発振のクロックなので、 気にしない。 ここまで行くのに少し手間取ったが、これができてしまうと後は簡単だった。 実際に1秒周期でLEDを点滅させてみると、 実際の1秒より少し長くかかっているように感じたが、 シリアル通信などをするわけでもないので、これでも十分だ。 すべて組み終わると、37KHzのスピードで十分なことが分かった。 使用したプログラムメモリは2Kワードの容量中わずか189ワード。 20MHzで駆動できるチップを1/500ぐらいのスピードで使ってるわけだし、 データEEPROMやシリアル通信など、使ってない機能は山程ある。 もったいない話だが、わずか300円のチップである。 PICを使わずに300円で同等の回路を構成するのは、多分無理だ。 ダウンロード
次へ | Linux Car計画 |