2019年12月28日土曜日

エルゴノミック Realforce を作ろう(4)4x4キーパッド編

製作した 4x4 キーパッド
前回の 3x3 キーパッド編では、とりあえず静電容量無接点スイッチとして機能することは確認出来た。だけど、-100mV 程度の微妙な負電圧がオペアンプの入力端子に印加されていると思われるのが気になった。

今回はその点をなんとかしつつ、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 に立ち下がる
という、col 線のストローブ信号を模擬するパルス電源だ。

レギュレータから期待する電源電圧は 3.3V だけど、以下でグラフを読む時に分かりやすいように、3.3V ではなく、代わりに 3.2V とした。

また、オペアンプには、実際に使用した NJU77701 のモデルを以下のサイトからダウンロードして読み込んだ。

NJU77701 1回路入り34MHz、35V/us、低ノイズ入出力フルスイング高速CMOSオペアンプ (RFノイズ耐性オペアンプ)

そして、早速 SPICE を走らせてみる。

赤:C2 電位、青:readout 出力
赤線は検出コンデンサ C2 の電圧で、前半の立ち上がりは前回の想定通り。後半は、やはり確かに負の電圧が現れている。そして、肝心の readout 出力(青線)は・・・、全然動いてません(汗)

いやはや、オペアンプがレールツーレール、フルスイングのものだからとほぼ 0V 近辺の入力で動かしていたとはいえ、SPICE シミュレーションでは動いていない回路になっていたとは。実物のオペアンプはよくちゃんと動いてくれたものだ・・・。

では、気を取り直して、検出コンデンサ C2 の電位が負にならない方法を考える。

中間電位を作る


col 線を上げ下げした時に、オペアンプへの入力電圧が一時的にも負にならないようにしたい。そのためには、中間電位を作って、検出コンデンサ C2 の電圧波形を上下対称にしたらよさそうだと考えた。

つまり、普段の何もしてない時の検出コンデンサ C2 の電位を、GNDの代わりに、電源とGNDの中間の電位にしてやればよい。

でも、中間電位はどうやって作るんだろう!?
抵抗分圧でよいのか?でもそれだと、電圧源としては内部抵抗が大きいから、抵抗ではなくて、コンデンサで分圧するのか?でも、コンデンサだけでは、分圧された電圧が安定せずに、勝手な電圧で落ち着いてしまう気がするから、やっぱり抵抗で電流をある程度流して、分圧電圧をカチッと決めないといけないのではないだろうか?そうか、こういう時に、ボルテージフォロワを使うのか。でも、今使ってるオペアンプは x5 以上の回路利得が実用的と書いてあるからボルテージフォロワには向いてない気がするし、オペアンプをもう一個使う程、今回駆動したい回路は電流が流れる回路でもない。何より、素子数をあまり増やしたくはない。ブツブツ。
いくらかの頭の中の逡巡の末に、まず抵抗分圧で作ってみることにした。

分圧抵抗は小さい方が安定しそうだけど、あまりたくさん電流を流したくもない。まぁ、LED と同程度ならよいかと思って、とりあえず 1kΩ にしてみる。消費電流 1.6mA。

中間電位を R16, R17 で作る(C13, C14 を付加後の回路)
これでシミュレーションしてみると、col 線のスイッチング時に、中間電位が若干引きずられて振られていた。

赤:C12 の下端、緑:中間電位(R16 と R17 の接続点)

そこで、コンデンサも並列に入れてみることにした(上記の回路図)。容量は、アナログマルチプレクサの電源パスコンも兼ねて、なんとなく 0.1μF にする。キースイッチの容量は、押下時でも 5pF だから、十分吸収出来そうだ。

C13, C14 を追加してもう一度走らせると、以下のように col 線のストローブ ON/OFF 時のスパイクは消えていたので、とりあえずよしとする。

C13, C14 を付加後(赤:C12 の下端、緑:中間電位)

非反転増幅器による出力波形

おし。では、出力電圧 readout1 の波形を見てみる。

赤:C12 の下端、緑:中間電位、青:readout1 出力
このグラフを見ると、readout1 はかなり鈍っているのと、ピークに遅れがある。前回の実測波形だと、ここまでは激しく鈍ってはいなかったので、オペアンプの SPICE モデルのパラメータが安全側に選ばれているのだろうか?

あと、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 出力)

出力オフセット電圧のまとめ


