反転論理は分かりにくかったのと、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 件のコメント:
コメントを投稿