
SDR-VFO für CW-Transceiver
Elektronik-Labor
Projekte
AVR
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