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)
Elektronik-Labor
Projekte
Mikrocontroller
Raspberry