今度はチャタリング除去、その考え方
2020年9月12日:ロータリーエンコーダーの2相パルスをピン変化割り込みで取り込む
に絡んで、まずはこんなものを作りました。
2020年9月14日:「チャタリング除去回路」じゃなくって「チャタリング発生回路」をどうぞ
エンコーダのA相・B相信号、チャタリングを取り除きながら
エッジ検出してCW・CCW方向のパルス計数をする方法。
このように考えて作っています。
・INT0やINT1、あるいはピン変化割り込みを使う場合は、
ハードウェア的にチャタリングを取り除いておかないと
不要パルスが入った時にミスカウントするかも。
・これらの直接的パルス駆動割り込みを使わない場合は、
タイマー割り込みでの定期的なA相・B相信号の入力処理
が必要。
・定期的な処理ができるのなら、チャタリング除去も
ソフトでできる。
・ただし・・・「入力波形が安定するまで時間待ち」など
という恥ずかしい処理は×。
・こんなロジックでチャタリングを防ぎます。
とりあえずシフトレジスタは4段。
タイマー割り込みの周期で入力信号をシフトしていきます。
4つとも全部がH、あるいは全部がLなら信号が安定した
ということで、入力を確定。
H/Lが混じっていたら不安定=チャタリング中ということで
安定していた時の昔のデータを用います。
スイッチ入力だと、1mSサイクルで10段ほど読んでおけば
ひどいチャタリングのあるスイッチでも大丈夫。
スイッチのオートリピートや長押し処理も、タイマー割り込み内
で完結します。
そして、エンコーダのA相・B相から正逆をカウントする処理は、
そのパルスエッジの検出が不可欠です。
これもやはりシフトレジスタを使って処理、こんな
「回路」で↑↓エッジを作り出します。
このロジックをマイコンの命令に置き換えてプログラム
するわけです。
チャタリング除去の所、全Lを検出している「負論理4入力のAND」
は「正論理4入力・負論理出力のOR」と等価です。
これもプログラムの命令で実現します。
実際のプログラムの様子はこの次に。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
※2相パルスの弁別回路について
・2017年9月12日:C-MOS 2相パルスカウンタの入力部回路
・2017年3月6日:29年前に製作したツール
| 固定リンク
「Arduino」カテゴリの記事
- Arduino UNOで0.00~40.00mA定電流負荷回路(2023.01.13)
- Arduino UNO, Tips and Tricks:analogRead()を捨てちゃうぞ(2023.01.09)
- PWMでD/A変換:アナログマルチプレクサの応用、解決方法(2023.01.07)
- PWMでD/A変換:アナログマルチプレクサの応用で(2023.01.02)
- クリック有りのロータリーエンコーダ(2022.12.27)
コメント