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.

Schaltbild
Abb.1: Schaltbild

 

Probeaufbau
Abb. 2: Probeaufbau

Umbau der Quarzplatine: links Original, rechts Umbau zur Fremdspeisung. Der 1k Widerstand dient zur Umschaltung der Quarz-Steckplätze.

Umbau am Funkgerät
Abb. 3:Umbau am Funkgerät

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.

Einbau ins Funkgerät
Abb. 4: Einbau ins Funkgerät

Ü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].

#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

Quarzersatz durch Digitalen Oszillator (von DK2JK und DK5DN)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert