概要

PIC18F46K22のSPIに74HC595経由で7セグメントLED4桁をドライブする。
電源はUSBから供給するので5Vである。
アノードコモンの7セグLED 4桁をダイナミックドライブ回路である。使用するLEDは安かったHDSP-7301を使用。

概略設計

a~g,DPのドライブ

74HC595で直接LEDをドライブした場合

シリアル信号をパラレルに変換するために74HC595を使用する。74HC595のOUT端子の出力電流は35mAである。
ICの電源端子の最大電流は70mAなので全セグメントを点灯させると1セグあたり70mA/8=8.75mAである。4桁をダイナミック点灯させるので、スタティックドライブに換算すると1桁1セグ当り8.75mA/4=2.19mAまでとなる。 スタティックドライブで5Vで電流制限抵抗で約2.2kΩ(1.5mA)テストしてみると部屋の中で点灯させても少し暗い感じがする。希望は1セグあたり3mA以上は欲しいところであった。 ちなみに74HC595の最大損失は750mWなので安全率を見込んで200mWとすると1セグ当り25mWである。OUT端子のドレインソース飽和電圧を1Vとすると25mAまでOKとなる。 このLEDを74HC595のみで4桁ドライブする場合は、明るく点灯させるのは困難である。 このLEDの1セグの明るさは500μcd時 10mAである。秋月で高輝度タイプと歌われているA-551SRD20mcdで10mAである。同じ電流なら40倍明るい。このようなLEDなら74HC595でドライブ可能であろう。

74HC595+トランジスタでドライブ

アノードコモンなのでNPNタイプのトランジスタを使用する。
桁ドライブが96mA(7セグメント+ドット)なので1桁当り96mA/4=24mAとなる。 2SC1621を使うとhFE=40よりベース電流は、96mA/40=2.4mA ベース抵抗は、(5V-0.6V)/2.4mA=1.8kΩ 余裕を見て470Ωを使用する。

74HC595+ドライバIC M54405Pを使用した場合

1セグメント当り最大16mA出力できる。全電流の合計値が90mA(M54405Pの最大値)である。7セグメント全部点灯させた場合の1セグメントの最大電流は90mA/7=12.9mA 1桁当り平均で12.9mA/4=3.2mAである。出力時飽和電圧が0.4Vである。1セグ当り、0.4V*16mA=6.4mW 全セグメントで44.8mWである。4bitバイナリ入力すれば7セグには該当する文字が表示されるためプログラムが楽です。
4bitをM54405Pに使用し、残り4bitを桁信号に充てると、1バイトで制御可能である。

採用方式

回路がシンプルなM54405Pを使用する。たまたま手持ちがあったがこのICは入手困難となっているようである。

桁ドライブ

単純にビットごとに桁信号を割り当てた。この場合、4ビット全部をLにすると前桁同時に点灯できてしまう。ドライバICの出力電流の最大定格を超える可能性があるのでソフトウェアで注意する必要がある。74HC139でデコードしてから2SA1015をドライブすれば同時に複数桁を点灯できないので、安全な回路となる。
1桁当りピークで96mA流れるため、PICの出力は当然使用できない。手持ちの2SA1015を使用することを前提とすると、最大コレクタ電流を100mA以下とする。a~g,DPを1桁全部点灯させた場合3mA*8*4=96mAとする。
hFE=70とするとベース電流は96mA/70=1.4mA、この時のベース抵抗は、(5V-0.6V)/1.4mA=3kΩとなる。余裕を見込んで1kΩを使用する。
ちなみに、高輝度タイプを用いPICの出力電流に収まるような電流で駆動できれば回路が簡素化されるであろう。

LED電流制限抵抗

1セグ当り3mAにするとスタティック駆動では(5V-1.7V)/3mA=1100Ωとなる。4桁をダイナミック駆動すると1100/4=275Ωとなる。トランジスタのコレクタエミッタ飽和電圧があるので、220Ωを使用する。

駆動時間

1桁当り1ms点灯させ3ms消灯させることにした。この速度ではちらつきもなく、またトランジスタのoff時間が遅いことが起因する隣の桁の点灯内容が次の桁で暗く点灯するゴースト現象は目視では気にならなかった。

回路図(試作版)

回路は次のとおりである。
cir.svg

実際の動作の検証

動作電圧・電流

1桁をスタティックドライブで8を表示した場合の実測電圧はVCEが0.176V VBEが0.867V 1セグメント当り=2.903V/220=13.2mA IB=3.95V/1k=3.95mAであった。8を出力すると13.2mA*7=92.4mAとなり若干定格オーバーとなる。2SA1015のICmaxは13.2mA*4=52.8mAとなる。明るさについては室内では照度が確保されているが、太陽下では殆ど視認できない。この回路でこのLEDでは4桁が限界である。
LEDの電流制限抵抗は220Ωでは若干M54405Pの最大定格を上回るので値を増やす。
2桁を同時に点灯させるとM54405Pの出力電流を上回るので、デバック時や電源投入時で74HC595を初期化していない場合は、注意が必要である。いずれにしてもドライブ電流の少ないLEDを用いればこのようなことを考える必要がなくなり簡単になるが、手持ちの部品で作ると制約が多い。

電源導入後の複数桁同時点灯対策

