デジタル降魔録TOPページへ

thank you for your access
補足情報
補足:____________
Flash PICの起動

 【19】デジタルは5Vだけではあらず・入力編

デジタル信号は電圧の高い(H)、低い(L)のふたつの状態だけで成り立っているのは、先に書かせていただいたとおりです。
 高い方を『1』、低い方を『0』という数値で表すと、数字に直すことができます。これが2進数で、それを4つ組みにして16進数という数値表現ができるという話を "【5】頭から煙が" の後半で書かせていただきました。

 ということは──。
 ふたつの状態で表せるものなら何でもいいことになります。
 そうなんです。ひとつを100V、もうひとつを10Vという馬鹿みたいな電圧差で表してもいいですし、5Vと-5Vの2値でもいいことになります。
 さすがに100Vと10Vなんてことにしたら、通電中は怖くて気安く基板に触れることができなくなります。

 PICの工作で5Vと0Vを2値としているのは、たんにその回路の電源が5Vだから、ということだけの理由です。


 前回は出力編でした。5V以外の電圧を出力する方法を何種類か書かせていただきましたが、今回は入力編です。
 注意:AC電源を入力することは今回考えていません。すべてDC電圧です。

 ところで入力に異なる電圧を使うなんてことがあるのでしょうか。

 これが意外と多いので驚かされます。全体を5Vの単一電源で済ますということの方が少ないと思ってください。モーター駆動なら12V、24Vは当たり前でした。となるとそっちがメインのマシンを制御するとどうしても入力の信号もその電圧になります。たとえば乗用車。

 現在の乗用車のほとんどは12Vのバッテリーを使用して、全体としては12V電源の仕様になっています。最近はCAN(Controller Area Network)バスの低信号が通っていたりしていますが、メインは12Vです。
 例えばドアが開くと0V。閉まると12V。ライトが点くと0V。消えると12V。あるいはこの逆とかです。
 つまり、H→12V、L→0Vとなるわけです。
 クルマだけではなくいろいろなものがあります。
 H→24V、L→0V、なんていうのもありますし。
 H→13V、L→6V、という首をひねってしまうような仕様もあります。この場合はノイズによる誤動作を防ぐために、0Vよりはるかに高い電圧を(L)としているのだと思われます。



GNDとは何か

 さっきから出てくる電圧ですが、これって何だと思われますか。いまさら何を……ですが、これは二点間の電位の差を数値に表したものです。

 一点は解ります。たとえば入力ポートが何ボルトだろうと計るときなら、そのポートが今言う一点になります。残りの一点、これがGND(グランド)です。

 接地とかアースとか呼ばれていますが、洗濯機などの漏電防止のアースとはちょっと異なります。電子回路の工作の場合は、この点を基準に電圧を決める重要なポイントになります。つまり基準点です。この点が正確に0Vになっているから、入力ポートは5Vとして扱われます。もし、この基準点がフラフラと変化したら、もはや信号が来ていても正しく扱われるかどうか、それよりも回路自体がまともに動くかどうかの世界になります。

 クルマでも同じコトですが、バッテリーには『+』端子と『-』端子があり、『-』がボディーにダイレクトに接続されていますので、それが回路的に言うGNDです。

 バッテリー端子に『-』と書かれていますので、マイナスと呼んで説明する人が多いですが、ボディーにダイレクトに接続してすべての装置がプラス端子から電源をもらってマイナス端子へ返すのであれば、回路的に見て、マイナス端子はGNDと呼ぶべきです。

 ひどいときは『赤線は+12Vへ、黒線は-12Vへ接続』とか書かれているのを目にすることがありますが、『-12V』という回路も当然ありますが、この場合もGNDを基準にして『-12V』です。テスターにとってあまり良くないですが、計ると針は0Vより下、逆向きに振れます。

 話を戻します。
 GNDは回路の基準点です。プラス側(マイナス電源の時はマイナス側)からGNDへ電流が流れますので、しっかりと電源の0Vラインに太い線で結んで、常に安定した0Vになるようにしなければいけません。ひとつの装置に複数の電圧が使われていてもすべての基準点はGNDですから、GNDをおろそかにしてはいけません。