これらを書き下すと、オペアンプの入力オフセット電圧を \(v_{io}\) として、出力電圧のオフセット\(v_{oo}\) は、
\[v_{oo}=\frac{R_{13}+R_{14}}{R_{13}}v_{io}+\frac{R_{16}R_{17}}{R_{16}+R_{17}}\cdot\frac{v_{io}}{R_{13}}
=\left(1+\frac{R_{14}+R_{16}/2}{R_{13}}\right)v_{io}\]で与えられる。ただし、R16=R17とした。

すなわち、出力電圧のオフセットはオペアンプの入力オフセット電圧 -6.7mV が原因となって、
  • 負帰還抵抗を通じて、非反転増幅器のゲイン倍される成分
  • 負帰還電流が中間電位から流出して、それを押し下げる成分
がある。

特に後者は、非反転入力の抵抗 R13 が分圧抵抗 R16, R17(内部抵抗に相当)と同程度かより小さいと、より大きく影響を受ける。したがって今の場合、負帰還抵抗はもう少し大きくした方が、中間電位への影響を減らせると思われる。実際、R13=10kΩ、R14=200kΩ としてみると、

負帰還抵抗を大きくした後(赤:C12 の下端、緑:中間電位)
と中間電位がより安定して、電位降下もほぼ見られなくなった。ちなみに中間電位の電位降下は
\[\frac{R_{16}R_{17}}{R_{16}+R_{17}}\cdot\frac{v_{io}}{R_{13}}=\frac{1\,{\rm kΩ}}{2}\cdot\frac{-6.7\,{\rm mV}}{10\,{\rm kΩ}}=-0.34\,{\rm mV}\]と計算され、実際に十分に小さいことが分かる。

また、同様に出力オフセット電圧に実際の値を代入してみると、
\[v_{oo}=\left(1+\frac{R_{14}+R_{16}/2}{R_{13}}\right)v_{io}=\left(1+\frac{200\,{\rm kΩ}+1\,{\rm kΩ}/2}{10\,{\rm kΩ}}\right)(-6.7\,{\rm mV})=-141\,{\rm mV}\]となる。負帰還抵抗の値を大きくすることで、出力オフセット電圧も若干小さくなった。

反転増幅器による出力波形


そういえば、何で非反転増幅器になっていたんだろうと思ったので、反転増幅器でも試してみた。対応する回路図はこんな感じになる。

反転増幅器に切り替える(素子値は元に戻す)
早速 SPICE を走らせてみると。。。

反転増幅器の出力(赤:C22 の上端、青:readout2 出力)
なんじゃこりゃ〜〜!出力波形が振動している!?C22 の検出電圧も、その影響を受けてか振動している。あと、出力の振幅がとても小さい。

素子値を色々変えてみると、どうやら負帰還抵抗の値が小さ過ぎるようだ。これらを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 がかかる。この電流が中間電位から電流を引き出して、中間電位が下がるので、出力電圧のオフセットは、
\[v_{oo}=\frac{R_{22}+R_{23}+R_{24}}{R_{22}+R_{23}}v_{io}+\frac{R_{26}R_{27}}{R_{26}+R_{27}}\cdot\frac{v_{io}}{R_{22}+R_{23}}=\left(1+\frac{R_{24}+R_{26}/2}{R_{22}+R_{23}}\right)v_{io}\]となる。ただし、 R26=R27 とした。実際の値を代入すると、
\[v_{oo}=\left(1+\frac{200\,{\rm kΩ}+1\,{\rm kΩ}/2}{10\,{\rm kΩ}+10\,{\rm kΩ}}\right)\cdot(-6.7\,{\rm mV})=-73.9\,{\rm mV}\]となる。非反転増幅器の時のほぼ半分になる。

上のグラフの t=0 付近を拡大すると(中間電位も追加した)、

R23=10kΩ、R24=200kΩ の時の拡大図(赤:C22 の上端、緑:中間電位、青:readout2 出力)
となっており、出力のオフセット電圧が実際に -73mV 程度であることが見てとれる。

また、中間電位はほぼ 1.6V のままでブレていない。これは、中間電位の電位降下は
\[\frac{R_{26}R_{27}}{R_{26}+R_{27}}\cdot\frac{v_{io}}{R_{22}+R_{23}}=\frac{1\,{\rm kΩ}}{2}\cdot\frac{-6.7\,{\rm mV}}{10\,{\rm kΩ}+10\,{\rm kΩ}}=-0.17\,{\rm mV}\]と十分に小さいからだ。

