2019年12月6日金曜日

キーボードのデバウンス回路を考える(後編)

前編の続きで、デバウンス回路のやり直し。


反転論理は分かりにくかったのと、atmega328p の内蔵プルアップ抵抗は 30kΩ 前後と少し大きかったので、プルダウン型にして、抵抗も自分で外付けすることにした。 また、デバウンス用コンデンサの充放電の時定数の差が 10 倍と大きかったので、出来ればこれも揃えたかった。

やり直しデバウンス回路

前回の反省を踏まえ、まず放電抵抗を row 線から、col 線のコンデンサの横に持ってくる。

回路図

その変更により、各 col が独立して動作するようになったので、1 col 分のみを描く。


ここで、
  • col はハイインピーダンス(プルアップ・プルダウン無し)の入力端子
  • row は普段は Low レベルの出力端子
と設定する。

待機時の動作

各 row 端子は Low レベルで、ダイオードはオフになっている。したがって、col も Low レベル。コンデンサ C1 は抵抗 R1 を通して電源電圧の 5V に充電されており、充電時の時定数は
0.033uF x 10kΩ = 0.33ms.

スキャン時の動作

例えば row1 を High レベルにすると、キー S1 が押されていれば、R2 を通してコンデンサが放電され、ダイオードによる電圧降下を受けた後の抵抗分圧で、col 端子電圧は
(5 -0.7) x 10k / (10k + 3.3k) = 3.2V
まで上がる。これがマイコンの下限 High レベル入力電圧、例えば atmega328p の場合だと、
0.6Vcc = 3.0V
を超えるように素子値を決める。また、放電の時定数は、
0.033uF x (10k x 3.3k) / (10k + 3.3k) = 0.082ms
で、前回と同じくおおよそ 0.1ms。抵抗分圧で時定数の比が制限されるのも前回と同様。

ただし、atmega328p の上限 Low レベル入力電圧が 0.3Vcc だったのに対し、下限 High レベル入力電圧は 0.6Vcc と非対称になっていて、こちらの方が若干余裕がある。そのため、プルダウン型にした方が、充放電の時定数の差を 0.33/0.082 = 4 倍に小さく出来る。

実装基板

このぐらいの大きさで 2x2 = 4つのスイッチが載るだろうと思って小さめの基板を買ったら、意外にカツカツで配置に苦労した・・・。結局、プッシュスイッチの足を片側切って対応。


再・やり直しデバウンス回路

これでよさそうに思っていたけど、マイコンを atmega328p から STM32F042 に変えることにしたので、電源電圧が 5V から 3.3V に下がった。上と同様の計算をしてみると、キー押下時の col 端子電圧は、
(3.3 - 0.7) x 10k / (10k + 3.3k) = 2.0V
となるが、STM32F042 の High と見做される下限入力電圧は
0.7 Vdd = 2.3V
であり、足りなくなってしまった。 ダイオードの電圧降下と抵抗分圧が無視できない。

そこで、もう一度最初の参考サイトを見てみると、コンデンサと抵抗の配置がジグザグになっている!?それを真似して上の回路を直してみる。


待機時の動作

これはほぼ変わらない。各 row 端子は Low レベルなので、ダイオード D はオフになっている。したがって、col 端子も Low レベル。コンデンサ C1 は、抵抗 R1 と R2 を通して電源電圧に充電されている。 充電時の時定数は
0.033uF x (6.8kΩ + 3.3kΩ) = 0.33ms
となり、先程と同様。ただし、初期充電電流が先程の回路と同じ 0.5mA になるように抵抗値を決めた。

スキャン時の動作

例えば row1 を High レベルにすると、キー S1 が押されていれば、抵抗 R2 を通してコンデンサ C1 が放電される。このとき、ダイオード D1 による電圧降下はあるが、col の端子電圧はまるっと
(5 -0.7) = 4.3V
まで上がる。コンデンサ C1 が放電して、その端子電圧が 0.7V になった後の定常状態では、抵抗 R2 には電流が流れないので、抵抗分圧がないためだ。これなら電源電圧が 3.3V でも、col の端子電圧は 2.6V になるので、High と判断される 2.3V に十分余裕がある。また、放電時の時定数は、
0.033uF x 6.8k = 0.22ms
であり、充放電での時定数も差が 1.5 倍に縮まる。

実装基板

抵抗値が回路図と違っているけど、R1 と R2 の比は同じなので、時定数の比は同じく 1.5 倍。今回はプッシュスイッチの足を切らなくても収められた(笑)


まとめ

充放電時の時定数の組み合わせはキースイッチに合わせて選べられる。ただし、1つ目のやり直し回路では、キー押下時の col 電圧を確保するために抵抗比が制限され、特に電源電圧が低い時には、両時定数に大きな差が出てしまう。そうすると、長い方に合わせて、ファームウェアでキースキャンにかかる時間が長くなってしまう。

それが、2つ目のやり直し回路=お手本回路では、キー押下時の col 電圧は、ダイオードの電圧降下分が下がるのみで、抵抗比を自由に選ぶことができ、充放電時の時定数を揃えられる。

お手本回路はなぜ抵抗がクネクネッと繋がっているのか?真っ直ぐじゃないのか?その理由が身に染みた。というか、出発点である最初の回路が超適当過ぎた(汗)

というところで、デバウンスの話なのに過渡波形を一度も測定しないままに、終了〜!?



0 件のコメント:

コメントを投稿