JH7UBCブログ

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

Raspberry Pi Pico CircuitPython Si5351A 7MHz VFOテスト

2022-05-21 20:30:54 | Raspberry Pi Pico
 家庭菜園等に費やす時間が増えた一方、マイコン遊びの時間が少なくなってきました。

 先日の「Rasoberry Pi Pico CircuitPython Si5351A テストその2」の記事に書いたRaspberry Pi Pico CircuitPython Si5351A 7MHz VFOを作って、テストそてみました。

 回路図です。GP0,GP1にロータリーエンコーダを接続します。
 Si5351AとOLEDは、I2C接続です。DCL=GP21,SDA=GP20としました。
 周波数STEPの変更SWは、GP15に接続します。
 SI5351AのCLK0をVFO出力とします。
 I2C用のプルアップ抵抗は、OLEDに内蔵されているので、外付けしていません。

 準備として、各デバイスを使うためのライブラリーをPico(CIRCUITPY )のlibフォルダ内にコピーします。具体的には、これまでの記事を参照してください。
 スクリプトです。
 STEP SWを接続するGP15はPULLUPしておきます。
-------------------------------------------------------------------------------------
"""
Raspberry Pi Pico CircuitPython Si5351A 7MHz VFO
2022.05.21
JH7UBC Keiji Hata
"""
from board import *
import rotaryio
import busio
import time
import digitalio
import adafruit_si5351
import adafruit_ssd1306

# 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

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 = True

#タイトル等表示
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)

#main loop
while True:
     position = encoder.position
     if position != last_position:
         Freq_change()
         last_position = position
     if STEP_button.value == False:
         Step_change()
     time.sleep(0.01)
-------------------------------------------------------------------------------------
 今回は、Xtal Load Capacitanceは、6pFとしています。
 dfは、周波数補正値です。
 STEP SWを押すたびに、10K→1K→100→10→10Kと循環します。
 ブレッドボードです。



 出力周波数を測定しています。7060000Hzに設定した時の周波数です。
 周波数の細かい調整は、dfの値で行います。


 このVFOにキーイングやサイドトーン発生のスクリプトを加えると、送信機として使用できるスクリプトになります。
 これも近日中にテストしてみたいと思います。

最新の画像もっと見る

コメントを投稿