(2018.8.4 作成)
チャタリングとはスイッチのOn/Offの切り替わり時に接続が不安定になって、幾度もスイッチが押されたように振舞ってしまう現象です。当然このような不安定な現象は望ましいものではなく、多くのサイトでチャタリング除去(英語だとDebounce)の方法が解説されています。
このためチャタリングの一般論についてここで書いてもあまり意味はないと思いますので、このページではマイコンを使用した場合のチャタリング除去について書いてみたいと思います。なお以下ではGPIOは通常がGNDレベルで1になることがスイッチOnとなる論理で書いていますが、逆もそのまま成り立ちます。
マイコンを使用するわけですから、多くの場合ソフトウェアによるチャタリング除去が良い対策です。
接続としては右図のようにスイッチのみで構成することができます。この際マイコン内部でピンをプルダウンしておく必要があります。
具体的なチャタリング除去コードですが、多くの方法が提案されており、例えばこのページでは数多くのサンプルが掲載されています。実際に当サイトで公開しているGPIOのクラスでは上記ページで示されているKenneth Kuhn氏のコードを参考にチャタリング除去コードを実装しています。
ソフトでチャタリング除去するのは部品点数の増加を抑え、コストや実装面積削減にとても効果が高いのですが、一方割り込みやタイマを使うなどソースコードは複雑化する方向です。
ハードによるチャタリング除去は多くのサイトで右図のような構成が説明されています。RCによるローパスフィルタで一度波形をなまらせてから、シュミットトリガでディジタル値に成形する方法です。
ただマイコンでこの構成を行った際、
といった疑問があり、このページを作成するに至りました。
ところでチャタリング除去を調べると左図のようなR-S ラッチを用いた素敵な方法も紹介されています。
ただしこの回路は2出力あるスイッチの片方が必ずHighであることを前提としているため、1出力しかないタクトスイッチでは残念ながら使用できません。
さて、マイコンのGPIO部分の構成ですが、STM32F103の場合右図のようになっています(ここまでの説明と違って入力が右からになっています)。
この図に書かれているようにマイコン内部には保護ダイオード、プルアップ/プルダウン抵抗、シュミットトリガが内蔵されています。またこの図には記載されていませんが、ピン容量5pFが存在しています。
さてこのようなマイコンを使用する場合チャタリング防止のRCフィルタとプルアップ/プルダウン抵抗はどう設定すればいいでしょうか?下図の左が内蔵プルダウン、右が外付けプルダウンを行った回路図です。
このような状況でどうなるかそれぞれ実際に試してみました。
写真ではわかりにくいですが、STM32F103基板にタクトスイッチを接続しています。そしてスイッチが何回押されたかわかるようにLEDディススプレイでボタンの押された回数を表示しています。
何の対策もないと1回ボタンを押しても数字が2以上進む場合が発生するのでチャタリング対策が必要です。
そしてこの実験環境でマイコンへの入力電圧を計測した結果が下図です。
左が内蔵プルダウンを用いた結果、右側が外部プルダウンを用いた結果です。ともに波形がなまっていてローパスフィルターを通したことが分かるのですが、左側は明らかに電圧が低下しています。
これは上記の回路図を見てわかる通りローパスフィルターのRと内部プルダウン抵抗が直列に接続され、抵抗分圧と同じ状態になっているためです。もしこれ以上ローパスフィルタの時定数を長くするため抵抗を大きくすると、Highの電圧まで上がらない可能性があります。実際にフィルタ用として47kΩを使用した場合はスイッチが認識されなくなりました。
ということで
HWでチャタリング対策する際は内部プルダウン/プルアップ抵抗は使用しない。
が賢明だと思われます。
ハードウェアでチャタリング対策する際に注意すべきはこれだけではありません。上の回路図をよく見るとコンデンサがマイコンの入力ピンに直接接続されています。
このような場合電源をいきなり切断するとコンデンサに充電された電荷がマイコンへ流れ込んでしまいます。この突入電流はSTM32の場合IINJ<5mAと規定があります。
このため3.3Vの電荷が残るとして1kΩぐらいの抵抗を入れておくと電流が3.3mAまでになるので安心です。
結果としてハードウェアとしてチャタリング対策を行う際は右図のような回路構成になると思います。