ハイインピーダンス状態とは何か

 PICなどの組み込み制御用のCPUに直接入力できる電圧は、ご存知のとおり電源電圧までです。5Vを電源にした場合は5Vまでです。
 問題になっているのは、入力される電圧が24Vとか12Vというわけですので、それを5Vに変換すればいいわけです。

 とその前に。

 デジタルはHとLの2値で考えるのが基本ですが、実際にやってみると、ある問題にぶつかって戸惑うことがあります。HでもLでもない状態があることに気付くからです。それがハイインピーダンス状態と呼ばれるものです。



 図のようにスイッチが切れている場合、通常の状態ではPICの入力端子に電圧が掛かっておらずHにもLにもならず不定になっています。このような状態がハイインピーダンスで、非常に不安定なことになっています。

 回路に手を近づけるだけでH、Lを繰り返したり、Lに張り付き信号が入っていないのに、入ったと誤判断したり、ムチャクチャな動きになります。これを安定させるために登場するのが、プルアップ(PU)抵抗と呼ばれる部品で、図aがそれです。

 1KΩ~10KΩを使用します。抵抗値が大きくなるほどノイズに弱くなりますが、消費電流は逆に少なくなります。この辺りは、回路の目的に応じて選びます。

 図bのように、逆にスイッチの片側を+5Vに接続して、抵抗を通してGNDへ落す回路も考えられます。これはスイッチがOFFでハイインピーダンス状態になったとき、GNDへ落す役割をしていますので、プルダウン(PD)抵抗と呼びます。この方法でも間違いではないのですが、デジタル回路はスイッチだけが入力ではなく、トランジスタをスイッチ代わりにすることもあります。この場合も同じように二種類の回路が考えられます。


 ただ、この場合NPNトランジスタでプルダウン回路(図b)はおかしなことに気づきます。エミッタ(E)側に抵抗があるので、ベース(B)側のからの電流も流れており、トランジスタをスイッチング動作させる場合としては不適切な回路になります。不適切と書きましたが、間違っているわけではなく、これは別のエミッタフォロア回路と呼ばれるものになり、デジタル的なスイッチング動作よりアナログ回路で頻繁に使われる回路になります。この章では関係ありませんので忘れてください。

 NPNトランジスタを使うと図aのプルアップ回路が本筋になります。ですので機械的なスイッチ回路なども混ざる入力回路では自然とプルアップ型が主流になります。
 抵抗アレイなどもたくさんの回路専用に特化された部品です。同じ仕様で無いと都合悪いわけです。
 また、このハイインピーダンス状態はスイッチを使うときだけに発生するかというと、そうでもありません。この後、いろいろな回路でこの状況に遭遇しますので、注意してお読みください。



クランプ保護回路

 あとはPICの入力ポートを繋げばいいのですが、だいじなPICをワケの解らない回路に直接繋ぎたくありません。で、抵抗とダイオードの簡単な保護回路を通すのが、お決まりとなっています。ちなみにプルアップ抵抗(PU)は状態を安定させるもので、保護回路ではありません。また0.1uFはノイズ対策用です。





 抵抗値は100Ωから10KΩほど、ダイオードは小型の小電流用です。GNDから電源に抜けるように接続したダイオードがクランプ回路と呼ばれる保護回路です。

 何かの間違いで、入力ポートに12Vが入ったとします。すると電流は直列の抵抗を通って、ダイオードを通過して電圧の低い5V電源のほうへ流れますので、入力ポートは5V+ダイオードの順方向電圧降下の約0.7Vほどの電圧しか掛からないことになります。

 逆に-12Vという電圧の場合も同じです。今度はGNDのほうが電圧が高くなりますので、GNDから-12Vへ向かい、入力ポートは-0.7Vほどで収まります。静電気対策には必要不可欠の回路だと思ってください。

 それなら、そのまま12V信号を流し込んでも大丈夫じゃないかというと、それはそれで精神的によくないわけでして、微電流の場合は問題がありませんが電流値が上がると、ダイオード破壊が起きて危険度が増します。
 で、これは保護回路と割り切って、ちゃんとした電圧変換回路を考えます。



