前回はM5StackにDDS、AD9837を接続し出力波形を選択可としました。しかし肝心の周波数については400Hz固定になってました。そこで今回は周波数設定UIを追加、1Hzから999Hzの正弦波、三角波、矩形波を生成できるようにいたしました。なりゆきで「UI」つくっているので無駄が多い感じ。なんとかしたいが。。。
※「MicroPython的午睡」投稿順 Indexはこちら
※M5Stack Grayに書き込んだUIFlow2.0 (Alpha-27)対応のMicroPython処理系とWindowsパソコン上で動作しているThonny 4.0.1で動作確認しています。
ハードウエアは前回と同じ
今回も前回作成の「アタッチメント」ボードを使ってます。M5Stackの側面に刺せばよいだけなので良い感じデス。念のため回路図を再掲載しておきます。
MicroPythonスクリプトに周波数設定機能を追加
前回は起動後、正弦波、三角波、矩形波の選択をM5Stack表面のAボタンとBボタンで選択するだけで周波数は400Hz固定でした。今回は波形の選択後、3桁の十進数で周波数選択を行い、3桁決定すると波形を出力するようにいたしました。機能的にはAボタンとBボタンのみ使用です。
-
- 起動後、Aボタンで正弦波、三角波、矩形波を選択、4回目Aボタンを押すと正弦波に戻る。Bボタンを押すまでこの状態。
- 上記でBボタンを押すと波形が確定(LCDに表示される)し、周波数の100Hz桁の選択モードとなる。Aボタンを押すたびに数字がインクリメントされる9の後は0に戻る。Bボタンを押すと確定
- 上記後周波数の10Hzの桁、1Hzの桁を同様にAボタンとBボタンで設定。1Hzの桁設定後のBボタンで設定した周波数をLCDに表示し、波形出力を開始。
今回追加分を含むスクリプト全文が以下に。成り行きでUIを作り始めたので、なんだかな~な出来です。メンドイ、なんとかしたいが。
# AD9837UIfreq.py import machine import M5 from M5 import * import time mclkOutPin = 5 PWMfreq = 25000000 PWMduty = 512 #50% CSpin= 2 SCK=machine.Pin(16) MO=machine.Pin(17) title0 = None labelA = None labelB = None labelC = None labelD = None labelE = None numSEL = 1 numMAX = 3 finFlag = False def btnA_wasClicked(state): global numSEL, numMAX numSEL += 1 if numSEL > numMAX: numSEL = 1 def btnB_wasClicked(state): global finFlag finFlag = True def showTitle(): global title0, labelA, labelB, labelC, labelD, labelE Widgets.fillScreen(0x222222) title0 = Widgets.Title("AD9837 DDS", 20, 0xFFFFFF, 0x0000FF, Widgets.FONTS.DejaVu24) labelA = Widgets.Label("Select Waveform", 20, 24, 1.0, 0x222222, 0xFFFFFF, Widgets.FONTS.DejaVu24) labelB = Widgets.Label("SINE ", 20, 48, 1.0, 0xFFFFFF, 0x0000FF, Widgets.FONTS.DejaVu24) labelC = Widgets.Label("---", 20, 72, 1.0, 0x222222, 0xFFFFFF, Widgets.FONTS.DejaVu24) labelD = Widgets.Label("400", 20, 96, 1.0, 0xFFFFFF, 0x0000FF, Widgets.FONTS.DejaVu24) labelE = Widgets.Label("---", 20, 120, 1.0, 0x222222, 0xFFFFFF, Widgets.FONTS.DejaVu24) M5.update() def selWave(): global finFlag, numSEL, numMAX, labelB, labelC numMAX = 3 while not finFlag: M5.update() if numSEL == 1: labelB.setText("SINE ") elif numSEL == 2: labelB.setText("TRIANGLE ") else: labelB.setText("RECTANGLE") time.sleep_ms(100) if numSEL == 1: labelC.setText("SINE ") elif numSEL == 2: labelC.setText("TRIANGLE ") else: labelC.setText("RECTANGLE") finFlag = False return numSEL def selFreq(): global finFlag, numSEL, numMAX, labelD, labelE numSEL = 5 numMAX = 10 n100 = 4 n10 = 0 n1 = 0 while not finFlag: M5.update() n100 = (numSEL-1)*100 labelD.setText(str(n100)) finFlag = False numSEL = 1 while not finFlag: M5.update() n10 = (numSEL-1)*10 labelD.setText(str(n100+n10)) finFlag = False numSEL = 1 while not finFlag: M5.update() n10 = numSEL-1 labelD.setText(str(n100+n10+n1)) finFlag = False labelE.setText(str(n100+n10+n1)) return n100+n10+n1 def main(): M5.begin() print("M5STACK, testAD9837.") showTitle() BtnA.setCallback(type=BtnA.CB_TYPE.WAS_CLICKED, cb=btnA_wasClicked) BtnB.setCallback(type=BtnB.CB_TYPE.WAS_CLICKED, cb=btnB_wasClicked) selectResult = selWave() print("select: {0}".format(selectResult)) if selectResult == 1: cword = 0x2000 elif selectResult == 2: cword = 0x2002 else: cword = 0x2028 numFreq = selFreq() tempFreq = round(numFreq * 10.7374) numFreqL = 0x4000 | (tempFreq & 0x3FFF) numFreqH = 0x4000 | ((tempFreq >> 16) & 0x3FFF) print("F: {0} [Hz]".format(numFreq)) print("0x{0:04x} 0x{1:04x}".format(numFreqL,numFreqH)) cs = machine.Pin(CSpin, mode=machine.Pin.OUT, value=1) mclkOut = machine.PWM(machine.Pin(mclkOutPin), freq=PWMfreq, duty=PWMduty) ad9837 = machine.SoftSPI(baudrate=100000, polarity=1, phase=0, bits=8, firstbit=machine.SPI.MSB, sck=SCK, mosi=MO, miso=machine.Pin(25)) cs(0) ad9837.write((0x2100).to_bytes(2, 'big')) # RESET(Disable OUTPUT) ad9837.write(numFreqL.to_bytes(2, 'big')) # Set Freq Low ad9837.write(numFreqH.to_bytes(2, 'big')) # Set Freq High ad9837.write((0xC000).to_bytes(2, 'big')) # Set Phase ad9837.write((cword).to_bytes(2, 'big')) # Enable OUTPUT cs(1) loopCounter = 0 while True: loopCounter += 1 print("LOOPCOUNTER: ", loopCounter) time.sleep(10) if __name__ == "__main__": main()
実機動作確認
前回とは異なる「500Hz」の正弦波を出力設定した様子が以下に。
周波数は変更できるようになったみたい。すると今度は振幅も変更したくなりますな。しかしその部分はDDSチップのお仕事ではない。ソフトウエアでゲイン設定可能なアンプを作らないと。。。またハードへ戻る?