ja1yaz’s diary

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

Si5351Aを使えるようになりたい(2)



自由に周波数を可変できるように変数を入れてプログラムを作り変えてみた。

大分昔に購入したカウンタで周波数を計測してみた。

やっぱりちょうど50MHzにはならなかった。

カウンタでSi5351Aの出力を計測

下記プログラムにて、PLL_n=216

とすることで、概ね50MHzになることが分かった。

72HzOffsetをかけるとカウンタではちょうど50MHzになるようだった。

EDUX1052Gノ10MHz出力をカウンタのREF入力に入れて外部REFとすると、PLL_n=180でちょうど50MHzになるようだった。

Si5351Aの出力をTinySAで観測

Si5351Aの出力は、矩形波なので、上記のように高調波が大きく乗っているのがわかる。3次高調波はー20dBくらいだ。

カウンタの確度は、購入時1ppmだったようなので、こちらを信じることにする。

 

念のためググってみったら、下記だった。概ね10ppm程度しかないようなのであんまりあてにならないことが分かった。

-Aging rate:

     ±5ppm/month

- Temperature Stability :

     < 5 10-6( 0~+50) 

LG FC7150スペック

표지 (valuetesters.com)

 

書き換えたプログラム:50MHz

from machine import Pin, I2C
import time
import math

# I2Cに使うピンの設定です
i2c = I2C(0, scl=Pin(17), sda=Pin(16), freq=400000)

# デバイスのアドレスをスキャンします
addr = i2c.scan()
print( "address is :" + str(addr) )

PLL_m=24
PLL_n=216#External Ref n_zero=180
#internal n_zero=216
PLL_d=625000

OUT_div=12
OUT_n=0
OUT_d=1
OUT_Rdiv=1


MSNA_P1=128*PLL_m+int(128*PLL_n/PLL_d)-512
MSNA_P2=128*PLL_n-PLL_d*int(128*PLL_n/PLL_d)
MSNA_P3=PLL_d


MS0_P1=128*OUT_div+int(OUT_n/OUT_d)-512
MS0_P2=128*OUT_n*int(OUT_n/OUT_d)
MS0_P3=OUT_d


i2c.writeto_mem(96,3,b'\xff')

i2c.writeto_mem(96,16,b'\x80')
i2c.writeto_mem(96,17,b'\x80')
i2c.writeto_mem(96,18,b'\x80')
i2c.writeto_mem(96,19,b'\x80')
i2c.writeto_mem(96,20,b'\x80')
i2c.writeto_mem(96,21,b'\x80')
i2c.writeto_mem(96,22,b'\x80')
i2c.writeto_mem(96,23,b'\x80')

i2c.writeto_mem(96,2,b'\xf0')# set interupt mask

i2c.writeto_mem(96,15,b'\x00')
i2c.writeto_mem(96,183,b'\x80')#XTAL_CL CL=8pf
i2c.writeto_mem(96,149,b'\x00')#SSC disable

data=i2c.readfrom_mem(96,44,1)
data=int.from_bytes(data,"big")

data= int(data & 0x8f)+int(math.log2(OUT_Rdiv)*16)
i2c.writeto_mem(96,44,data.to_bytes(1,"big"))

#MSNA_p1=2560:18bit
#MSNA_p1_17_16:28_[1:0]=0
#MSNA_p1_15_8:29[7:0]=10
#MSNA_P1_7_0:30[7:0]=0

MSNA_P11=int(MSNA_P1/256/256)
MSNA_P12=int(MSNA_P1/256)-256*MSNA_P11
MSNA_P13=MSNA_P1 % 256

data=i2c.readfrom_mem(96,28,1)
data=int.from_bytes(data,"big")
data= int(data & 0xfc)+int(MSNA_P11)

i2c.writeto_mem(96,28,data.to_bytes(1,"big"))
i2c.writeto_mem(96,29, bytes([MSNA_P12]))
i2c.writeto_mem(96,30, bytes([MSNA_P13]))

#MSNA_P2=0:20bit
#MSNA_P2=0
#MSNA_p2_19_16:31_[3:0]=0
#MSNA_p2_15_8:32[7:0]=0
#MSNA_P2_7_0:33[7:0]=0