電圧変換回路

 電圧を下げる=抵抗、と頭に浮かびますが、これが意外と厄介なんです。
 図のように1mA消費で計算して12Vを5Vにするには、7KΩと5KΩの抵抗で7Vと5Vに分圧します。

 簡易的にはこれでいいのですが、12V入力が変化する場合を考えてください。たとえばクルマです。クルマは走行すると電圧が13Vを越えたりします。そうすると、この出力電圧も一緒に上がることになりますし、温度の変化でもフラフラと上下することになり、こんな不安定な回路あまり実用的ではありません。
 アナログ的に考えると、高い電圧をPICに適した5Vに下げる……と思考を巡らせるかも知れませんが、ここはデジタル式に考えてみましょう。
 12V(24V)が入ったら、5Vを出せばいいんです。求められているのはこれだけです。

 入ったら出す。これって前回の出力回路と同じことを言っています。

 リレーでもいいし、トランジスタでもいいわけです。

 ただリレーを利用するのはチャタリングや消費電流、コストの面から考えて得策ではないかもしれません。



もう少し楽をしたい

 入力ポートいうのは、意外と同じようなものがたくさんあるもので、ロボットなどの関節情報やあらゆるセンサーの信号などが入り乱れて注がれますが、結局すべて同じ種類の信号というのが多々あります。それに対して一回路ずつ、ちまちま作るのは……という方のために、例のトランジスターアレイがお勧めです。

 ただ、前回の出力編で使用したTD62003は2SC1815と異なり、ダーリントン接続のため飽和電圧が高く、規格表では1.1Vとなっています。ほとんど電流を出さずに使用した実測では、ほぼ0.8Vですが、この電圧はPICの入力ポートが、Lと判断するぎりぎりの電圧になりますので、最悪トランジスタがONになってLを示しているのに、PICが認識しないという不具合が起きる可能性が無い、とは言いきれないギリギリの数値です。
 手元に転がっているとか、値段が安いとかの理由でなければ、無理してこれを使う必要はなく。飽和電圧の低いTD62502、TD62503を使用したほうがいいと思います。
 実際筆者はTD62003を入力回路に使用することが多いですが、ギリギリ動いています。でも、できれば卒業したい常に思っていますが、そこらじゅうに転がっているもので……。転がっているほうが変ですね…。

 例えば、TD62503を例に取りますと……
 3~5Vならそのまま直結が可能で、12Vが相手なら2.2K~4.7KΩ抵抗、24Vなら4.7K~10KΩを通してつなぎます。ちなみにTD62502は7V~15Vまで入力抵抗なしで直結できます。ただし、7V以下は使えません。(無反応になると思います)
仕組みはちっとも難しくありません。これまで見てきたトランジスタ回路がたくさん詰め込まれているだけです。2SC1815の回路とさほど変わりませんので、回路部分は三角形の簡易的なカタチにして表すのが通例となっています。ちなみに三角の頭に丸が付いているのには意味があります。出力が負論理ですよ、といっているのです。

 トランジスタアレイの入力に電圧が掛かると、出力はLに。電圧が途切れると出力はハイインピーダンス状態( "Z" で表します)になります。



