別件シリーズでESP32 DevKit-Cの出力端子から取り出した信号が汚いです。ロジック動作としてはOKなんだけれども、こんなオーバーシュート、アンダーシュートが酷い信号をのさばらせておいてはイケないと唐突に決心。対策をば打ってみました。やれば出来るのか、やりすぎなのか、接続する相手次第ぞなもし。
※「やっつけな日常」投稿順 Index はこちら
問題になった別件シリーズは以下です。
MicroPython的午睡(107) ESP32版、RMT、どこの端子が使えるの?
ESP32 DevKit-Cボード上で、ESP32独特のペリフェラルであるRMTというものをMicroPythonで制御して信号を作りだしてます。もっと速い制御も可能なのですが、計算しやすいということで、信号のレゾリューションは100nsec(10MHz)単位の制御でMHz程度の信号をハードウエアで生成して出力してます。ハイの幅、ロウの幅という具合にプログラムしていけばその通りの任意波形が出力されるペリフェラルです。
ESP32はデータシートみると、IO端子の流し出し、引き込み能力が強力です。ハイのときに最大40mAも流せるみたい。ちょっと頑張りすぎじゃないかと思わないでもないです。
そのせいか、RMTで発生した信号を観察するとこんな感じ。
オーバーシュート、アンダーシュートがガツンと出てます。再びデータシートを参照するとESP32の入力端子の場合、VIHのMAXは3.6V(VDD=3.3Vのとき)、VILのMINは-0.3Vです。自分のスペックすら割れてるじゃん!
このとき観察している端子の様子が以下です(というほどでもないか。)
闇雲対策は効かなかった
ESP32のスペック、VDD=3.3Vで、VOH>2.64VでIOH40mAを流し出せるという強力な駆動能力から推定すると、出力端子のオン抵抗は16.5Ωと(計算大丈夫か?)インピーダンス整合を考えるのであれば同じ大きさの抵抗を外づけしてプルダウンすれば良い筈。でも、そんな小さな値の抵抗を取り付けたら流れる電流が半端ありません。飛んでもねーずら。
といことで控えめの抵抗を闇雲に取り付けてみました。
その時の波形が以下に。全然対策になってないっす。
それに悪いことはそれだけではありませぬ。出力電圧レベル(ハイ)が3Vまで下がってます。出力MOSトランジスタのインピーダンスと外付け抵抗の分圧でそこまで下がってしまうわけね。330Ωでこのくらいで済んでいるけど、もっと小さい抵抗つけたらレベルは壊滅的。
それに「プルダウン抵抗」には直流的に10mAくらいもの電流が流れ続けているはず。こんなんじゃダメだ。
ということで第2の闇雲対策が以下に。抵抗R2に直列にコンデンサを入れました。これで一種のハイパス・フィルタとなる筈。カットオフ周波数は22MHz?(再び計算大丈夫か?)、DC的に電流が流れるパスは塞いだ、と。
DCパスは切れたので、ハイのときのレベルは3.3Vに回復しました。そしてDC的に10mAも流れつつけるということは無くなった筈。しかし、なんだかCとRで共振でもしている?ドツボにハマった感じです。
落ち着いた波形を得た対策
落ち着いた、静かな波形を得た対策が以下に。闇雲対策と似てはいるけれども違うもの。やりすぎ?
そのときの波形が以下に。オーバーシュート、アンダーシュートなどどこ吹く風。ホントか?
また、R2に流れる電流をCH2の青色でみてみました。電圧値でだいたい500mVくらいの変動なので、スイッチング時に瞬間的に流れる電流は1.5mA程度の筈。それ以外のときは電流は流れませぬ。
まあ、今回は「落ち着いた」けれども、大丈夫か、やっつけで。