RPi
Pico WSPR Mini 30/40m
Elektronik-Labor Projekte Mikrocontroller Raspberry
Das
Antennenfilter ist eine Kombination aus Tiefpassfilter und
Resonanzkreis. Vorversuche haben gezeigt, dass es mit
Antennenimpedanzen zwischen 30 Ohm und 300 Ohm gut arbeitet und relativ
gleiche Ausgangsleistungen überträgt. Wenn eine Antenne den
Schwingkreis weniger belastet, steigt die Resonanzspannung an und
gleicht den Unterschied wieder aus. Außerdem können Blindanteile der
Antenne leicht weggestimmt werden.
Beide
Spulen sind als einfache Luftspulen mir CuL 0,2 mm gewickelt und mit
dem Draht selbst zu einem Ring verschnürt. Diese Bauform bringt zwar
größere Verluste als ein Ringkern, sollte aber für diese Anwendung
reichen. Die Schaltung wurde zuerst im fliegenden Aufbau getestet und
dann in kompakter Form auf eine Platine gebracht.
Die ersten Versuche mit der ursprünglichen WSPR-Firmware
haben gezeigt, dass die Ausgangsleistung mit diesem Filter nur noch nur
etwa 3 mW betrug. Ein Grund war, dass die kurzen Impulse von weniger
als 25% einer Periode weniger Ausgangsleistung brachten. Ich habe daher
die Firmware für ein symmetrisches Rechtecksignal geändert, was auch
die Oberwellendämpfung verbessert. Der zweite Grund war, dass ein
einzelner Ausgangsport zu hochohmig ist, um noch voll auszusteuern.
Dagegen hilft es, gleich vier Ports parallel zu verwenden. Beide
Änderungen betreffen vor allem das PIO-Assemblerprogramm:
.program vfo
set pindirs, 15
.wrap_target
pull ;1
out x, 32 ;1
set pins, 15 ;1
mov y, x ;1
loop1:
jmp y-- loop1 ;1+x
nop ;1
nop ;1
set pins, 0 ;1
mov y, x ;1
loop2:
jmp y-- loop2 ;1+x
nop ;1
nop ;1
set pins, 15 ;1
mov y, x ;1
loop3:
jmp y-- loop3 ;1+x
nop ;1
nop ;1
set pins, 0 ;1
mov y, x ;1
loop4:
jmp y-- loop4 ;1+x
.wrap ; 5+x/Puls
Damit bin ich sehr nah an der Lösung von Roman Piksaykin gelandet, der ebenfalls symmetrische Signale erzeugt. Der wesentliche Unterschied besteht darin, dass ich mit einer Ausgabe set pins, 15 gleich vier Ports zusammen ansteuere, die dann parallel geschaltet werden können. Mit dieser Änderung muss man nun im Hauptprogramm die halbe Periode übergeben, die dann gleich viermal hintereinander verwendet wird. Die Korrekturen kommen damit etwas seltener, was zu einem größeren Jitter des Signals führt. Eine Verschlechterung des Signalabstands zu den Nebenwellen konnte allerdings nicht festgestellt werden.
//PicoWSPR 40m/30m
#include "vfo3.pio.h"
#include "pico/stdlib.h"
#include "pico/multicore.h"
#include <JTEncode.h>
JTEncode jtencode;
char call[] = "T2EST"; //Rufzeichen
char loc[] = "JO31"; //Lacotor
uint8_t dbm = 10; //10 mW
uint8_t tx_buffer[255];
uint32_t clk_khz = 150000;
uint32_t f;
volatile uint32_t periods;
void setup(void){
set_sys_clock_khz(clk_khz,true);
Serial.begin(9600);
gpio_init(0);
gpio_set_dir(0,0);
gpio_pull_up(0);
}
void set_freq(void){
uint64_t ratio = (uint64_t)clk_khz*1000LL *(1<<24)/(uint64_t)f;
periods=(uint32_t)ratio;
}
void encode(){
uint32_t wsfr[4];
set_freq();
uint32_t dwsfr= 146L * (periods/f)/ 100L ;
wsfr[0]= periods-(10<<24); // + 3 x Abstand 1,46 Hz
wsfr[1]= wsfr[0]-dwsfr;
wsfr[2]= wsfr[1]-dwsfr;
wsfr[3]= wsfr[2]-dwsfr;
wsfr[0]>>=1; //Perioden /2
wsfr[1]>>=1;
wsfr[2]>>=1;
wsfr[3]>>=1;
memset(tx_buffer, 0, 255);
jtencode.wspr_encode(call, loc, dbm, tx_buffer);
uint16_t n=0;
while(1){
for(uint8_t i = 0; i < 162; i++)
{
periods=wsfr[tx_buffer[i]];
delay(683);
}
periods = 0;
n++;
delay(9350); //Restzeit bis 2 Min
if (n>2){delay(360000);} //6 Min Pause
}
}
void loop(){
if (gpio_get(0)==0){
f=7040100; //40m
}
else{
f=10140200; //30m
}
delay (50);
encode();
while(1){}
}
void setup1(void){
PIO pio = pio0;
gpio_init(0);
gpio_set_dir(0, GPIO_OUT);
pio_gpio_init(pio0, 15);
pio_gpio_init(pio0, 14);
pio_gpio_init(pio0, 13);
pio_gpio_init(pio0, 12);
uint offset = pio_add_program(pio0, &vfo_program);
pio_sm_set_consecutive_pindirs(pio0, 0, 12, 4, true);
pio_sm_config c = vfo_program_get_default_config(offset);
sm_config_set_set_pins(&c, 12,
4);
pio_sm_init(pio0, 0, offset, &c);
pio_sm_set_enabled(pio0, 0, true);
periods=0;
}
void vco(){
uint16_t t;
uint32_t delta;
while(periods>0){
t = (periods+delta) >> 24;
pio_sm_put_blocking(pio0, 0, t);
delta += periods-(t << 24);
}
}
void loop1(){
vco();
}
Download: PicoWSPR2.zip
Die Empfangsergebnisse über mehrere Stunden im 30m-Band zeigen, dass
man mit nur 10 mW ganz Europa erreichen kann. Mehr ist nicht nötig und
sollte mit dieser Methode der Signalerzeugung auch nicht angestrebt
werden. Der Grund sind Nebenausstrahlungen mit ca. -30 dB, die bei der
geringen Leistung noch weitgehend im Rauschen verschwinden, bei
größeren Leistungen jedoch zu Störungen führen könnten. Die
gesetzlichen Anforderungen lauten, dass alle Nebenausstrahlungen 40 dB
unter dem Nutzsignal liegen müssen. Für die Oberwellen wird diese
Vorgabe mit dem verwendeten Filter erreicht. Die übrigen Nebenwellen
werden mit dem Resonanzkreis teilweise gedämpft, sind aber immer noch
etwas zu stark und sind im Nahbereich durchaus noch zu empfangen. Je
größer das Verhältnis Systemtakt zu Ausgangsfrequenz wird, desto
sauberer wird das Signal. Wer also im 160m-Band damit senden will, kann
sich einen kleinen Endverstärker leisten.