MicroPython的午睡(134)M5Stack UIFlow2、CLOCK出力

今回新デバイスを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から出力されたクロックを分周することに。回路が以下に。M5StackCLKOUT_Schematic

手元にあったバイナリカウンタTC74HC4020Aは、2分周の次は16分周出力であります。そこで測定は16分周出力ということで。成り行きに流されてるな。

現物回路(ブレッドボード)の様子が以下に。M5StackCLKOUT_DUT

これで、25MHzでも40MHzでもどんとこい?

M5Stackからのクロック出力

クロック出力にはM5Stack UIFlow2にユニークな機能は不要であります。ESP32版MicroPythonに共通なPWM機能で可能。参照日本語ドキュメントが以下に。

ESP32 用クイックリファレンス

なお、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出力の波形が以下に。PWMWaveForm

上記の周波数 1.5645MHz、よって16倍すると

1.5645MHz * 16 = 25.032MHz

結構いい線行っているじゃん。お好みの周波数(だいたい)を作れそうだね。

MicroPython的午睡(133)M5Stack UIFlow2、DHT11温湿度センサ へ戻る

MicroPython的午睡(135)M5Stack UIFlow2、DDSで波形出力 へ進む