入力と出力の関係は次のようになります。

 入力=H 出力=L
 入力=L 出力=Z (Z=ハイインピーダンス:無接続)
 入力=Z 出力=Z
 この組み合わせはこの後に出てきますのでよく覚えておいてください。

 トランジスタアレイのほとんどはオープンコレクタタイプですので、OFFになると切断状態。すなわち無接続、ハイインピーダンスです。そこで先ほどのプルアップ抵抗を使います。

 オープンコレクターと呼ばれるものは回路を見ると解りのように、プルアップ抵抗もプルダウン抵抗も何も無い完全フリーな状態のことです。なにが利点かと言うと、出力電圧を自由に決められることと、もう一つ、出力どうしを並列配線することが可能になるということです。
 もし5Vにプルアップされた出力どうしを並列に配線すると、プルアップ用の抵抗も並列配線されますので合成抵抗値が半分になってしまい、出力トランジスタの負荷が増大します。ところがオープンコレクタだとそれが起きません。これを利用すると、次のような回路ができます。
 上の回路図はトランジスタアレイ内の2回路を利用しています。三角マークでは分かりにくいのでベース抵抗などを省いたトランジスターで表しています。
 入力1と入力2があって、出力は1本にまとめられてプルアップ抵抗で5Vに吊り上げてPICの入力に接続しています。

 これは何を意味するのでしょうか。
 二通りの使い道があります。
 一つは入力1と入力2のどちらかがHになるとPICのPC0がLになります。つまりNOR回路です。

 同じ回路なのにもう一つの使い道とは、ゲート回路です。
 入力2がLの時、出力2はZ状態。無接続です。つまり無いのも同然で入力1の結果がPC0に素通しなります。
 では入力2をHにした時を考えてみましよう。すると出力2はLです。となると、入力1がLになろうがHになろうが、出力1は出力2のLで固定されたままです。つまり入力2がLの時だけ入力1の結果がPICに届くことになります。これがゲート回路です。入力2が門番の役目をするのです。

 もちろんゲートのコントロールをPICで行ってもいいのですが、例えばクルマのイグニッションがONの時は信号を遮断して、イグニッションをOFFにすると入力1の信号がPICに届くとかの回路とかにも利用できます。通常はゲート回路やそのコントロールは5V電源のTTLICを利用しますが、こんな簡単な回路でも実現可能です。

 話は変わりますが……。
 入力回路の理論が実践で役に立たなくなることがよくあります。
リアルタイムなプログラム1 (ループ) でも述べましたが、チャタリング現象もそのうちの一つです。機械式の接点のバウンド(ON・OFFの繰り返し)に反応してしまいスイッチを押しているのに無反応になったり、パルス性のノイズが入力を通ってPICが誤反応してしまうこともあります。回路的には間違ってはいないのですが正しく動かず、長いあいだ原因が解らないときが多々あります。

 チャタリングやノイズなどもプログラムを工夫すればある程度は防げます。特にチャタリングは数十ミリセックの短いあいだの現象ですので、いったんONを検知したら一定時間待ってから再度入力の状態を見て処理するなどの工夫をします。

 コンデンサでノイズ対策をした場合の参考回路は下記のようになります。トランジスタの絵は使わず、トランジスタアレイ内の絵を使っています。



 他にもトランジスタスイッチの入力回路が過電圧などで飛ぶと、高圧の外部電圧がPICに直接飛び込んで、全回路が巻き添えを喰らう可能性があります。
 そんな保護やノイズ対策も考えて、頑強な入力回路を作りたいと思われるのでしたら、やはりフォトカプラです。



入力は絶縁タイプのフォトカプラで

 フォトカプラというのは、チップの中に発光ダイオードとフォトトランジスタと呼ばれる、光を与えるとONになる特殊なトランジスタが入っている部品です。

 構造も仕組みも簡単で、LEDを光らせればONになりC→Eへ電流が流れます。トランジスタアレイの出力段がフォトトランジスタになっていると思えば、それほど難しいものではありません。

 この部品の優れているところは、LED側とフォトトランジスタ側を光りで繋いでいるところです。お互い別電源で繋ぐことができますので、ノイズや電圧の変化に強い回路ができます。ただし、GNDどうしを繋いでしまうとノイズがGNDを走って、相手に伝わりますのであまり意味はなくなります。GNDが貧弱ですと基準点の電圧がフラつき、簡単にノイズが走ります。これはフォトカプラだけでなくすべての回路に言えることです。くどいようですがGNDはしっかりと…です。

 まったくの別電源でGNDを切り離していても、ちゃんと信号が届きます。

 入出力の関係はトランジスタアレイの逆で、PICの端子は次のようになります。
 入力=H PIC=H
 入力=L PIC=L

 LED側は入力電圧に合わせて電流制限抵抗値を変えればよいだけです。10mAほど流せば、フォトトランジスタは反応しますので、12Vなら1KΩほど、24なら2.2KΩになります。

 欠点もあります。
 信号を光りに変換して、それをまた受光してONにしますので速度が遅いことです。これはフォトトランジスタに付ける負荷抵抗でも大きく変わります。
 先ほどのトランジスタアレイの場合でのON/OFFの遅れは、負荷抵抗3.3KΩで0.05μS~0.2μS(μS=百万分の1秒)に対して、フォトカプラはずいぶんと遅くて1.9KΩで2~25μS。10KΩにすると100μSの遅れが出ます。

 しかし扱う信号の、H、Lの周期が数十m~数百mS(mS=千分の1秒)の信号を扱うのでしたら、じゅうぶんな速度だと思います。
 消費電流はLEDを点灯させるので、かなりの大飯喰らいですが、回路の頑強さは絶縁型とあって、右に出るものはないかと思います。
 速度が遅いということは、逆に考えると、高速のショックノイズは伝わらないとも言えます。
 消費電流を考えないのならフォトトランジスタの負荷抵抗は1K~4.7KΩ。電流をケチりたいのでしたら10KΩを推奨します。