MSNA_P21=int(MSNA_P2/256/256)
MSNA_P22=int(MSNA_P2/256)-256*MSNA_P21
MSNA_P23=MSNA_P2 % 256

i2c.writeto_mem(96,31,bytes([MSNA_P21]))
i2c.writeto_mem(96,32,bytes([MSNA_P22]))
i2c.writeto_mem(96,33,bytes([MSNA_P23]))

#MSNA_p3=625000:20bit
#MSNA_P3=625000
#MSNA_p3_19_16:31_[7:4]=9    
#MSNA_p3_15_8:26[7:0]=137                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
#MSNA_P3_7_0:27[7:0]=104

MSNA_P31=int(MSNA_P3/256/256)
MSNA_P32=int(MSNA_P3/256)-256*MSNA_P31
MSNA_P33=MSNA_P3 % 256

data=i2c.readfrom_mem(96,31,1)
data=int.from_bytes(data,"big")
data= int(data & 0x0f)+int(MSNA_P31*16)

i2c.writeto_mem(96,31,data.to_bytes(1,"big"))
i2c.writeto_mem(96,26,bytes([MSNA_P32]))#                
i2c.writeto_mem(96,27,bytes([MSNA_P33]))#CLK_0 Enable=1  

#MS0_P1=1024:18bit
#MS0_P1_17_16:44[1:0]=0
#MS0_P1_15_8:45[7:0]=4
#MS0_P1_7_0:46[7:0]=0

MS0_P11=int(MS0_P1/256/256)
MS0_P12=int(MS0_P1/256)-256*MS0_P11
MS0_P13=MS0_P1 % 256

data=i2c.readfrom_mem(96,44,1)
data=int.from_bytes(data,"big")
data= int(data & 0xfc)+int(MS0_P11)

i2c.writeto_mem(96,44,data.to_bytes(1,"big"))
i2c.writeto_mem(96,45,bytes([MS0_P12]))
i2c.writeto_mem(96,46,bytes([MS0_P13]))

#MS0_P2=0:20bit
#MS0_P2_19_16:47[3:0]=0
#MS0_P2_15_8:48[7:0]=0
#MS0_P2_7_0:49[7:0]=0

MS0_P21=int(MS0_P2/256/256)
MS0_P22=int(MS0_P2/256)-256*MS0_P21
MS0_P23=MS0_P2 % 256

i2c.writeto_mem(96,47,bytes([MS0_P21]))
i2c.writeto_mem(96,48,bytes([MS0_P22]))
i2c.writeto_mem(96,49,bytes([MS0_P23]))

#MS0_P3=1:20bit
#MS0_P3_19_16:47[7:4]=0
#MS0_P3_15_8:42[7:0]=0
#MS0_P3_7_0:43[7:0]=1

MS0_P31=int(MS0_P3/256/256)
MS0_P32=int(MS0_P3/256)-256*MS0_P31
MS0_P33=MS0_P3 % 256

data=i2c.readfrom_mem(96,47,1)
data=int.from_bytes(data,"big")
data= int(data & 0x0f)+int(MS0_P31*16)


i2c.writeto_mem(96,47,data.to_bytes(1,"big"))
i2c.writeto_mem(96,42,bytes([MS0_P32]))
i2c.writeto_mem(96,43,bytes([MS0_P33]))

i2c.writeto_mem(96,177,b'\xac')
i2c.writeto_mem(96,16,b'\x4f')
i2c.writeto_mem(96,3,b'\xfe')

# CHeck parameter
PLL_freq=25000000*(PLL_m+PLL_n/PLL_d)
OUT_freq=PLL_freq/(OUT_div+OUT_n/OUT_d)*OUT_Rdiv
print('PLL Frequency=',PLL_freq)
print('OUTPUT frequency=',OUT_freq)
print('MSNA_P1=',MSNA_P1,MSNA_P11,MSNA_P12,MSNA_P13)
print('MSNA_P2=',MSNA_P2,MSNA_P21,MSNA_P22,MSNA_P23)
print('MSNA_P3=',MSNA_P3,MSNA_P31,MSNA_P32,MSNA_P33)
print('MS0_P1=',MS0_P1,MS0_P11,MS0_P12,MS0_P13)
print('MS0_P2=',MS0_P2,MS0_P21,MS0_P22,MS0_P23)
print('MS0_P3=',MS0_P3,MS0_P31,MS0_P32,MS0_P33)

 

