RPi Pico VFO bis 15 MHz                   

            

Elektronik-Labor  Projekte  Mikrocontroller  Raspberry     





Dieser abstimmbare Oszillator ist eine Weiterentwicklung aus dem 7074kHz-Generator. Der entscheidene Unterschied ist, dass die Variable periods nun im laufenden Betrieb von außen verändert werden kann. Sie musste dazu als volatile deklariert werden. Die Geschwindigkeit der schnellen Ausgabeschleife sinkt dadurch etwas ab. Eine Maßnahme dagegen ist, dass der Prozessortakt auf 180 MHz erhöht wurde.

//PicoVFO bis 15 MHz
#include "vfo2.pio.h"
#include "pico/stdlib.h"
#include "pico/multicore.h"

uint32_t clk_khz = 180000;
volatile uint32_t f=7074000;
volatile uint32_t periods;
 
void setup(void){
  set_sys_clock_khz(clk_khz,true);
  Serial.begin(9600);
}

void set_freq(void){
  uint64_t ratio = (uint64_t)clk_khz*1000LL *(1<<24)/(uint64_t)f;
  periods=(uint32_t)(ratio/1-(10<<24));
}

void flush_input(void)
{
  while (Serial.available() > 0)
  Serial.read();
}

void loop(){
  if (Serial.available()) {
    int ch = Serial.read();
    f = Serial.parseInt();
    Serial.read();
    if((ch == 102)&& (f>100000)){ 
      {set_freq();}
    }
  }
}

void setup1(void){
  uint16_t t;
  uint32_t delta;
 
  PIO pio = pio0;
  gpio_init(0);
  gpio_set_dir(0, GPIO_OUT);
  pio_gpio_init(pio0, 15);        
  uint offset = pio_add_program(pio0, &vfo_program);        
  pio_sm_set_consecutive_pindirs(pio0, 0, 15, 1, true);         
  pio_sm_config c = vfo_program_get_default_config(offset);
  sm_config_set_set_pins(&c, 15, 1);                 
  pio_sm_init(pio0, 0, offset, &c);      
  pio_sm_set_enabled(pio0, 0, true);
  set_freq();
  //periods=10<<24;
  for(;;){
    t = (periods+delta) >> 24; 
    pio_sm_put_blocking(pio0, 0, t);
    delta += periods-(t << 24);     
  }
}

void loop1(){}

Die zweite erforderliche Änderung betrifft das PIO-Assemblerprogramm. Es verwendet jetzt jede übergebene Periodenzeit gleich zweimal, weil der eigentliche Flaschenhals die Übergabeschleife im Hauptprogramm ist. So wird die obere Grenze verdoppelt. Eine Warteschleife arbeitet nun mit x, die andere mit y.

.program vfo
    set pindirs, 1
.wrap_target
    pull        ;1
    out x, 32        ;1
    mov y, x        ;1
loop2:
    jmp y-- loop2      ;1+x
    set pins, 1 [4]    ;1+4
    set pins, 0        ;1
    nop            ;1
    nop            ;1
    nop            ;1
loop3:
    jmp x-- loop3      ;1+x
    set pins, 1 [4]    ;1+4
    set pins, 0        ;1
.wrap            ; 10+x/Schwingung

Die Frequenz in Hertz kann nun mit einem vorangestellten "f" über den seriellen Monitor der Arduino-IDE  mit 9600 Baud gesendet werden.



Ein Signal mit 14074 kHz hört sich im Empfänger sauber an und sieht so aus:



Für eine leichtere Bedienung wurde ein ursprünglich für das Elektor SDR-Shield entwickeltes VB6-Programm angepasst, das auch bereits für den Modul-Bus SI5351-VFO verwendet wurde. Mit einem einfachen Trick wurde der Abstimmbereich bis 30 MHz erweitert. Alle Frequenzen über 15 MHz werden durch drei geteilt, sodass man im oberen Bereich mit der dritten Oberwelle arbeitet.

Private Sub HScroll1_Change()
  dtx = HScroll3.Value * 20
  Label5 = Str(dtx)
  f = HScroll1.Value
  Text4.Text = f
  vfo = 1000 * f + dtx
  Label8.Caption = Str(vfo)
  If Option1.Value Then vfo = vfo + 455000
  If Option3.Value Then vfo = vfo - 455000
  If vfo > 15000000 Then vfo = Int(vfo / 3)
  Text = "f" + Str(vfo)
  l = Len(Text)
  For n = 1 To l
    ch = Mid$(Text, n, 1)
    SENDBYTE Asc(ch)
  Next n
  SENDBYTE 13
  DELAY 200
End Sub

Die Software erlaubt auch eine Feinabstimmung für SSB-Empfang oder andere Anwendungen. Besonders hohe Anforderungen an die Stabilität des Oszillatorsignals stellt WSPR. Aber auch diese Signale konnten zuverlässig dekodiert werden.







Empfangene WSPR-Stationen im 40m-Band (VFO 7038600 Hz)

Download VB6-Projekt: VBPicoVFO.zip

Download Firmware: PicoVFO.zip


Elektronik-Labor  Projekte  Mikrocontroller  Raspberry