Duplex Matrixのゴーストの実験
SparkFan Pro Micro RP2040をKeyball61のボール有、左手側に接続して、LEDを光らせながらGPIO状態を変えつつその電圧を測定。
アナログテスターなので精度はお察し。
- VCCは3.2Vだった
- Input + Pull upは3.0Vだった
- Output + falseは0.0Vだった
RP2040のデータシート(p.638)によると3.3V近辺駆動の場合...
(IOVDD=3.3V)
- Input Voltage High: 2.0~3.6V
- Input Voltage Low: -0.3~0.8V
- Input Hysteresis Voltage: 0.2V
- Output Voltage High: 2.62~3.3V
- Output Voltage Low: 0~0.5V
- Pull-Up/Down抵抗: 50k~80kΩ
Input Hysteresis Voltageがどこに適用されるかわからない。Input Voltage High&Lowの間の中間、1.4Vを中心に±0.1Vと解釈して1.3~1.5Vということだろうか?
RP2040でゴーストが出るケースでは、特定のキーが入力され続けるのではなくチャタリングが継続的に発生している。なおチャタリング自体はdebounceできている。
やはり順電圧による降下電圧でInput Voltage境界ぎりぎりになったうえで、LEDのデータ信号由来のノイズを拾ってHysteresisラインを越えてるのではなかろうか?
つまりときどき1.3Vラインを割り込んでると。
これまでの実験で、順電圧Vfはおおよそ0.4~0.5Vくらいだと推定される。
細かいデータがある1N4148で考えると
これは10μ~100μAくらいの電流が流れたときの順電圧と言える。
またRP2040やATmega32U4の入力時プルアップ抵抗の大きさが50kΩ程度なので流れる電流は100μA程度だと考えられる。
1N4148Wはそこまで詳しいデータはないがそう大きく違わないと考えるべきだろう。
3個あると1.2~1.5V程度まで電圧が上がるはず。
(これをオシロスコープで観察することは可能か? - やったがちょっとわかりにくい)
これを安定してHiと判定できればDuplex Matrixは成立する。
Pro Micro (ATmega32U4)のプロパティはデータシートp.383より
- Voltage Input Low: -0.5 ~ (0.2 Vcc - 0.1)
- Voltage Input High: (0.2 Vcc + 0.9) ~ (Vcc + 0.5)
ああ隙間は1Vくらいか。
Vcc = 5 なら 0.9~1.9V くらい。
Vcc | VIL | VIH | Vreg |
---|---|---|---|
5.0 | 0.9 | 1.9 | 1.4 |
4.5 | 0.8 | 1.8 | 1.3 |
4.0 | 0.7 | 1.7 | 1.2 |
3.5 | 0.6 | 1.6 | 1.1 |
p.403 のグラフとなんだか符合しねぇな?
このグラフから判断するにHysteresisは0.05Vくらいやな?
RP2040のDuplex Matrixのチャタリングゴーストのソフト的な緩和策を思いついた。
ピンをセレクトする前にステートをスキャンして pre とする。
その後ピンセレクトしてウェイト後にステートをスキャンして curr とする。
もともとはcurrがHiならOFFでLoならONとしてたのをcurr | ~pre
に代える。
狙いは、別ラインのスキャンのLoが残っててそれがゴーストの要因になってるなら、
それはセレクト前のLoとして出てて、このフィルタではそれをつぶせるのではという話し。
実際にやってみた結果は、少し緩和されるが押しっぱなしにしてるとそれなりにでてくる。
RP2040におけるチャタリングゴーストは、
電圧がもともと境界付近のところにLEDデータとのクロストークで変動して起こってる
と考えられるので根本的な対策にはならなかったようだ。
そもそもRP2040についてはunselect delayを十分長く(65μsec以上)取る
という探索的に見つけた対策がある。
なのでそれを実験・観測して理論の裏付けが取れれば十分という話しではある。
なのでこの対策は5V Pro Microで機能するかを見るべきなのだろう。
5V Pro Microでも同様の対策を試みたが、効果なし。
この手法は破棄。
オシロスコープを用いた計測をしてみた。
Pro Micro 4.3V駆動 (5Vレギュレーター、LED点灯、セルフパワーハブ)
チャタリングゴースト発生
Pro Micro 3.9V駆動 (5Vレギュレーター、LED消灯、バスパワーハブ)
チャタリングゴースト未発生
RP2040 (LED点灯、unselect delay長)
チャタリングゴースト未発生
RP2040 (LED点灯、unselect delay短)
チャタリングゴースト発生
RP2040 (LED消灯、unselect delay短)
チャタリングゴースト未発生
Pro Micro使用時、ダイオードの順電圧は 1.32V/3 = 0.44
RP2040使用時 1.24~1.28V/3 = 0.41~0.42
まぁそんなもんか。
Pro MicroのほうはHi側グラフを見ると、
1.3VがHiとして認識されるのはだいたい最大4.0Vあたりまで。
それ以上ではLoになると考えられる。
実測に合ってる。
RP2040、本当にLになるかならないかギリギリのラインっぽい
ここまでのまとめ。
RP2040はあまりにも境界ギリギリであるため、外乱やunselect delayで調整が効いてしまう。
また5Vをレギュレーターで3.3Vに落としているために
消費電力による電圧変動が少ないので降下電圧が変わらない。
対してPro Microはギリギリではないので、unselect delayでの調整は不可。
加えて5Vを5Vレギュレーターに通しているために
入力電流量や消費電力による電圧変動がそれなりにあり
Input Threshold/Hysteresisが降下電圧近辺で変動し、
それで事象の発生有無を制御できている。
ATmega32U4とRP2040のthresholdの実測データ 参照
-
Pro Micro 4.3V駆動、1.32V、ゴースト発生 effective LOWに該当
-
Pro Micro 3.9V駆動、1.32V、ゴースト無し 上の図ではeffective LOWに該当するが実際は無し
Vccの低下に連動して閾値が下がってeffective HIGHに入ってるものと推定。
Vccに応じたのVILとVIHの変化を見ると、おおよそ0.2V下がることが想定される。すると必然グレー領域は1.20~1.25Vになり1.32Vはeffective HIGHになっていると考えられる。
またVcc=4.5Vだとすれば0.1V下がるのでグレー領域は1.30~1.35Vになり1.32Vはグレーとなりそう。
-
RP2040、1.24V、ゴースト発生 effective LOWに該当
HIGHを維持するdelayを大きくすると発生しなくなることから、境界条件がもう少し複雑であると考えられる。
またRP2040のhysteresis thresholdは0.2Vなので上図の約0.1Vは狭すぎるため、測定方法で狭くなってるとかんがえられる。
またこの範囲をデータシート通りに考えるなら、どちら側に広げるかで変わるが下側に最低0.4V広がれば1.24Vはちょうどグレー領域になるので、測定結果を説明するのに都合が良い。
それぞれに実装されたシュミットトリガー、静的な特性と動的な特性が違いそう。
ATmega32U4がRP2040に比べて十分に(8倍以上)遅いというのもあるが。
ここまでのまとめ
- ゴーストはダイオードの順電圧≒電圧降下が低すぎると発生する:
- データシート上は0.7Vだが100mAという大きな電流が条件
- 実際は0.4~0.5V程度。電流は0.1mA程度で、3桁小さい
- ダイオードの順電圧は以下の条件で低くなる:
- 気温が高い
- 電流が小さい
- matrix scanの方式上、input pull up & out lowで荷電され、プルアップ抵抗が50kΩ程度なので0.1mA程度になる
- ハンダ付けに不良に伴う抵抗増大[1]でさらに電流が小さくなりうる
- 現状
- ATmega32U4(Pro Micro)は動作電圧で発生基準電圧が変わる
- 一般的な4.6~5.0Vでは高確率で発生する
- 3.3V~3.9Vの低電圧では発生しにくくなる
- RP2040はちょうど境界線上のため条件次第で動いてしまう
- ATmega32U4(Pro Micro)は動作電圧で発生基準電圧が変わる
-
抵抗が増えれば降下電圧は大きくなる(may)ので発生しにくくなるとも言えそうだが、よくわからない。 ↩︎