JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

Raspberry Pi Pico CircuitPython Si5351A 7MHz VFO その2

2022-05-25 11:45:43 | Raspberry Pi Pico
 前の記事の続きです。
 KEYをGP14に接続します。(GP14はソフトでプルアップします。)
 SIDE TONEを聞くためのスピーカをGP13に接続します。(700HzのPWMを出力します。)
 この回路のVFO OUTにバッファとファイナルをつなげば、りっぱなCW送信機になります。
 

スクリプトです。
------------------------------------------------------------------
"""
Raspberry Pi Pico CircuitPython Si5351A 7MHz VFO
2022.05.25
JH7UBC Keiji Hata
"""
from board import *
import rotaryio
import busio
import time
import digitalio
import adafruit_si5351
import adafruit_ssd1306
import pwmio

# Create the I2C interface.
i2c = busio.I2C(GP21, GP20)

# Initialize SI5351.
si5351 = adafruit_si5351.SI5351(i2c)

#Pull up for step SW
STEP_button = digitalio.DigitalInOut(GP15)
STEP_button.direction = digitalio.Direction.INPUT
STEP_button.pull = digitalio.Pull.UP

#Pull up for KEY
KEY = digitalio.DigitalInOut(GP14)
KEY.direction = digitalio.Direction.INPUT
KEY.pull = digitalio.Pull.UP

#LED port
LED = digitalio.DigitalInOut(GP16)
LED.direction = digitalio.Direction.OUTPUT

oled = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c)
#OLED clear
oled.fill(0)

#VFO 初期値設定
frequency = 7000000
old_frequency = 9999999
step = 10000
f_Max = 7200000 #周波数最大値
f_Min = 7000000 #周波数最小値
df = -60 #周波数補正値

#Si5351A関係設定
XtalFreq = 25000000
denom = 1048575
#Si5351 Xtal Load Capacitance=6pF
si5351._write_u8(183,0x40)
#si5351.outputs_enabled = False
si5351._write_u8(3,0x0F)#output disable

#SIDE TONE関係設定
SIDE_TONE = pwmio.PWMOut(GP13,frequency = 700)
SIDE_TONE.duty_cycle = 0 # SIDE TONE off

#タイトル等表示
oled.text("RP2 Si5351A 7MHz VFO",5,0,1)
oled.rect(15,15,100,18,1)
oled.text(".",38,20,1)
oled.text(".",70,20,1)
oled.text("STEP",30,40,1)
oled.show()

#Rotary Encoder setup
encoder = rotaryio.IncrementalEncoder(GP0,GP1)
last_position = 0

#周波数表示
def Freq_display():
     global frequency,old_frequency
     fre_text = str(frequency)
     oldfre_text = str(old_frequency)
    x = 30
    y = 20
     for i in range(7):
         if fre_text[i] != oldfre_text[i]:
             oled.fill_rect(x,y,7,8,0)
             oled.text(fre_text[i],x,y,1)
             oled.show()
         if i == 0 or i == 3:
             x = x + 16
         else:
             x = x + 8
     old_frequency = frequency

#STEP表示
def Step_display(s):
     if s == 10000:
         step_text = "10K"
     elif s == 1000:
         step_text = " 1K"
     elif s == 100:
         step_text = "100"
     elif s == 10:
         step_text = " 10"
     oled.fill_rect(70,40,20,12,0)
     oled.show()
     oled.text(step_text,70,40,1)
     oled.show()

#周波数出力
def Freq_out(f):
     divider =900000000 // f
     if divider % 2:
         divider = divider - 1
     #PLLA周波数設定
     PllFreq = divider * f
     mult = PllFreq // XtalFreq
    L = PllFreq % XtalFreq
     num = (L * denom) // XtalFreq
     #PLL セット
     si5351.pll_a.configure_fractional(mult,num,denom)
     #CLOCK0出力周波数
    si5351.clock_0.configure_integer(si5351.pll_a, divider)

#周波数変更
def Freq_change():
     global frequency,step,df
     if position - last_position > 0:
         frequency = frequency + step
         if frequency >= f_Max:
             frequency = f_Max
     else:
         frequency = frequency - step
         if frequency <= f_Min:
             frequency = f_Min
     Freq_display()
     Freq_out(frequency+df)


#STEP変更
def Step_change():
     global step
     time.sleep(0.01)
     if step == 10:
         step = 10000
     else:
         step //= 10
     Step_display(step)
     while STEP_button.value == False:
         time.sleep(0.01)

#初期値表示及び出力
Freq_display()
Freq_out(frequency+df)
Step_display(step)
TX_flag = False
TX_bef_flag = False

#main loop
while True:
     position = encoder.position
     if position != last_position:
         Freq_change()
         last_position = position
     if STEP_button.value == False:
         Step_change()
     if KEY.value == False:
         TX_flag = True
         if TX_flag != TX_bef_flag:
             si5351._write_u8(3,0x0C) #CLOCK0 output
             LED.value = True
             SIDE_TONE.duty_cycle = 32768
     else:
         TX_flag = False
         if TX_flag != TX_bef_flag:
             si5351._write_u8(3,0x0F) # output disable
            LED.value = False
             SIDE_TONE.duty_cycle = 0
     TX_bef_flag = TX_flag
     time.sleep(0.01)

------------------------------------------------------------------
 SI5351Aの出力をコントロールするのは、Si5351Aのレジスタ3のbit2,bit1,bit0の値です。
bit0=0でCLK0がon
bit1=0でCLK1がon
bit2=0でCLK2がonです。
 今回は、CLK0使いませんので、0x0Fで全ての出力off、0x0CでCLK0 onになります。

ブレッドボードです。KEYの代わりにタクトスイッチ(右側の黄色いスイッチ)をつけてテストしています。KEYが押された時にLEDが点灯し、SIDE TONEをスピーカに出力し、CLK0に周波数が出力されます。


 

 スピーカをつけてテストしています。出力は、CLK0につけたリード線から漏れてくる微弱電波をハンディ機で受信してモニタしました。


最新の画像もっと見る

コメントを投稿