前回までに、7 セグメント LED のダイナミック点灯が、ほぼ、できあがりました。
が、ゴーストがでている、という問題点が残っています。ゴーストとは、デジットの切り換えと表示するデータの切り換えとのわずかなタイミングのずれのために、ほんらい点灯すべきではないセグメントが、薄ぼんやりと点灯してしまう現象です。
今回は、このゴーストを消すためのブランキング回路をつくります。
ブランキングとは
ややこしい説明より、ブランキング回路から出力された信号をみてもらうほうがわかりやすいと思います。
図 1、512Hz 信号 (黄) の立ち上がり、立ち下がりエッジでデジットが切り換わります。ブランキング信号 (青) はデジットが切り換わる前後、100μs ほどの幅で LOW を出力しています。このときに 7 セグメント LED を消灯し、ゴーストを抑止する。
これが、ブランキングです。
ブランキング信号をつくる
ブランキング信号は、デジットの切り換わるタイミングで出力しますから、周波数にすると 1024Hz です。LOW の幅を 100μs とすると、デジット切り換えの 50μs 前をとらえないといけないので、10KHz ほどのパルスが必要になりそうです。そいつと、デジット切り換えの条件をみたすパルスをつくって AND して……、うーん、面倒くさそう (;´Д`) だいたい 10KHz ほどのパルスをどこで手に入れるのよ、発振部の 74HC4060 からそんな周波数はでないぞ。
どうしようかなぁ。と、思いついたのが、PWM。
1024Hz のパルスから、デジット切り換えのタイミングで谷になる三角波を生成、こいつをデューティ比 10% の PWM 波に変換すると、パルス幅が 98μs になる。さらに、デューティ比を変化させると、7 セグメント LED の輝度調整もできちゃう、んじゃあ〜りませんか、と。
で、できあがったのが、図 1 のブランキング信号です。
回路図
図 2 が、ブランキング信号の発生回路です。
ブランキングに関する部分は、上側の U1/IC1、U1/IC2 です。
下側 U2/IC2 は、おまけ。後述します。
1024Hz のパルス信号を、オペアンプ LM358 による積分回路に入力します。出力された三角波を、コンパレータ LM2903 で PWM 波にしています。VR1 がデューティ比を定める基準電圧のボリューム。こいつを調整することで、ブランキングの幅を変化させて LED の輝度調整ができます。
三角波発生回路
オペアンプ LM358 の積分回路により、デジット切り換えに同期した三角波を発生させます。
1024Hz のパルスは 5Vp-p なので、R1、R2 で基準電圧を 2.5V としています。したがって、入力電圧 Vin は 1/2 の 2.5V、三角波の出力電圧 Vout が 3Vp-p、積分時間 t は入力信号の周期の 1/2 なので 0.49ms。時定数 CR を求めると、
C2・R3 = (Vin/Vout)・t = (2.5 / 3) × 0.49 = 0.41 [ms]
R3 を、R1//R2 = 11KΩ より 10KΩ とします。このとき C2 は 0.041μF ですので、0.047μF (47nF) としました。このときの出力電圧は、
Vout = Vin/(C2・R3)・t = 2.5 / (0.047 × 10) × 0.49 = 2.6 [V]
実測値では、Vmax = 3.7V、Vmin = 1.3V、Vp-p = 2.4V となりました。
R4 は、積分回路のゲインを抑えるための負帰還抵抗。積分回路を安定させる、って感じかな。R3 の 10 倍として 100KΩ とします。カットオフ周波数 fc は、
fc = 1/(2π・C2・R4) = 1 / (2π × 0.047 × 10-6 × 100 × 103) = 34 [Hz]
つまり、34Hz 以下の入力に対しては、ただの反転増幅器になる、ってこと。大雑把 (^_^;)
C1 は、ノイズ除去です。74HC4060 の出力って、けっこうヒゲがでるんです。LM358 の入力電圧は -0.3 ~ 32V、上は大丈夫でしょうが、下は要注意です。
PWM 波発生回路
三角波を、コンパレータ LM2903 により PWM 波にします。
基準電圧は、VR1 により 1.7V ~ 3.3V に調整できます。これにより、デューティ比 12 ~ 88% (実測値) となりました。最小のブランキング幅は約 120 μs で、充分です。ブランキングの時間を長くする、ということは、LED の点灯時間が短くなる、ということで、輝度が落ちます。輝度調整 (PWM 制御) に利用することができます。
出力されたブランキング信号は、BCD to 7 セグメント LED デコーダ TC4511 の BI に入れます。BI は、LOW にするとすべての表示が消灯する入力端子です。
C3 は、発振防止です。というか、C3 がないと異常発振します。
コンパレータの発振防止というと、ヒステリシスを設定するのが一般的なのかな、と思います。が、ここではタイミングがずれてしまうので、よい方法ではありません。また、じっさいにヒステリシスではあまり効果がありませんでした。
基準電圧側にコンデンサをいれるのも、発振防止に役立つといわれます。容量は、カットアンドトライで 4.7nF に決めました。LM2903 の入力電圧は -0.3 ~ 36V なので、電源切断時の電源側への流入も問題ないです。
おまけ:起動時の点灯テスト回路
ブランキング信号発生をアナログ回路にしたので、電源投入時の立ち上がりが遅くなり、不要な点灯表示をするようになってしまいました。なので、電源投入時の初期化処理が必要になりました。
表示をブランクにする、ってのもアリですが、7 セグメント LED なので、点灯テストを兼ねて、電源投入時に 1 秒間ほど全セグメントを点灯、つまり「8」を表示させようと思います。これは、TC4511 の LT 入力を使うことで、簡単に実現できます。
電源投入後 1 秒ほど待ってから HIGH を出力すればいいだけなので、トランジスタなんかでちゃちゃっとつくればよいです。が、芸がない (;´Д`) コンパレータ LM2903 は 2 回路入りで、1 回路あまってますから、こいつを使いましょう。
回路は、図 2 の下側 U2/IC2 の部分です。
電源が入ると R10 をとおして C4 が充電され、約 1 秒後に基準電圧 2.5V を超え、コンパレータの出力が HIGH になります。これを TC4511 の LT 端子に入れます。電源投入時 LT は LOW ですから、7 セグメント LED は「8」を表示します。過渡的には一瞬 HIGH になるんですが、すぐに全セグメントが点灯するので、気にはなりません。LT が HIGH になると、通常の表示になります。
D1 は、電源が切れたときに、C4 を放電させるためのダイオードです。まぁ、なくても、放電にちょっと時間がかかるってだけの話。LM2903 への流入も問題ないです。
こちらの回路のばあいは、ヒステリシスを設けるために R11、R12 をつけています。
出力電圧 Vo は 5V なので、ヒステリシス幅 ΔV は、
ΔV = Vo・R11/(R11+R12) = 5 × 10 / (10 + 100) = 0.45 [V]
ヒステリシスとしてはちょっと大きすぎるかな、って感じですが、異常発振を抑える必要もあって、この値にしました。異常発振はまだ残っていたので、C5 によりさらに抑制しています。
製作後記
7 セグメント LED のダイナミック点灯の回路は、これで完成です。前に製作したデジタル時計の時刻表示に……、と思ったのですが、残念ながら、すでにあのブレッドボードは解体されてしまいました (;´Д`)
入力が Dip スイッチになっていますが、ここにそれぞれ BCD 信号をいれてやれば、4 桁の数字表示が可能です。ただ、Arduino からデータを受けるときには、シリアル入力にしたいですね。それなら SIPO のシフトレジスタを使えばよいです。
ゼロサプレスしたいって?んっと、BCD 信号を 0b1111 とかにするとブランクになります。組み合わせ回路で BI を抑えるなら、オープンコレクタのワイヤード OR でどうぞ。
あ、そうだ。俺、あまり気にしてないんだけど、TC4511 の「6」と「7」と「9」のフォントが嫌いだって人、多いみたい。お好きなデコーダでどうぞ。
組み合わせ回路で処理できねーか? 気が向いたら、考えてみます。