前回の周波数と位相レジスタの切り替えができて気をよくして、Sweepもやってみることにした。
これをやってみると意外なことがわかってきた。
周波数が低くても振幅は小さくなることが分かった。
最初の導入で、1kHzから入ってしまったので、まったく盲点だった。
ちょっと拡大すると下記の様になる。
これだとCH2の波形が見える最後のところが、Stop周波数の1MHzだ。
コマンドを発行する間隔を周波数ごとに変化させてLOG Sweepとしてみた。
time.sleep(10/Freq)としているので、10->1とすると早くSweeが終了する。
step_freq=start_freq/10としているので、decade 10点の周波数としている。
10->100とするとより細かい周波数でSweepすることになる。
(書いておかないとすぐ忘れちゃうんですよね。)
下記は、time.sleep時間を1/Freq Step_freq:1としてSweepしたもの。
ちなみに10Hzよりさらに下の周波数の振幅はさらに小さいことも分かった。
1HzからSweepしてみると下記の様になった。
下記は、0.1HzからSweepしたものだ、1Hzオーダーよりもさらに振幅が小さくなっていることがわかる。
トリガポジション10%として全体を画面に入れてみた。
やってみないとわからないことは多いなー。
ちょうどいい周波数(1kHz)で実験していたことがわかる。
使用したコードは、下記だ。
#AD9833 Raspberrypi pico practice sweep
from machine import SPI, Pin
import time
import math
spi = SPI(0, baudrate=8000000, polarity=1, phase=0, bits=8, firstbit=SPI.MSB,sck=Pin(18),mosi=Pin(19))
cs=Pin(17,Pin.OUT)
#2^14=16384
freq=10000
print(freq)
freq=int(freq/25000000*(2**28))
print('{:0>7x}'.format(freq))
phase=0
ireset=0x0100
noreset=0x0000
set_freq01_cmd=0x2000
freq0_set=0x4000
freq1_set=0x8000
Phase0=0xc000
Phase1=0xe000
#data='{:0>28b}'.format(freq)
def AD9837_write(data):
cs.value(0)
spi.write(data.to_bytes(2,"big"))
cs.value(1)
time.sleep_us(5)
def reset():
ireset=0x0100
data=ireset
AD9837_write(data)
def set_freq0(freq):
freq=int(freq/25000000*(2**28))
set_freq01_cmd=0x2000
data=set_freq01_cmd
AD9837_write(data)
freq0_set=0x4000
freq_msb=int(freq/16384)
#print('{:0>4x}'.format(freq_msb))
freq_lsb=freq % 16384
#print('{:0>4x}'.format(freq_lsb))
data=int(freq_lsb)+freq0_set
#print('{:0>4x}'.format(data))
AD9837_write(data)
data=int(freq_msb)+freq0_set
#print('{:0>4x}'.format(data))
AD9837_write(data)
def set_freq1(freq):
freq=int(freq/25000000*(2**28))
set_freq01_cmd=0x2000
data=set_freq01_cmd
AD9837_write(data)
freq1_set=0x8000
freq_msb=int(freq/16384)
freq_lsb=freq % 16384
data=int(freq_lsb)+freq1_set
AD9837_write(data)
data=int(freq_msb)+freq1_set
AD9837_write(data)
def set_phase0(phase):
phase0=0xc000
data=int(phase)+phase0
AD9837_write(data)
def set_phase1(phase):
phase1=0xe000
data=int(phase)+phase1
AD9837_write(data)
def noreset():
ireset=0x00000
data=ireset
AD9837_write(data)
def waveform(data):
wav=[0x2000,0x2028,0x2002]
print(wav[data])
AD9837_write(wav[data])
def frq_phase_sel(f_res,p_res):
cmd=int(0x2000+f_res*0x0800+p_res*0x0400)
AD9837_write(cmd)
time.sleep_us(100)
start_freq=0.1
stop_freq=10000000
step_freq=start_freq/10
reset()
freq=start_freq
set_freq0(freq)
set_freq1(freq)
set_phase0(0)
set_phase1(0)
waveform(0)
time.sleep(1/freq)#command interval
i=1
while freq<stop_freq:
freq1=freq+step_freq
if int(math.log10(freq))!=int(math.log10(freq1)):
step_freq=step_freq*10
freq=freq1
if i % 2 ==1:
frq_phase_sel(1,0)
set_freq0(freq)
else:
frq_phase_sel(0,0)
set_freq1(freq)
time.sleep(1/freq)
print(freq)
i=i+1