PROJECT GIZXX

変なプロジェクト名ですが、このプロジェクトは、PIC16F877という ワンチップマイコンを使用して、ボリューム(可変抵抗)で0V〜5Vに変化させた電圧 をAD変換するというものです。AD変換した値は2桁の7セグメントLEDに表示 します。さらに、BCD出力もしてしまいます(@_@)。(って別に凄くないやん>私)

当ページの情報を利用して生じたいかなる損害についても責任を負いかねます。あしからず ご了承くださいm(_ _)m。あと、回路関係は私の独学なので、その辺を注意してお読みください(^^:。

トップへ戻る


そもそもこれはとある人に依頼されて作ったものです。 なんか燃料噴射の研究をされていて、それの噴射タイミングをツマミで変化させたかった んだそうです。報酬としてファミコン本体+ソフト多数をもらった (←むろんこれは私の研究材料(謎)ので、断るわけには行きませんでした。 プロジェクト名は依頼者のあだ名が偽○者だったことにちなんでいます (どうでもいいって)

何せPIC(ぴっく)マイコンのことを良く知らなかった私は、とりあえずADコンバータと I/Oポートが沢山付いてたらできるだろうという感じで、PIC16F877を購入しました。 このワンチップマイコンのメーカーであるMicrochip Technology 社のページからPICマイコンシリーズの資料が手に入ります。英文が苦手だという方は、

電子工作のためのPIC活用ガイドブック, 後閑哲也著, 技術評論社, ISBN4-7741-0921-5

を買うと良いかもしれません。近日稀に見る(?)電子工作の本です。逆に、便利なPICマイコンによって 電子工作がいちだんと身近になったと言えるのかもしれませんね(^^)。

あとトランジスタ技術という月刊誌(CQ出版) でもよくPICマイコンが取り上げられています。最近はPICマイコンとある程度の互換性をたもちながら さらに高速化されたアトメル社のAVRマイコンがPICマイコンユーザの注目を 集めているようです。


前置きはこれくらいにして、本プロジェクトの回路図を図1に示します。PDFの資料を3日ほどかけてだらだらと 見た後に作りました。

PROJECT GIZXX の回路図
図1

PICマイコンはICのピンの一つ一つが多機能で、私などは初めて見たときは戸惑ってしまいました。 が、とりあえず自分が欲しい機能を実現するピンがどれかをはっきりさせておけば大丈夫なはずです。

本プロジェクトの本質は:

  1. ADコンバータを使う。
  2. I/Oポートをデジタル出力として使う。
です。そこで、ADコンバータについて調べてみると、PIC16F877 では、AN0 - AN7 がADコンバータのアナログ入力端子に設定することができることが分かります。今回は可変抵抗で 作った電圧の入力1つだけなので、迷わず AN0 を使うことにしました。複数の入力を行う場合は、 AN0 - AN7 を順番に切り替えてAD変換を行います。

RAx, RBx, RCx, RDx, REx (x は数字) はディジタルI/O入出力ポートです。 これらのポートはビットごとに入出力を指定できます。ただし、RA0/AN0 は、ADコンバータの アナログ入力用として使うことにしたので、今回は RA0 はディジタルI/O入出力としては使いません。 しかしこの場合も、RA0 は入力に設定しておく必要があります。

簡単に回路の説明をします。まず VR1 によって、0〜5Vの電圧を作り出します。 これは、図2のように R1 と R2 に分解すれば分かりやすいのではないかと思います。


図2

VR を右に回すと、図2の矢印付きのリード線が上へ +5V 側へ移動し、左に回すと GND 側へ移動する 様子をイメージしてください。VR の抵抗値を 25 [kΩ] とすると、VR を左に絞りきったとき R2 = 0 となり、R1 = 25 [kΩ] になります。このとき、V は GND に接続された状態に等しいので V は 0 [V] です。 VR を時計方向に回すと R2 の値が増加し、その分 R1 の値が減少します。VR をちょうど真ん中まで回すと R1 = R2 = 12.5 [kΩ] となります。このときの V は:

V = 5[V] * [R2 / (R1 + R2)] = 5[V] * 12500 / 25000 = 2.5[V]

になります。VR を右に絞りきったとき R1 = 0, R2 = 25 [kΩ] となり、V = 5 [V] になります。

あとは R3 - R9, Q1, Q2, D1, D2 をまとめて説明します。これらを1つのLEDに置き換えた 回路を図3に示します。


図3

ところで、LEDの+側(RB1側)をアノード(anode)、−側をカソード(cathode)といいます。


図4 アノードとカソード

LEDの電流はアノードからカソードへ向かって流れると考えます。LEDはダイオードの 一種なので、アノード側がカソード側よりも約 0.65 [V] 高くなってはじめて電流が流れ 始めます。それ以上の電圧をアノード−カソード間に与えた場合、アノード−カソード間の 電圧降下は 0.65 [V] でほぼ一定です。普通LEDに流す電流は 10 [mA] 程度なので、 RB1-カソード間に +5 [V]を加えた場合、R1 を (5[V] - 0.65[V]) / 0.01 [A] = 435 [Ω] にすればよいことになります。ところが 435 [Ω] ピッタリの抵抗はどこにも売っていないし、 手もとに 330 [Ω] があるのでコレを使うことにします(って、適当やな!!>私)。 この場合、実際にLEDに流れる電流は (5[V] - 0.65[V]) / 330 = 13.18... [mA] です。 まぁ許容範囲でしょう(多分)

[2004.10.15] 修正

大ウソ書いていました(汗。 LEDはダイオードの一種ですが、通常のダイオードの電圧降下が 0.65 [V] 程度なのに対し、 LEDの電圧降下は 2 [V] 程度です。よってLEDに 10 [mA] 流す場合の抵抗値の計算は、 (5[V] - 2[V]) / 0.01 [A] = 300 [Ω] となります。よって手元に 330 [Ω] があるのでコレを使うことにします。(って上と同じやん>私) これで暗いと思う方は1段階低い 270 [Ω] を使うと良いと思います。ちなみに 270 [Ω] を 使ったたときにLEDに流れる電流値は (5[V] - 2[V]) / 270 = 11.1 [mA] です。

図3のトランジスタは、電圧増幅の目的ではなく、スイッチング(と電流増幅) の目的で使用します。 トランジスタのベース(B)−エミッタ(E)間の電圧がおよそ 0.65 [V] 未満であれば、コレクタ(C)− エミッタ(E)間に電流は流れません(スイッチをOFFにした状態)。ところがベース(B)−エミッタ(E)間 におよそ 0.65 [V] 以上の電圧をかけると、突然コレクタ(C)−エミッタ(E)間に電流が流れ始めます (スイッチをONにした状態)。図3の回路はトランジスタのこの特徴を利用したものですが、このことから、 図3の回路でLEDを点灯させるには、RA1 と RB1 を同時に +5 [V] にしなければならない ことが分かると思います。

「LEDのカソードをそのままGNDに接続したらいいやん」と思われるかもしれませんが、 これをやろうとすると、LEDの数だけ RBx 信号線が必要になってしまいます。 この様子を図5に示します。


図5 配線が多すぎる!!

RB8 - RB14 などという信号線は PIC16F877 には存在しませんが、ここでは仮に RB0 - RB7 と同様の ディジタル I/O 信号線だと思ってください。2桁だと小数点を除いても7×2=14本の信号線が 必要になります。3桁だと21本です。これだと配線が多いので、RB1 - RB7 を、複数の 桁表示で使いまわすことを考えます。具体的には、桁単位で表示を高速に切り替えて、 肉眼ではあたかも両方とも常に点灯しているかのように見せる方式をとります(TVの走査線なんかも よく似たことをやっていて、ある一瞬で実際に表示されているのは1走査線だけです)。今回は 7セグメントLEDを2桁で表示する必要があるので、RB1 - RB7 の信号線を 2つの7セグメントLEDで共用し、約 5 [ms] の間10の桁を表示し、次の 5 [ms] で1の桁を表示 します。このくらいの周期で表示を切り替えると肉眼では両方の桁が光っているように見えてしまう のです。

このように表示を高速に切り替えて表示することで、LED の桁数が増えても RB1 - RB7 は共用 できるのですが、切り替え表示を行うからには、現在表示したい桁だけをセレクトする制御線が 必要です。そこで、この制御線の役割を RAx の信号線とトランジスタに担当させるのです。

「わざわざトランジスタなんか使わんでも、LEDのカソードを RA1 に直接接続して、 RB1 を +5 [V], RA1 を 0 [V] にしたらええんとちゃう?」と思われるかもしれません。 しかし、この場合、7セグメントLEDからの電流を無理なくシンクする(GNDに沈める という意味だと思う^^)ためにトランジスタは必要です。

PIC16F877 の資料を見てみると、各 I/O ピンがシンクすることができる電流の上限値は 25 [mA] となっています。一方、LEDを点灯するには、上に書いたように、普通 10 [mA] 程度 の電流を流します。ということは、各 I/O ピンが直接 LEDをドライブできるのはたかだか2つ までということになります。7セグメントLEDでは、全部のLEDを点灯させた場合(8を表示 した場合ですね^^)、70 [mA] もの電流が流れることになります。これでは I/O ピンが過電流で 破壊されてしまいます。そこで、PIC マイコンの I/O ピンよりはいくらか多くの電流をドライブ できるトランジスタにLEDから流れ出る電流をシンクしてもらうのです。この様子を図6に示します。 (図6では抵抗値が 330 [Ω] であるため、13 [mA] * 7 = 91 [mA] の電流が流れます)


図6

回路の説明はだいたいこんな感じでしょうか。なんかあったらまた付け加えます。 とりあえずこの回路の制御プログラム(MPLABのプロジェクト一式)を ここからダウンロードできるようにして、 いったんここで完了ということにします。 アドバイス、誤り、勘違い等のご指摘・ご報告が ありましたら教えていただければ幸いです。

トップへ戻る


(C) Ki 2001