SDR-VFO für CW-Transceiver             

Elektronik-Labor   Projekte   AVR    






VB-Software: SDRshieldTX.zip
Arduino-Programm: si5351vfo9tx.zip

Der Elektor-SDR soll zu einem QRP CW Transceiver erweitert werden. Die Sendeendstufe gibt es schon, und sie konnte bisher auch schon mit der vorhandenen Stand-Alone Software angesteuert werden. Das Zusammenspiel mit der SDR-Software auf dem PC war allerdings schwierig. Inzwischen möchte ich das Bandspektrum nicht mehr missen, denn so findet man am schnellsten eine interessante Station. Wichtig ist aber, dass man genauso schnell auch den Sender abstimmen kann.

Die Abstimmsoftware hat nun einen zweiten Schieber bekommen, der die Sendefrequenz relativ zum VFO des Empfängers festlegt. Die Breite entspricht genau dem Spektrum in der SDR-Software. Man kann beide Programme passend untereinander auf dem Schirm platzieren. Wenn man also eine Station sieht, braucht man den oberen Schieber nur an diese Position zu bringen. Der TX-VFO wird dann kurz eingeschaltet, sodass man hören kann, ob die Frequenz mit der empfangenen Station übereinstimmt. Bei Bedarf  kann man dann noch etwas nachstimmen. In der Anzeige sieht man die ZF-Ablage (12660 Hz) und kann sie mit der Anzeige im SDR vergleichen (12740 Hz). Beide müssen nicht genau übereinstimmen, wenn man den Empfänger nicht genau auf Filter-Mitte abgestimmt hat.  Im VB-Abstimmprogramm wird die ZF dtx aus der Schieberposition bestimmt, wobei die kleinste Schrittweite 20 Hz beträgt. Zusätzlich wird die RX-Position aus dem unteren Schieber berechnet. Die Addition beider Frequenzen ergibt dann die genaue Frequenz des Senders (7037,660 kHz), die ebenfalls angezeigt wird.

Private Sub HScroll3_Change()
dtx = HScroll3.Value * 20
Label5 = Str(dtx)
n = HScroll1.Value
zf = HScroll2.Value
Label4.Caption = Str(zf)
If n > 179 Then f = n * 5
If n < 180 Then f = n * 9
Text4.Text = f
vfo = f - zf + 12 '(f + 12) * 4
tx = 1000 * vfo + dtx
Label8.Caption = Str(tx)
Text = Str(31000 + dtx / 20)
l = Len(Text)
For n = 1 To l
ch = Mid$(Text, n, 1)
SENDBYTE Asc(ch)
Next n
SENDBYTE 13
SENDBYTE 10
End Sub

Im Interesse einer einfachen Kommunikation mit dem Arduino im Transceiver wird immer nur eine Zahl gesendet. Wenn man den unteren Schieber betätigt, wird die VFO-Frequenz im Bereich bis 30 MHz in kHz gesendet. Betätigt man den oberen Schieber, wird die ZF in 20-Hz-Einheiten zu 31000 addiert und so scheinbar als Frequenz über 30 MHz gesendet. Auf der Arduino-Seite wird dann die ZF wieder herausgerechnet.


void setfreq (unsigned long freqHz)
{
uint64_t f2;
uint64_t f3;
uint64_t f4;
uint64_t f5;
unsigned long div2;
// unsigned int Teiler2;
unsigned int rdiv;

if (freqHz > 0) {
f2 = (freqHz) * 4;
si5351.set_freq(f2*100, SI5351_PLL_FIXED, SI5351_CLK1);
f2 = freqHz + ZF; //- 800;
si5351.set_freq(f2*100, SI5351_PLL_FIXED, SI5351_CLK2);
if (digitalRead(8) == 1) {
}
}
}

...

if (Serial.available()) {
int ch = Serial.read();
freq = Serial.parseInt();
if (freq > 30000){
ZF = 20 * (freq-31000);
freq=0;
setfreq (freqHz);
timeTune=2;
delay(50);
si5351.output_enable(SI5351_CLK2, 1);
}
if (freq > 0) {
lcd.setCursor(0, 0);
freqHz = freq * 1000 - 12000;
lcd.print(freq);
lcd.print (" ");
setfreq (freqHz);
}
}

