ja1yaz’s diary

感動したいおやじの備忘録的ブログ 

AD9833モジュールを使いこなしたい(4)

前回の周波数と位相レジスタの切り替えができて気をよくして、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よりさらに下の周波数の振幅はさらに小さいことも分かった。

AD9833_Frequency_Sweep_改

1HzからSweepしてみると下記の様になった。

AD9833_Frequency Sweep_1Hzから

下記は、0.1HzからSweepしたものだ、1Hzオーダーよりもさらに振幅が小さくなっていることがわかる。

トリガポジション10%として全体を画面に入れてみた。

AD9833 Sweep 0.1Hzから

 

やってみないとわからないことは多いなー。

ちょうどいい周波数(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