![]() |
製作した 4x4 キーパッド |
今回はその点をなんとかしつつ、4x4 キーパッドを作ってみた。
しかし、今回はこれまでのようなお手本回路図はないので、先人が検証済みの回路をコピペしていきなり PCB 発注とはいかない。さすがに今回はテスト回路をちゃんと作って動作を確認しなければ・・・。
それなら、SPICE でまずシミュレーションしてみようと思い、ググると、実は KiCAD には SPICE が付いてきているらしい!と分かる。早速動かしてみる。
前回のキー押下検出回路
まずは、前回のキー押下検出回路を SPICE で走らせてみた。SPICE を走らせるには、オペアンプ モデルの指定と、シミュレーション用電源を置く必要がある。あと、GND をどこかに付けないと、ちゃんとした結果にならなかった。SPICE 用に直した回路図はこちら。
![]() |
前回の 3x3 キーパッドで使用した回路の SPICE シミュレーション回路図 |
- C1 は Topre キースイッチの静電容量
- C2 は押下検出用コンデンサ
- R1 はパッドやアナログマルチプレクサの ON 抵抗
- R2 は C2 の放電用抵抗
- R3, R4 は非反転増幅器の負帰還抵抗で、ゲインは21倍
また、シミュレーション用に、電圧源 Vdd1 は 3.2V の直流電源で、電圧源 Vcol1 は、
- 5us 後に 100ns で 3.2V に立ち上がり
- その 20us 後に 100ns で 0V に立ち下がる
レギュレータから期待する電源電圧は 3.3V だけど、以下でグラフを読む時に分かりやすいように、3.3V ではなく、代わりに 3.2V とした。
また、オペアンプには、実際に使用した NJU77701 のモデルを以下のサイトからダウンロードして読み込んだ。
NJU77701 1回路入り34MHz、35V/us、低ノイズ入出力フルスイング高速CMOSオペアンプ (RFノイズ耐性オペアンプ)
そして、早速 SPICE を走らせてみる。
![]() |
赤:C2 電位、青:readout 出力 |
いやはや、オペアンプがレールツーレール、フルスイングのものだからとほぼ 0V 近辺の入力で動かしていたとはいえ、SPICE シミュレーションでは動いていない回路になっていたとは。実物のオペアンプはよくちゃんと動いてくれたものだ・・・。
では、気を取り直して、検出コンデンサ C2 の電位が負にならない方法を考える。
中間電位を作る
col 線を上げ下げした時に、オペアンプへの入力電圧が一時的にも負にならないようにしたい。そのためには、中間電位を作って、検出コンデンサ C2 の電圧波形を上下対称にしたらよさそうだと考えた。
つまり、普段の何もしてない時の検出コンデンサ C2 の電位を、GNDの代わりに、電源とGNDの中間の電位にしてやればよい。
でも、中間電位はどうやって作るんだろう!?
抵抗分圧でよいのか?でもそれだと、電圧源としては内部抵抗が大きいから、抵抗ではなくて、コンデンサで分圧するのか?でも、コンデンサだけでは、分圧された電圧が安定せずに、勝手な電圧で落ち着いてしまう気がするから、やっぱり抵抗で電流をある程度流して、分圧電圧をカチッと決めないといけないのではないだろうか?そうか、こういう時に、ボルテージフォロワを使うのか。でも、今使ってるオペアンプは x5 以上の回路利得が実用的と書いてあるからボルテージフォロワには向いてない気がするし、オペアンプをもう一個使う程、今回駆動したい回路は電流が流れる回路でもない。何より、素子数をあまり増やしたくはない。ブツブツ。いくらかの頭の中の逡巡の末に、まず抵抗分圧で作ってみることにした。
分圧抵抗は小さい方が安定しそうだけど、あまりたくさん電流を流したくもない。まぁ、LED と同程度ならよいかと思って、とりあえず 1kΩ にしてみる。消費電流 1.6mA。
![]() |
中間電位を R16, R17 で作る(C13, C14 を付加後の回路) |
![]() |
赤:C12 の下端、緑:中間電位(R16 と R17 の接続点) |
そこで、コンデンサも並列に入れてみることにした(上記の回路図)。容量は、アナログマルチプレクサの電源パスコンも兼ねて、なんとなく 0.1μF にする。キースイッチの容量は、押下時でも 5pF だから、十分吸収出来そうだ。
C13, C14 を追加してもう一度走らせると、以下のように col 線のストローブ ON/OFF 時のスパイクは消えていたので、とりあえずよしとする。
![]() |
C13, C14 を付加後(赤:C12 の下端、緑:中間電位) |
非反転増幅器による出力波形
おし。では、出力電圧 readout1 の波形を見てみる。![]() |
赤:C12 の下端、緑:中間電位、青:readout1 出力 |
あと、readout1 は初期状態で中間電圧の 1.6V にはなっていなくて、1.45V になっている?!中間電位よりも -0.15V 下がっているらしい。この点についてはもう少し詳しく考えてみた。
出力電圧のオフセット!?
この結果から逆算して考えてみる。まず、オペアンプは前回の教訓から CMOS タイプなので、入力バイアス電流は 1pA 程度で無視できる。負帰還抵抗 R14 と、反転入力の抵抗 R13 は合わせて 10.5kΩ なので、これらを流れる電流は -0.15V/10.5kΩ = -14.3μA になる。
一方、検出コンデンサ C12 にかかる電圧は、定常状態ではゼロに放電されているはずだ。したがって、オペアンプの入力端子間の電位差は、反転入力の R13 を流れる負帰還電流により、470Ω x -14.3μA = -6.7mV になっている。
回路図中の他の素子値を色々変えてみたけど、この -6.7mV というのは、ほとんど変化しなかった。つまり、これはオペアンプの特性のようだ。調べてみると、これはオペアンプの入力オフセット電圧というもののようだ。データシートでは 1.5mV 以下となっているので、SPICE モデルでは、少し大きめに出ているのだろうか。
中間電位への影響
あともう1つ。負帰還電流によって、中間電位も影響を受ける。今の場合だと、-14.3μA の電流が中間電位のところから流れ出て行く。放電抵抗 R12 の先はハイインピーダンスなので、そちらからは負帰還電流は流れてこないから、負帰還電流は上と下の分圧抵抗から半分ずつ流れてくることになる。これにより、中間電位は -14.3μA / 2 x 1kΩ = -7.15 mV 下降する。
実際に、上記のグラフを拡大してみると、中間電位が 1.593V になっていることが分かる。
![]() |
t = 0 付近の拡大図(赤:C12 の下端、緑:中間電位、青:readout1 出力) |
出力オフセット電圧のまとめ
これらを書き下すと、オペアンプの入力オフセット電圧を
すなわち、出力電圧のオフセットはオペアンプの入力オフセット電圧 -6.7mV が原因となって、
- 負帰還抵抗を通じて、非反転増幅器のゲイン倍される成分
- 負帰還電流が中間電位から流出して、それを押し下げる成分
特に後者は、非反転入力の抵抗 R13 が分圧抵抗 R16, R17(内部抵抗に相当)と同程度かより小さいと、より大きく影響を受ける。したがって今の場合、負帰還抵抗はもう少し大きくした方が、中間電位への影響を減らせると思われる。実際、R13=10kΩ、R14=200kΩ としてみると、
![]() |
負帰還抵抗を大きくした後(赤:C12 の下端、緑:中間電位) |
また、同様に出力オフセット電圧に実際の値を代入してみると、
反転増幅器による出力波形
そういえば、何で非反転増幅器になっていたんだろうと思ったので、反転増幅器でも試してみた。対応する回路図はこんな感じになる。
![]() |
反転増幅器に切り替える(素子値は元に戻す) |
![]() |
反転増幅器の出力(赤:C22 の上端、青:readout2 出力) |
素子値を色々変えてみると、どうやら負帰還抵抗の値が小さ過ぎるようだ。これらを10倍の R23=4.7kΩ、R24=100kΩ にしたら、こんな感じの波形に少し落ち着いた。
![]() |
負帰還抵抗を 10 倍に変更 R23=4.7kΩ、R24=100kΩ(赤:C22 の上端、青:readout2 出力) |
元の値の R23=470Ω、R24=10kΩ だと、放電抵抗 R22(出力インピーダンス)の方が、反転入力の抵抗 R23(入力インピーダンス)よりも大きくなっているので、測定器(反転増幅器)が測定対象(検出コンデンサ C22 と放電抵抗 R22)を乱してしまい、それにオペアンプの時間遅れのフィードバックもかかって、出力がグワングワンしてしまったようだ。
さらに R23=10kΩ、R24=200kΩ にしてみると、出力はより安定した。
![]() |
負帰還抵抗を 20 倍に変更 R23=10kΩ、R24=200kΩ(赤:C22 の上端、青:readout2 出力) |
出力オフセット電圧
さて、反転増幅器でも、やはり出力にオフセット電圧が現れている。先程と同じように考えてみる。
入力オフセット電圧がかかるのは、今回は放電抵抗 R22 と反転入力の抵抗 R23 とを合わせたものになっている。それらを足した 10kΩ + 10kΩ に入力オフセット電圧の -6.7mV がかかる。この電流が中間電位から電流を引き出して、中間電位が下がるので、出力電圧のオフセットは、
上のグラフの t=0 付近を拡大すると(中間電位も追加した)、
![]() |
R23=10kΩ、R24=200kΩ の時の拡大図(赤:C22 の上端、緑:中間電位、青:readout2 出力) |
また、中間電位はほぼ 1.6V のままでブレていない。これは、中間電位の電位降下は
比較
では、非反転増幅器と反転増幅器の出力波形を比較してみる。負帰還抵抗は、両回路とも同じに揃えて、R13 = R23 = 10kΩ、R14 = R24 = 200kΩ とした。
![]() |
非反転増幅(赤:C12 の下端、青:readout1 出力)、反転増幅(紫:C22 の上端、水色:readout2 出力) |
- 出力オフセット電圧を考慮しつつ、正(あるいは負の)のピーク値の高さ(低さ)を調べる
- 出力オフセット電圧は無視して、正負のピーク値の差の大きさを調べる
そこで正負のピーク値の差を見てみると、非反転増幅器(青)では 0.42V 程度で、反転増幅器(水色)では 0.40V 程度で、わずかに非反転増幅器の方が大きい。実際、反転増幅器では、負帰還電流が C22 からも流れ出して、C22 の電圧(紫)が早く減衰している。
また一方、中間電位については、反転増幅器の方が若干ブレが少なかったが、どちらも問題ないレベルだった。
以上のことを考慮して、今回は検出コンデンサの電圧が負帰還電流で乱されない、非反転増幅器を使うことにした。
4x4 キーパッドの実装
ということで、中間電位 Vmid を作って、4x4 のキーパッドを作成する。
![]() |
4x4 キーパッドの回路図 |
![]() |
4x4 キーパッド PCB の表面 |
![]() |
4x4 キーパッド PCB の裏面 |
- スルーホールをビアにして、レジストで覆われるように変更
- col 線を横に離して、半円形が崩れないように変更
- なんとなく同じ点を向くようにそれぞれ回転
そして、出力電圧を実測してみる。測定のシーケンスとしては、各キーごとに、
- マルチプレクサで row 線を選択する
- 100μs 待つ
- ADC を開始する
- 5μs 待つ
- col 線を High にする
- 20μs 待つ
- col 線を Low にする
- ADC が 60 サンプル取得するのを待つ
まず、キー非押下時の電圧波形。
![]() |
全キー非押下時の出力電圧波形(各キー波形の間に、1600 の値を 1 サンプル挿入) |
次に、キー押下時の電圧波形。4x4 になると、全キーをちゃんと押下するのはなかなか大変。
![]() |
全キー押下時の出力電圧波形(各キー波形の間に、0 の値を 1 サンプル挿入) |
最後に、比較のために、col0, col1, col2 のキーのみを押下した場合の波形がこちら。
![]() |
col0, col1, col2 キーのみを押下した時の出力電圧波形 |
あと、やっぱり SPICE では出力電圧波形が鈍り過ぎな気がする・・・。
まとめ
長くなってしまったけど、なんとかオペアンプ入力の一時的な負電圧を解消することができ、SPICE でもちゃんとシミュレーションが出来る回路になった。
けど、まだもう一つ回路的な課題があり、次回はそちらを検討する予定・・・。