比較


では、非反転増幅器と反転増幅器の出力波形を比較してみる。負帰還抵抗は、両回路とも同じに揃えて、R13 = R23 = 10kΩ、R14 = R24 = 200kΩ とした。

非反転増幅(赤:C12 の下端、青:readout1 出力)、反転増幅(紫:C22 の上端、水色:readout2 出力)
出力オフセット電圧は、上記で調べたように、反転増幅器の方がおよそ半分小さくなっている。しかし、この波形を見ると、キーの押下検出をする際に、
  1. 出力オフセット電圧を考慮しつつ、正(あるいは負の)のピーク値の高さ(低さ)を調べる
  2. 出力オフセット電圧は無視して、正負のピーク値の差の大きさを調べる
では、あきらかに後者の方が安定しそうだ。

そこで正負のピーク値の差を見てみると、非反転増幅器(青)では 0.42V 程度で、反転増幅器(水色)では 0.40V 程度で、わずかに非反転増幅器の方が大きい。実際、反転増幅器では、負帰還電流が C22 からも流れ出して、C22 の電圧(紫)が早く減衰している。

また一方、中間電位については、反転増幅器の方が若干ブレが少なかったが、どちらも問題ないレベルだった。

以上のことを考慮して、今回は検出コンデンサの電圧が負帰還電流で乱されない、非反転増幅器を使うことにした。

4x4 キーパッドの実装


ということで、中間電位 Vmid を作って、4x4 のキーパッドを作成する。
4x4 キーパッドの回路図
今回も row 線の抵抗は実験の意味を込めてバラバラにしてみた。そして、作製した PCB がこちら。

4x4 キーパッド PCB の表面

4x4 キーパッド PCB の裏面
Topre スイッチのパターンについては、今回は
  • スルーホールをビアにして、レジストで覆われるように変更
  • col 線を横に離して、半円形が崩れないように変更
  • なんとなく同じ点を向くようにそれぞれ回転
としてみた。また、PCB の裏面にはパーツを置かないようにして、ジャンパー以外の導体が剥き出しにならないようにしてみた。これは、最終的に PCB 2枚構成のキーボードにしたいと思って試してみた。

そして、出力電圧を実測してみる。測定のシーケンスとしては、各キーごとに、
  1. マルチプレクサで  row 線を選択する
  2. 100μs 待つ
  3. ADC を開始する
  4. 5μs 待つ
  5. col 線を High にする
  6. 20μs 待つ
  7. col 線を Low にする
  8. ADC が 60 サンプル取得するのを待つ
とした。ADC は 12MHz で動作しており、1サンプルあたり14クロックでサンプリング。そのうち、偶数サンプルのみを以下のグラフでは描画している。したがって、グラフ上でのサンプリング周波数は 0.43MHz になる。

まず、キー非押下時の電圧波形。
全キー非押下時の出力電圧波形(各キー波形の間に、1600 の値を 1 サンプル挿入)
キー毎にバラツキはあるけど、期待通りに中間電位の 2,048 付近を境に、上下に振れている。row 線毎に放電抵抗を変えており、最初の 4 つが row0 で 7.5kΩ、次の 4 つが row1 で 10kΩ、さらに次の 4 つが row2 で 12kΩ で、最後の 4 つが row3 で 18kΩ になっている。実際、徐々に放電が緩やかになっている。

次に、キー押下時の電圧波形。4x4 になると、全キーをちゃんと押下するのはなかなか大変。
全キー押下時の出力電圧波形(各キー波形の間に、0 の値を 1 サンプル挿入)
ふむふむ。振幅がちゃんと大きくなっているゾ。よしよし。

最後に、比較のために、col0, col1, col2 のキーのみを押下した場合の波形がこちら。
col0, col1, col2 キーのみを押下した時の出力電圧波形
キーの押下・非押下でかなり顕著な振幅の違いがあることが分かる。

あと、やっぱり SPICE では出力電圧波形が鈍り過ぎな気がする・・・。 

まとめ


長くなってしまったけど、なんとかオペアンプ入力の一時的な負電圧を解消することができ、SPICE でもちゃんとシミュレーションが出来る回路になった。

けど、まだもう一つ回路的な課題があり、次回はそちらを検討する予定・・・。





0 件のコメント:

コメントを投稿