ja1yaz’s diary

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

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

AD9833の使い方のも慣れてロータリエンコーダをつけて制御してみた。

まだ動作が今一つだが、AD9833自体の使い方の練習にはまあこんなもんかもしれない。

周波数を変える際には、周波数レジスタ0と1を交互に切り替えて周波数を制御してみた。

AD9833_Rotaly_Display

ロータリーエンコーダの制御についてもう少し勉強しないとうまくはいかないな。

まだまだといえば、ディスプレイについては全く分かっていない。

最終的には、グラフィックディスプレイを使いたいと考えている。

以前購入したAQM1248Aのドライバがあまりなくて、決まったテキスト表示しかできていない。こちらも自分で作ってみたいな。

次は、ディスプレイだな。

 

暫定的だが下記のコードで実験してみた。

 

#AD9833 Raspberrypi pico practice sweep
from machine import SPI, Pin, I2C
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)
I2C = I2C(1, scl=Pin(15), sda=Pin(14), freq=400000)

addr = I2C.scan()
print( "address is :" + str(addr) )
# I2Cに使うピンの設定です
p0=Pin(12,Pin.IN)  #A (rotary encorder)
p1=Pin(13,Pin.IN)  #B (rotary encorder)
p2=Pin(11,Pin.IN)
# デバイスのアドレスをスキャンします
#I2C1 = I2C(1, scl=Pin(13), sda=Pin(12), freq=200000)
#addr1 = I2C1.scan()
#print( "address is :" + str(addr1) )
#*********************Thanks for https://kousaku-prog.com/aqm1602/*******************
adrAQM1602 = 0x3E
datAQM1602 = 0x40
comAQM1602 = 0x00
kana={"ア":177,"イ":178,"ウ":179,"エ":180,"オ":181,
    "カ":182,"キ":183,"ク":184,"ケ":185,"コ":186,   
    "サ":187,"シ":188,"ス":189,"セ":190,"ソ":191,
    "タ":192,"チ":193,"ツ":194,"テ":195,"ト":196,
    "ナ":197,"二":198,"ヌ":199,"ネ":200,"ノ":201,
    "ハ":202,"ヒ":203,"フ":204,"ヘ":205,"ホ":206,
    "マ":207,"ミ":208,"ム":209,"メ":210,"モ":211,
    "ヤ":212,"ユ":213,"ヨ":214,"ラ":215,"リ":216,
    "ル":217,"レ":218,"ロ":219,"ワ":230,"ン":231,
    "゜":242,"゛":241," ":32,"”":241,"“":241,
    }
def writeDataAQM1602(dat):
    I2C.writeto_mem(adrAQM1602, datAQM1602, bytes([dat & 0xFF]))
    time.sleep_ms(1)
def writeComAQM1602(com):
    I2C.writeto_mem(adrAQM1602, comAQM1602, bytes([com & 0xFF]))
    time.sleep_ms(1)
def initAQM1602():
    time.sleep_ms(100)
    writeComAQM1602(0x38)
    time.sleep_ms(20)
    writeComAQM1602(0x39)
    time.sleep_ms(20)
    writeComAQM1602(0x14)
    time.sleep_ms(20)
    writeComAQM1602(0x70)
    time.sleep_ms(20)
    writeComAQM1602(0x56)
    time.sleep_ms(20)
    writeComAQM1602(0x6C)
    time.sleep_ms(20)
    writeComAQM1602(0x38)
    time.sleep_ms(20)
    writeComAQM1602(0x01)
    time.sleep_ms(20)
    writeComAQM1602(0x0C)
    time.sleep_ms(20)
def clearAQM():
    writeComAQM1602(0x38)
    time.sleep_ms(20)
    writeComAQM1602(0x01)
    time.sleep_ms(20)
def clear_line(LL):
    if LL == 0:
        writeComAQM1602(0x80)
    else:
        writeComAQM1602(0xC0)
    for idx in range(0, 16):
        writeDatAQM1602(2)
def print_AQM1602(L,da):
    if type(da) is int :
        da=str(da)
    ab=len(da)
    for i in range(16-ab):
        da+=" "
    if L == 0:
        writeComAQM1602(0X80)
    else:
        writeComAQM1602(0Xc0)
    for i in da:
        if ord(i) >= 8221:
            writeDataAQM1602(kana[i])
        else:
            writeDataAQM1602(ord(i))

initAQM1602()
#print_AQM1602(0,123456789)
#print_AQM1602(1,"アイウエオ ラス゛ヒ゜コ"+"1234")
#*********************Thanks for https://kousaku-prog.com/aqm1602/*******************
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)
    
def AD9833_setfrq(freq,f_step,i):
    if i==True:
        frq_phase_sel(1,0)#
        
        set_freq0(freq)
    else:
        frq_phase_sel(0,0)
        
        set_freq1(freq)
    print_AQM1602(0,' '+str(int(freq))+' '+str(int(f_step))+'')
    #print(freq)
    i=not i


start_freq=10000                                            
stop_freq=1000000
N=10 #per decade resolution
step_freq=start_freq/N
#print('{:2f}'.format(step_freq))
reset()
freq=start_freq


set_freq0(freq)
set_freq1(freq)
set_phase0(0)
set_phase1(0)
waveform(0)#waveform select 0-2 0:sin   1:squar   2:triangle

time.sleep(1/freq)#command interval

Step_list=[1,10,100,1000,10000,100000]

i=True
b=3
c=0
f_step=Step_list[b]
AD9833_setfrq(freq,f_step,i)
while True:

    a=p0.value()
    while a==1:
        c=p2.value()
        time.sleep(0.03)
        if c ==1:
            #time.sleep_ms(50)
            b=b+1
            b=int(b % 6)
            f_step=Step_list[b]
            print(freq,f_step)
            freq=int(freq/f_step)*f_step
            if freq==0:
                freq=f_step
            AD9833_setfrq(freq,f_step,i)
            #print_AQM1602(0,' '+str(int(OUT_freq)))
            
            
            
            
        a=p0.value()
        
    time.sleep(0.0001)
    #print(p0.value(),p1.value())
    while a==0: 
        a=p0.value()   
    time.sleep(0.0001)
    b=p1.value()
    if b==1:
        rotary_out=-1
    else:
        rotary_out=1
    freq=freq+f_step*rotary_out
    if c==1:
            freq=(freq/f_step)*f_step
    if freq<=0:
        freq=0
    AD9833_setfrq(freq,f_step,i)