ロジックICとかで遊ぶときのチャタリングの話

みなさんお元気ですか?おいらは長距離通勤になって寝不足気味なのと電車の中で暇です。という訳で今回はスマホで適当にTips的な記事を書いてみた。ロジックICとかで遊ぶときのチャタリングの話。

 

そういや意外とチャタリングの波形ってまじまじと見た事がある人は少ない気がする。*1けど波形を録るのめんどくさいので初っ端から手書きでお茶をにごす。

f:id:TEFSOM:20210518213312j:plain

こんな感じで数msもかけてONOFFを繰り返す波形*2を、例えばカウンタのクロックに入れると、当然カウンタ君はこの細いパルスもちゃんと数えてくれちゃう。

 

なんていうか「回路は思った通りには動かない。作った通りに動く。」な訳で、こういうのを知らないと例えば「スイッチが押された回数を数える回路」を作ろうと思いつつ「チャタリングも含めてONOFFした回数を数える回路」を作っちゃったりしがちな気がする。

 

前置きが長くなった。以下考えられる対策。

 

1.RCローパスフィルタとシュミットトリガインバータを入れる

f:id:TEFSOM:20210518212113p:plain

よく初心者向けの本とかに出てくる気がする。チャタリングによるパルスを、RCのローパスフィルタで小さくして、シュミットトリガのヒステリシス幅以下にすれば良い。真面目に考えるとこの条件から時定数が求められそう。まあ大抵いちいち真面目に設計しないで適当に長くしておく。定番。

 

2.ワンショットパルスに整形する

f:id:TEFSOM:20210518212148p:plain

みんな大好き555とか単安定マルチバイブレータ*3とかで、トリガが入ったら一定期間Tのパルスを出すようにする。パルスの出力いくら入力がチャタリングしようと、出力には出てこないので安心。回路組むのちょっとめんどくさいのがこの方式の欠点だけど、利点としてはちょっといじると無安定マルチバイブレータにできるので、簡単にステップ実行と連続実行を切替できる。楽しい。

 

3.RS-FFをパタパタさせる

f:id:TEFSOM:20210518213357p:plain

余ったゲートでなんとかしたいときとか、立ち上がりと立ち下がりで別な動作をするマニアックな回路をステップ実行させたいときとかは、NAND2つでRS-FFを組むといいと思う。あと何かの処理を始めるときにセットして、その処理が終わったらリセットするようにしとくと、ある処理の最中はその処理を再度呼ばないようにできる。例えるならファミレスで呼び鈴のボタンを素早く100連打しても、(2打目以降は無視されて)店員さんは1人しか来なくて、その店員さんが対応済みボタンを押すと、やっともう一度呼べるようになるみたいな。......何の話だっけ?

 

4.D-FFで打ち抜く

 

f:id:TEFSOM:20210518212300p:plain

常に見てるからジタバタが気になる訳で決まったタイミングでしか見なければ01かはっきりする訳だ。例えば1Hzのクロックを入れたD-FFの入力にスイッチをつなげば出力は1秒毎にしか変化しない。え?その決まったタイミングで運悪く01の遷移中とかだったらどうなるのかって?君のような勘の良いガキは......嫌いじゃないよ。メタステーブルっていって真面目にやるなら気にしないといけない。*4

 

中身も無駄に長くなった。この記事は電車の中で適当に書いてみた。こんなのでも読みたいと思った変な人はいいねを押してくれると、この記事を書いた変な人がまた何か書くかもしれない。

*1:自分もロジックICで遊び始めた頃にはオシロ持ってなかったし、今はオシロ持ってるけどわざわざ見ない。

*2:クソデカリレーとかだと数十msとかかかるかも。ものによる。

*3:トランジスタとかで作ってもいいし74HC123とかでもいい。

*4:ファンクションジェネレータとかFPGAとかを用意して、パルスのタイミングをずらしていって、タイミング違反してどっちに転ぶかの境目の楽しい波形が出てくるのとかで遊ぶと楽しいかもしれない。対策としてはD-FFの段数を増やすのとかその各D-FFの出力のANDをとるのとか。しらんけど。