今回新デバイスをM5Stackに接続せんと思ったら外部クロックを必要とするものでした。適切そうな周波数は25MHzとな。そこで今回はM5Stack上のMicroPythonで25MHzクロックを生成。けれどAD2のFs=100MHzしかないので、生成した25MHzクロックを16分周して周波数を測定してみます。メンドイ?
※「MicroPython的午睡」投稿順 Indexはこちら
※M5Stack Grayに書き込んだUIFlow2.0 (Alpha-27)対応のMicroPython処理系とWindowsパソコン上で動作しているThonny 4.0.1で動作確認しています。
周波数の測定
「メンドイ」などというのは、認知症の前触れなんだとか。ヤバイよ。そうは言っても実際メンドイです。いつも頼り切っているDigilent製Analog Discovery2ですが、オシロのFs=100MHzです。一方今回生成したいのは25MHz、M5Stackで生成可能な上限周波数は40MHz。かろうじてナイキスト周波数内ですが、周波数測定するには余裕なさすぎ。まあ、そういう場合は出力クロックを分周してやれば良いっと。そこでM5Stackから出力されたクロックを分周することに。回路が以下に。
手元にあったバイナリカウンタTC74HC4020Aは、2分周の次は16分周出力であります。そこで測定は16分周出力ということで。成り行きに流されてるな。
これで、25MHzでも40MHzでもどんとこい?
M5Stackからのクロック出力
クロック出力にはM5Stack UIFlow2にユニークな機能は不要であります。ESP32版MicroPythonに共通なPWM機能で可能。参照日本語ドキュメントが以下に。
なお、ESP32のマニュアルを見ると、LED PWMとか殊更にLEDを冠して呼ばれているのだけれど(多分、Motor Control PWMという別なPWMモジュールがあるためか?)、チラチラ見る限り、フツーのPWMのつもりで使える感じです。
ソース・クロックを整数部10ビット、小数部8ビットの「ディバイダ」を通してからカウントしている模様なので、元クロック80MHzに対して25MHzピタリは無理でも「だいたい」25MHzの生成は可能ではないかと思われました。今回はその辺を確かめてみます。
今回実験のMicroPythonスクリプト
今回のスクリプトはほぼほぼESP32用MicroPython機能の範囲ですが、お作法としてM5.begin()しないではいられないのでやってます。ソースが以下に。
# clkOUT.py import machine import M5 import time clkOutPin = 5 PWMfreq = 25000000 PWMduty = 512 #50% def main(): M5.begin() print("M5STACK, test PWM") pwmOut = machine.PWM(machine.Pin(clkOutPin), freq=PWMfreq, duty=PWMduty) loopCounter = 0 while True: loopCounter += 1 print("LOOPCOUNTER: ", loopCounter) time.sleep(10) if __name__ == "__main__": main()
実機動作確認
16分周器として動作しているTC74HC4020AのQ4出力の波形が以下に。
上記の周波数 1.5645MHz、よって16倍すると
1.5645MHz * 16 = 25.032MHz
結構いい線行っているじゃん。お好みの周波数(だいたい)を作れそうだね。