Ein altes 150 Mhz- Funkgerät Telecar TE 160 soll auf die APRS- Frequenz 144,800 Mhz umgestellt werden. Die Sendefrequenz wird durch Verdopplung der Quarzoszillator- Frequenz und Mischung mit der ZF-Frequenz 16,9 Mhz erzeugt. Für die APRS- Frequenz 144,8 Mhz wird hier ein Quarz mit 63.950 Mhz benötigt.
Warum einen speziellen Quarz kaufen?
Nach einigen Experimenten[1] mit dem Digitalen Oszillator Chip Si5351( Datenblatt [2] ) wurde beschlossen , einen Aufbau mit diesem Oszillator zu probieren. Das Oszillator Chip ist in SMD-Bauweise, jedoch gibt es von verschiedene Herstellern [3][4] Module, die gut zu handhaben sind. Der Chip wird über eine serielle I2C-Schnittstelle programmiert; man benötigt also noch eine Controller zum ‚Booten‘ des Chips. Hier haben wir uns für ein ‚Arduino-Mini-Modul‘ [5] entschieden, welches einen Atmega 328 Chip hat; zum Programmieren und zur Kommunikation wird noch ein USB-Serial-Wandler benötigt. Man kann auch ein ‚Arduino-Nano-Modul‘ verwenden, da ist der USB-Serial-Wandler schon drauf. Das ganze kann mit 7 bis 12 Volt betrieben werden.
Beide Module waren von früheren Experimenten schon vorhanden. Die Kosten liegen bei 12 bis 15 Euro.
Umbau der Quarzplatine: links Original, rechts Umbau zur Fremdspeisung. Der 1k Widerstand dient zur Umschaltung der Quarz-Steckplätze.
Das Tonruf-Auswertemodul des Telecar-TE 160 wurde ausgebaut und durch eine Lochrasterplatine ersetzt, auf dem der SI5351 und der Arduino-Mini aufgesteckt wurden. Die Stromversorgung geschieht über dieSteckverbinder der Lochrasterplatine zum Telecar. Das Oszillatorsignal CLK0 wird über ein kurzes Stück Koaxkabel an eine zweite Lochrasterplatine geführt, welche die Quarzsteckplatine ersetzt.
Über eine Programmerweiterung lassen sich auch mehrere Frequenzen mit Hilfe des Kanalschalters abrufen, was aber für den Anwendungszweck als APRS- Transceiver nicht notwendig ist.
Programmierung:
Der Arduino Nano wird über USB an den PC angeschlossen. Bei Verwendung eines Arduino Mini wird zusätzlich ein USB-Serial-Adapter zur Kommunikation benötigt. Die Programmierung erfolgt über die Arduino- Oberfläche[6]; durch Verwendung frei zur Verfügung stehender Softwarebibliotheken ist die Programmierung sehr einfach. An dieser Stelle soll nicht auf Einzelheiten der Software eingegangen werden[7].
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 |
#include "pinDefinitions.h" #include "si5351_lite.h" /* "quarzersatz" Version: ..\Si5351_vfo_terminal_v41.ino vom 10 jan 2018 NNNNNNNNa : Frequenzeingabe NNNNNNNN in Hertz xd : Drive ( 0= 2mA, 1= 4mA, 2= 6ma, 3= 8mA) ? : Display Version und aktuelle Daten */ #define FREQUENZ 63.950 //++++++++++++++++++++++++++++++++++++++++++++ #include <SoftwareSerial.h> SoftwareSerial mySerial(RX, TX); /* Software Serial benutzt beliebige pins fuer rx und tx und ist kürzer als hardware-"Serial" */ #include "si5351_lite.h" /* lite version ist wesentlich kuerzer als die offizielle si5351 version von adafruit */ si5351_lite si5351; #define STARTFREQUENZ FREQUENZ*1e6 #define STARTDrive 0 /* 2mA */ unsigned long serial_input_number; const bool OK = true; #include <EEPROM.h> const int EEPROM_STARTADRESSE = 0; const unsigned long MAGIC_CODE = 0x12345678L; // magic code struct eeprom_datensatz { unsigned long frequenz; unsigned char drive; unsigned long identifier; }; eeprom_datensatz eeData; //////////////////////////////////////////////////////////////// void setup() { mySerial.begin(9600); displayVersion(); si5351.init(); EEPROM.get(EEPROM_STARTADRESSE, eeData); if ( eeData.identifier == MAGIC_CODE ) // magic code ok { //frequenz aus eeprom ok -> einstellen } else { eeData.frequenz = STARTFREQUENZ; eeData.drive = STARTDrive; eeData.identifier = MAGIC_CODE; EEPROM.put(EEPROM_STARTADRESSE, eeData); } setNewData(&eeData); display(); } //////////////////////////////////////////////////////////////// void loop() { eingabeInterpreter(); } //////////////////////////////////////////////////////////////// // interpretiert zeichen von der seriellen schnittstelle // a) input : ziffern fuer die frequenz in hertz mit abschliessendem 'a' // e.g.: 7033000a // 7.033 MHz // b) '?' // display aktuelle frequenz void eingabeInterpreter() { char c; //Check for character if (mySerial.available() > 0) { c = mySerial.read(); switch (c) { case 'd': case 'D': if ( serial_input_number > 3 ) { serial_input_number = 0; mySerial.print(F("wrong number, try again ")); } else { eeData.drive = serial_input_number; serial_input_number = 0; //drive neu einstellen: setNewData(&eeData); EEPROM.put(EEPROM_STARTADRESSE, eeData);//write eeprom display(); } break; case 'a': //option a case 'A': if ( serial_input_number > 0xfffffffeL ) { serial_input_number = 0; mySerial.print(F("wrong number, try again ")); } else { eeData.frequenz = serial_input_number; serial_input_number = 0; //frequenz neu einstellen: setNewData(&eeData); EEPROM.put(EEPROM_STARTADRESSE, eeData);//write eeprom display(); } break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': // eingabezahl ansammeln serial_input_number = serial_input_number * 10 + (c - '0'); break; case '?': displayHilfe(); serial_input_number = 0; break; } mySerial.flush(); } } //////////////////////////////////////////////////////////////// static void displayHilfe() { mySerial.println(F("\n\n\n\n")); displayVersion(); mySerial.print(F("aktuelle Daten:\n")); display(); mySerial.println (F("NNNNNNNNa : Frequenzeingabe NNNNNNNN in Hertz ")); mySerial.println(F(" xd : Drive ( 0= 2mA, 1= 4mA, 2= 6ma, 3= 8mA")); mySerial.println (F(" ? : Display Version und aktuelle Daten")); } //////////////////////////////////////////////////////////////// static void displayVersion() { mySerial.print(F("Version: ..")); char *s; s = strrchr(__FILE__, '\\'); mySerial.println(s); mySerial.println(F("vom " __DATE__ " " __TIME__)); } //////////////////////////////////////////////////////////////// static void display() { mySerial.print(F( "frequenz= ")); mySerial.print( eeData.frequenz ); mySerial.println(F( " Hertz")); mySerial.print(F( "Drive= ")); mySerial.print( ( eeData.drive + 1) * 2 ); mySerial.println(F( " mA")); } //////////////////////////////////////////////////////////////// void setNewData(eeprom_datensatz *ee) { si5351.setDrive( 0, ee->drive); si5351.setfreq( 0, ee->frequenz); } |
Die Frequenz wird über ein Terminal z.B. Hyperterminal eingegeben, so dass der Benutzer so wenig wie möglich mit der Prozessor-Programmierung zu tun hat. Die einmal eingestellte Frequenz wird im EEPROM gespeichert; beim Neustart des Prozessors wird mit der gespeicherten Frequenz ‚gebootet‘. Der USB-Serial-Adapter wird später nicht mehr benötigt.
Ausblick
Wer es ganz klein haben will, kann statt eines Arduino- Moduls einen ATTINY-85 als 8-Pin-DIL Prozessor nehmen; die Software ist dafür vorgesehen. Vom Preis her hat das jedoch keine Vorteile, da die Arduino-Nano- Module ab 2 Euro in China zu kaufen sind. Der digitale Oszillator kann etwa von 150 kHz bis 120 Mhz programmiert werden und kann drei verschiedene Frequenzen gleichzeitig erzeugen. Interessante aktuelle Anwendungen findet man beim QRP-Labs QCX-Transceiver[8] und beim Projekt uBitx- Transceiver[9].
Referenzen:
[1] Experiment : http://dk2jk.darc.de/arduino/swt2016/digitaler-oszillator.html
[2] Datenblatt : https://www.silabs.com/documents/public/data-sheets/Si5351-B.pdf
[3]Si5351Modul : http://www.qrp-labs.com/synth.html
[4]Si5351Modul : https://www.adafruit.com/product/2045
[5] Arduino Mini : https://www.adafruit.com/product/2378
[6] Arduino : https://www.arduino.cc
[7] Software zum Projekt : http://dk2jk.darc.de/arduino.html#quarzersatz
[8] Qrp_Labs : http://www.qrp-labs.com/qcx.html
[9] uBitx : http://www.hfsignals.com/
März 2018
Heribert Schulte, DK2JK
Günter Schweppe , DK5DN
Du muss angemeldet sein, um einen Kommentar zu veröffentlichen.