お得な回路

 電圧はいろいろあるけど、もっと簡単にならないかというのが世の常でして、そんな要求は頻繁に起きます。
 かなりリスキーになりますので自己責任に置いて試してみてください。

【高電圧回路とつなぐ】
 用意するのはダイオード1本です。超簡易型高電圧対応型入力ポートです。
 なんか大袈裟なタイトルになっていますが、ようは相手の信号がLのときは、確実にGND電位まで落ちるという条件のときに可能になります。
 Hのときは電源電圧より高ければ何Vでもかまいません。LだけGNDに落ちればいいのです。ただしPICへ直結するのはさすがに怖いのでトランジスタスイッチを間に入れます。



 図のようにダイオードが一本入っているだけです、ダイオードから後ろはいつものトランジスタスイッチです。

 外部信号がHのとき、ダイオードがありますのでカソードで堰き止められて中には入ってきません。代わりに5Vから通常のバイアスが掛かり、トランジスタはON。するとPICはLを検知します。
 逆に外部信号がLになり、GNDレベルまで電圧が下がると、プルアップ抵抗の先がダイオードの順方向電圧降下まで下がりますので、トランジスタはOFFとなってPICにHが伝わります。

 ダイオードのカソードには相手の電圧がまともに掛かりますので、逆電圧の耐圧を数倍のものにします。
 1N4007が手に入れば1000V耐圧です。
 参考(1N4001:50V 1N4002:100V 1N4003:200V 1N4004:400V 1N4005:600V)

 耐圧が十分だからと言ってもダイオード1本ではあまりに無防備です。そこでもう少し心臓に優しい次の回路はどうでしょうか。

 今度は完全にトランジスタスイッチで5V電源と分離しています。0.1uFはノイズ対策用ですが、まだダイオードが入っています。その理由は何でしょう。

 12VのH電圧が入ってもいいようにバイアスの抵抗もかなり大きい数値になっているにもかかわらずです。

 この回路は目的をクルマ用に考えています。最近のクルマは内装にLEDが使われるようになって微弱な電流でも点灯します。ダイオード無しでこの回路をLEDの点灯回路に接続しますと、青の点線のようにGNDへ流れる経路ができてしまい。LEDが消灯なのに薄っすらと点灯してしまうという不具合が起きます。しかも夜でないと分からないぐらいの暗さで点きますので、その場では気付かないで、後で慌ててしまう結果になります。

 また入力がHのときにダイオードで外部のバイアスが遮断されますので、47KΩを通して12V電源とつないでいます。



