AD9833の使い方のも慣れてロータリエンコーダをつけて制御してみた。
まだ動作が今一つだが、AD9833自体の使い方の練習にはまあこんなもんかもしれない。
周波数を変える際には、周波数レジスタ0と1を交互に切り替えて周波数を制御してみた。
ロータリーエンコーダの制御についてもう少し勉強しないとうまくはいかないな。
まだまだといえば、ディスプレイについては全く分かっていない。
最終的には、グラフィックディスプレイを使いたいと考えている。
以前購入した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)