...

timeTune--;
if (timeTune < 1) si5351.output_enable(SI5351_CLK2, 0);


Bei jeder neuen ZF, also bei einer TX-Feinabstimmung vom PC aus,  wird für kurze Zeit der der Oszillator-Ausgang eingeschaltet, sodass man das Signal im Empfänger hören kann, bevor man dann auf Senden umschaltet. Nach wie vor ist übrigens auch der autonome Betrieb mit einer manuellen Abstimmung möglich, indem man das Abstimmpoti aus der Mittelstellung bewegt. In dem Fall ist die ZF auf 800 Hz festgelegt, weil dies zum verwendeten CW-Filter passt. Die Tasten werden nicht mehr für die manuelle Abstimmung benötigt. Aber sie dienen noch zur schnellen Abstimmung auf eine WSPR-Frequenz. in dieser Version muss man beide Tasten gleichzeitig drücken, um auf eine der WSPR-Frequenzen zu wechseln. Das sollte eine gewisse Sicherheit gegen Fehlbedienung bringen, damit man nicht versehentlich mitten in einem QSO die Frequenz wechseln kann.

  if (digitalRead(A0) == 0) {
if (digitalRead(A1) == 0) {
band = band + 1;
if (band > 11) band=1;
if (band == 1) freqHz = 502400;
if (band == 2) freqHz = 1836600;
if (band == 3) freqHz = 3592600;
if (band == 4) freqHz = 5287200;
if (band == 5) freqHz = 7038600;
if (band == 6) freqHz = 10138700;
if (band == 7) freqHz = 14095600;
if (band == 8) freqHz = 18104600;
if (band == 9) freqHz = 21094600;
if (band == 10) freqHz = 24924600;
if (band == 11) freqHz = 28124600;
lcd.setCursor(0, 0);
//freq=freqHz/1000;
lcd.print(freqHz);
setfreq (freqHz);
lcd.print (" ");
delay (500);
}
}

if (fstep != 0) {
freqHz = freqHz + fstep;
ZF = -800;
lcd.setCursor(0, 0);
lcd.print(freqHz);
setfreq (freqHz);
lcd.print (" ");
delay (50);
}

Die Software übernimmt jetzt auch die Sendersteuerung mit einer automatischen Sende/Empfangsumschaltung. Die Morsetaste ist am Pin 8 angeschlossen. Immer wenn man  die Morsetaste betätigt wird unverzüglich auf Senden umgeschaltet. Nach einer gewissen Pause schaltet das Programm zurück auf Empfang. Das Antennenrelais wird über Pin 10 gesteuert, die Tastung der Endstufe über Pinn 11. Zusätzlich gibt es noch einen Mithörton an Pin 9.

const int key = 8;
const int buz = 9;
const int txOn = 10;
const int keyOut = 11;
....

void morseKey(void)
{
timeTx = 100;
digitalWrite (txOn,1); //Relais
delay (20);
si5351.output_enable(SI5351_CLK2, 1);
while (timeTx > 0){
if (digitalRead(key) == 0) {

timeTx = 100;
digitalWrite (keyOut,1); //keyOut
analogWrite(buz, 2);
delay (5);
}
if (digitalRead(key) == 1) {
digitalWrite (keyOut,0); //keyOut
analogWrite(buz, 0);
delay (5);
timeTx--;
}
}
digitalWrite (txOn,0); //Relais
}
...

if (digitalRead(key) < 1) morseKey();


Übrigens habe ich mal angefangen, den Sender mit der automatischen Morsetaste von Ralf Beesner zu steuern. Da hätte ich aber den Umgang mit dieser Taste lernen müssen.  Im praktischen Betrieb habe ich dann gemerkt, dass ich viel verlernt habe und mich voll konzentrieren muss. Mit meiner guten alten Morsetaste geht das noch etwas besser, deshalb wird dieser Sender auch die alte Art getastet, jedenfalls so lange bis ich Telegraphie-mäßig wieder fit bin.



Elektronik-Labor   Projekte   AVR