L信号が0Vで無い場合

 先に出てきましたが、Lが6V、Hが12Vの場合などがこれに当たります。
 H/Lを作るのはおなじみの2SC1815を利用したスイッチング回路を利用しますが、その先にツェナーダイオードを使用します。

 通常ダイオードは、逆電圧を与えると遮断する性質があります。カソード(K)からアノード(A)には電流が流れません。ですが、ツェナーダイオードというのは、カソード側にある値以上の電圧を与えると、急激に流れるような性質を持った特殊なダイオードです。



 その堰を越える電圧をツェナー電圧といい、たくさんの種類があります。ここでは最大12Vですので、ツェナー電圧が5Vほどのものを選んでみました。駆動するのもトランジスタ一つですので500mWクラスの小さいもので大丈夫です。ようするに12Vが入ると、ツェナー電圧5Vを越えるので、後続の2SC1815のベースに電流が流れてONになります。ONになれば、PICにL信号が入るという仕組みです。

 5V以下になるとツェナーダイオードはもとのダイオードに戻りますので、電流が遮断されます。電流が切れるとトランジスタはOFF(Z)になりますので、コレクタにはプルアップ抵抗の電圧が掛かり、PICにはH信号が入ります。
 2SC1815のベースには抵抗を通してGNDに接続されてますので、これがプルダウンとして働いてベース電流が切れたら、トランジスタを確実にOFFにしてくれます。この抵抗が無いと電源のON/OFFで出力がバタつくことがあり、非常にやっかいになります。



妙に速かったり、逆にひどく遅い信号を相手にするとき
 これまでは電圧のことばかりを考えてきましたが、速い信号や遅い信号の場合どうするかという問題です。

 PICがクロック10MHzで走っているとき、命令はほとんどが400nSというサイクルでこなしています。つまりひとつの命令を0.4μS、250万分の1秒という途方も無い速度で……と思うのはもう過去の話。現在はピコ秒の時代です(1兆分の1秒)。

 人間感覚では到底想像できない速度です。実際にどれぐらでHやLのチェックをしているか調べて見ます。
 PORT_Bの状態を最速でチェックさせたとしたら、以下のようになると思います。

LOOP:
   btfss PORT_B,0
   goto XXXX
   goto LOOP

 ポートBがLになるまでラベル、LOOPを繰り返す命令です。LになればXXXXへ飛ぶというプログラムです。
 この場合、命令は全部で3つあるので、3サイクルかというと残念ながら、『スキップ』と『goto』命令は2サイクルになるので、PORT_Bが、Hのあいだは4サイクルを使用しています。1サイクル0.4μSなので、1.6μS掛かります。
 もしそれ以上短い信号で『H→L→H』と来たら、見逃すことがあります。

 実際は他にもいろいろとPICに仕事をさせているはずですので、これはもっとひどくなり、10~50μSの信号でさせえも見逃すことがあります。

 どうするか…。
 一番簡単な方法は、PICのRB0割り込みをを使用することです。
 他の処理をこなしている最中でも、割り込みが働き、見逃すことなく処理は分岐します。(割り込み処理の基本 を参照してください。)



シュミット・トリガ

 では逆に非常に遅い信号の場合ははどうするかです。
 例えば、夕方、陽が落ちたら電気が点くようなシステムを考えます。

 明るいときに5V、真っ暗で0Vになるような回路を考えたとします。もちろんデジタル回路でしたら、5Vか0Vのどちらかしかないので簡単ですが、そんな都合のいい部品はありません。だいたいは光の強さで電圧が変わるか、抵抗値が変わるという部品が一般的です。となると、昼から夜の移り変わりはゆっくりしてますので、その電圧の変化もゆっくりと5V→0Vへと変化するはずです。

 どちらにしても夜になれば0Vになるので、ポートをチェックして、Lになれば『夜』とすればいいわけでして……とは問屋が卸してくれません。

 デジタルのHからLに変わる、閾(しきい)値の周辺をゆっくりと変化すると、HになったりLになったりバタバタと繰り返してしまい、どちらとも取れない状態になります。普通は瞬簡に切り替わるHとLですがゆっくり変化するとこのような不都合が生じます。
 この場合、Hと認識するしきい値と、Lと認識するしきい値に差を与えてやるとうまくいきます。これをシュミット・トリガといい。PICのポートのいくつかはこの回路が使われていますので、そのポートを使用するといいでしょう。

 PIC16F877Aの場合。カタログのピンアウトの説明欄で、BufferTypeが、『ST』と書かれたポートがシュミット・トリガ入力になっています。



 次回はUSART通信です。







補足:現在はありません

_______________________________________________________





2018.11.04





1