強制的に1桁のみ点灯させる
M54450Pでドライブしているため74HC595の4bitがいずれの組み合わせでもいずれかのセグメントを点灯させてします。
桁ドライブで触れたように74HC139経由でドライブすればソフトウェアにミスがあっても複数桁が同時にドライブされることは物理的に防げる。
74hc139.svg
ブランキングさせる(74HC595のG端子)
桁ドライブ信号は各桁lowにすれば点灯できてしまいます。74HC595のG端子で出力をハイインピーダンスにしておき出力側を抵抗でプルアップする。 LEDを点灯させるときはG端子をPICのIOポートによりLowにする。
ただしプルアップ抵抗が増えるので煩雑である。トランジスタアレイでソース出力(はきだし型)のものであれば、入力側のトランジスタのベース・エミッタにoff時放電用の抵抗が接続されているのでプルアップ抵抗は不要である。ただし電流を出力する条件がICの種類により入力がHiかLowの違いがあるので確認しなければならない。
74hc595.svg
ブランキングさせる(M54405P)
M54405Pのブランキング信号をつかえば4桁同時に消去できる。

複数桁同時対策の実際の方法

74HC595をSPIで初期設定しない場合、電源投入時の表示値は固定されていない。多くは複数桁同時点灯されている。
やはり安全を考慮すると74HC139で桁信号2bitを4bitにデコードしてから桁ドライブするのが確実である。この場合74HC595が初期設定されていない場合、いずれかの桁が表示されてしまう。
さらに1bitを追加し74HC139をディセーブルするかM54405Pのブランキングを制御し完全消灯状態を作る。
74HC595の出力が8bitに対して、BCDで4bit 桁2bitであり 2bit余っているため、 ドット信号で1bit(74HC595 QG)使用しても1bit使用可能である。
といろいろ考えたが、M54405Pのブランキング端子をSPIのSS端子につなぎプルダウンしておくのが一番簡単そうである。SPI端子を使わなければプルダウンによりブランキングがLowになり表示されない。 SPIでデータを送るとSPIでデータを設定している以外はSS端子はHiなので表示が可能となる。

回路図(完成版)

電源起動時で初期化前の複数桁同時点灯対策を施した回路を示す。
7seg4led.svg
回路図(PDF) 回路図(DXF)

動作イメージ

ダイナミックスキャンをアニメーション化してみた。概念を説明するために作成したものなので実際の動作は異なる。
svgが使用できる環境では1桁毎にステップ動作ができる。
svgが使用できない環境ではアニメーションgifで表示される。
QH QG QF QE QD QC QB QA SCK RCK SER SCL 74HC595 G 1 2 3 4 5 6 7 15 13 11 10 12 14 +5V a b c d e f g g f e d c b a D C B A M55405P LT 13 12 11 10 9 15 14 3 6 7 2 1 +5V BI/RBO 4 RBI 5 10 9 8 5 4 2 3 270 270 270 270 270 270 270 a b c d e f g a b c d e f g a b c d e f g 1 1 1 1 1k 1k 1k 1k +5V HDSP-7301 HDSP-7301 HDSP-7301 HDSP-7301 2SA1015-GR 2SA1015-GR 2SA1015-GR 2SA1015-GR < 74HC139 1Y0 4 1Y1 5 1Y2 6 1Y3 7 A1 2 A2 3 G1 SVGの代替画像

表示データーの設定方法

t.svg
上図でC3~C0が桁を表し、D3~D0が桁の値を示します。

C3~C0

C3:最上位桁 Low:表示 Hi:非表示
C2:3桁目 Low:表示 Hi:非表示
C1:2桁目 Low:表示 Hi:非表示
C0:最下位桁 Low:表示 Hi:非表示

D3~D0

0000 0001 0010 0011 0100 0101 0110 0111
70.svg 71.svg 72.svg 73.svg 74.svg 75.svg 76.svg 77.svg
1000 1001 1010 1011 1100 1101 1110 1111
78.svg 79.svg 7a.svg 7b.svg 7c.svg 7d.svg 7e.svg 7f.svg

タイミング

SS端子をLowにしておきます。
SDO2をセットし、SCK2をLowからHiにすると74HC595のシフトレジスタが1bit 左シフトされ、最下位に読み込まれた1bitデータが取り込まれます。これを8回繰り返します。
SS端子をHiにします。このタイミングで74HC595のラッチレジスタに今までの8bit分のデータが転送され、QAからQHに出力されます。
SCL端子をLowにするとシフトレジスタがクリアされます。
G端子をLowにするとQH~QA端子がハイインピーダンスとなります。

74HC595のシミュレーション

8bit分のビット列を入力して74HC595シミュレーションをクリックしてください。
ビット列(MSB-LSB)=

上のボタンをクリックすると1ビットごとに確認のメッセージボックスが表示されます。
0
入力 備考
SCK↑ 0
SER 0
RCK↑ 0
シフトレジスタ 備考
シフトレジスタ xxxxxxxx
出力QH~QA xxxxxxxx
0:Low 1:Hi x:不定

考察

使用するLEDが高輝度タイプであるかどうかにより回路規模が大きく異なる。手持ちの部品にこだわらなければ高輝度タイプを使いドライブ用のトランジスタをなくしたり、M54405を使用せす74HC595で直接ドライブすることも可能となり16進文字にかぎらず自販機のスロットのような表示も可能となる。ドライブするICの最大電源電流が少なく済めばPICで直接 a~g、桁信号のドライブも可能となる。
また、1桁用のLEDを4個の配線でもかなり面倒なので4桁用のLEDを購入するほうが簡単であろう。また桁間の間隔が狭くできる。