せっかくなので、周波数をSweepさせてみた。

SI5351A sweep

プログラムは、上記のからちょっと変更して下記のようにすることですぐにSweepすることができた。

しかし、周波数の変更に概ね7ms程度時間がかかるようだった。

いちいち出力を切っているので、ぶつぶつと途切れた波形となっていることがわかる。

 

 

from machine import Pin, I2C
import time
import math

# I2Cに使うピンの設定です
i2c = I2C(0, scl=Pin(17), sda=Pin(16), freq=400000)

# デバイスのアドレスをスキャンします
addr = i2c.scan()
print( "address is :" + str(addr) )

def Si5351A(PLL_m,PLL_n,PLL_d,OUT_div,OUT_n,OUT_d,OUT_Rdiv):

    MSNA_P1=128*PLL_m+int(128*PLL_n/PLL_d)-512
    MSNA_P2=128*PLL_n-PLL_d*int(128*PLL_n/PLL_d)
    MSNA_P3=PLL_d


    MS0_P1=128*OUT_div+int(OUT_n/OUT_d)-512
    MS0_P2=128*OUT_n*int(OUT_n/OUT_d)
    MS0_P3=OUT_d


    i2c.writeto_mem(96,3,b'\xff')

    i2c.writeto_mem(96,16,b'\x80')
    i2c.writeto_mem(96,17,b'\x80')
    i2c.writeto_mem(96,18,b'\x80')
    i2c.writeto_mem(96,19,b'\x80')
    i2c.writeto_mem(96,20,b'\x80')
    i2c.writeto_mem(96,21,b'\x80')
    i2c.writeto_mem(96,22,b'\x80')
    i2c.writeto_mem(96,23,b'\x80')

    i2c.writeto_mem(96,2,b'\xf0')# set interupt mask

    i2c.writeto_mem(96,15,b'\x00')
    i2c.writeto_mem(96,183,b'\x80')#XTAL_CL CL=8pf
    i2c.writeto_mem(96,149,b'\x00')#SSC disable

    data=i2c.readfrom_mem(96,44,1)
    data=int.from_bytes(data,"big")

    data= int(data & 0x8f)+int(math.log2(OUT_Rdiv)*16)
    i2c.writeto_mem(96,44,data.to_bytes(1,"big"))

    #MSNA_p1=2560:18bit
    #MSNA_p1_17_16:28_[1:0]=0
    #MSNA_p1_15_8:29[7:0]=10
    #MSNA_P1_7_0:30[7:0]=0

    MSNA_P11=int(MSNA_P1/256/256)
    MSNA_P12=int(MSNA_P1/256)-256*MSNA_P11
    MSNA_P13=MSNA_P1 % 256

    data=i2c.readfrom_mem(96,28,1)
    data=int.from_bytes(data,"big")
    data= int(data & 0xfc)+int(MSNA_P11)

    i2c.writeto_mem(96,28,data.to_bytes(1,"big"))
    i2c.writeto_mem(96,29, bytes([MSNA_P12]))
    i2c.writeto_mem(96,30, bytes([MSNA_P13]))

    #MSNA_P2=0:20bit
    #MSNA_P2=0
    #MSNA_p2_19_16:31_[3:0]=0
    #MSNA_p2_15_8:32[7:0]=0
    #MSNA_P2_7_0:33[7:0]=0

    MSNA_P21=int(MSNA_P2/256/256)
    MSNA_P22=int(MSNA_P2/256)-256*MSNA_P21
    MSNA_P23=MSNA_P2 % 256

    i2c.writeto_mem(96,31,bytes([MSNA_P21]))
    i2c.writeto_mem(96,32,bytes([MSNA_P22]))
    i2c.writeto_mem(96,33,bytes([MSNA_P23]))

    #MSNA_p3=625000:20bit
    #MSNA_P3=625000
    #MSNA_p3_19_16:31_[7:4]=9    
    #MSNA_p3_15_8:26[7:0]=137                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
    #MSNA_P3_7_0:27[7:0]=104

    MSNA_P31=int(MSNA_P3/256/256)
    MSNA_P32=int(MSNA_P3/256)-256*MSNA_P31
    MSNA_P33=MSNA_P3 % 256

    data=i2c.readfrom_mem(96,31,1)
    data=int.from_bytes(data,"big")
    data= int(data & 0x0f)+int(MSNA_P31*16)

    i2c.writeto_mem(96,31,data.to_bytes(1,"big"))
    i2c.writeto_mem(96,26,bytes([MSNA_P32]))#                
    i2c.writeto_mem(96,27,bytes([MSNA_P33]))#CLK_0 Enable=1  

    #MS0_P1=1024:18bit
    #MS0_P1_17_16:44[1:0]=0
    #MS0_P1_15_8:45[7:0]=4
    #MS0_P1_7_0:46[7:0]=0

    MS0_P11=int(MS0_P1/256/256)
    MS0_P12=int(MS0_P1/256)-256*MS0_P11
    MS0_P13=MS0_P1 % 256

    data=i2c.readfrom_mem(96,44,1)
    data=int.from_bytes(data,"big")
    data= int(data & 0xfc)+int(MS0_P11)

    i2c.writeto_mem(96,44,data.to_bytes(1,"big"))
    i2c.writeto_mem(96,45,bytes([MS0_P12]))
    i2c.writeto_mem(96,46,bytes([MS0_P13]))

    #MS0_P2=0:20bit
    #MS0_P2_19_16:47[3:0]=0
    #MS0_P2_15_8:48[7:0]=0
    #MS0_P2_7_0:49[7:0]=0

    MS0_P21=int(MS0_P2/256/256)
    MS0_P22=int(MS0_P2/256)-256*MS0_P21
    MS0_P23=MS0_P2 % 256

    i2c.writeto_mem(96,47,bytes([MS0_P21]))
    i2c.writeto_mem(96,48,bytes([MS0_P22]))
    i2c.writeto_mem(96,49,bytes([MS0_P23]))

    #MS0_P3=1:20bit
    #MS0_P3_19_16:47[7:4]=0
    #MS0_P3_15_8:42[7:0]=0
    #MS0_P3_7_0:43[7:0]=1

    MS0_P31=int(MS0_P3/256/256)
    MS0_P32=int(MS0_P3/256)-256*MS0_P31
    MS0_P33=MS0_P3 % 256

    data=i2c.readfrom_mem(96,47,1)
    data=int.from_bytes(data,"big")
    data= int(data & 0x0f)+int(MS0_P31*16)


    i2c.writeto_mem(96,47,data.to_bytes(1,"big"))
    i2c.writeto_mem(96,42,bytes([MS0_P32]))
    i2c.writeto_mem(96,43,bytes([MS0_P33]))

    i2c.writeto_mem(96,177,b'\xac')
    i2c.writeto_mem(96,16,b'\x4f')
    i2c.writeto_mem(96,3,b'\xfe')

    # CHeck parameter
    PLL_freq=25000000*(PLL_m+PLL_n/PLL_d)
    OUT_freq=PLL_freq/(OUT_div+OUT_n/OUT_d)*OUT_Rdiv
    #print('PLL Frequency=',PLL_freq)
    print('OUTPUT frequency=',OUT_freq)
    #print('MSNA_P1=',MSNA_P1,MSNA_P11,MSNA_P12,MSNA_P13)
    #print('MSNA_P2=',MSNA_P2,MSNA_P21,MSNA_P22,MSNA_P23)
    #print('MSNA_P3=',MSNA_P3,MSNA_P31,MSNA_P32,MSNA_P33)
    #print('MS0_P1=',MS0_P1,MS0_P11,MS0_P12,MS0_P13)
    #print('MS0_P2=',MS0_P2,MS0_P21,MS0_P22,MS0_P23)
    #print('MS0_P3=',MS0_P3,MS0_P31,MS0_P32,MS0_P33)


PLL_m=24
PLL_n=216

#External Ref n_zero=180
#internal n_zero=206
PLL_d=625000

OUT_div=12
OUT_n=0
OUT_d=1
OUT_Rdiv=1
i=0
while i<=1000:
    PLL_n=i*3*100    
    Si5351A(PLL_m,PLL_n,PLL_d,OUT_div,OUT_n,OUT_d,OUT_Rdiv)
    i=i+1