Test elektronischer Funkuhren-Module (DCF77) am Mikroconcroller

Aus ISSB Wiki
Wechseln zu: Navigation, Suche

In der heutigen Zeiten verfügt fast jeder Computer und auch fast jedes Smartphone über Verbindung zum Internet. Durch günstige Prepaid-Karten und den Einsatz entsprechender GSM-Module ist es auch möglich, Geräte, die mit Sensoren ausgestattet sind, an besonderen Stellen in freier Natur zu platzieren, um dort beispielsweise Wetterdaten oder andere Werte über längere Zeit aufzunehmen.

Wichtig für die Aufnahme von Sensordaten ist dabei die richtige Uhrzeit. Besteht die Verbindung zum Internet, können verschiedene Zeitserver abgefragt werden, um die genaue Uhrzeit auf dem Gerät zu beziehen.
Wird jedoch die Internetverbindung unterbrochen, kann eine vorhandene Echtzeituhr (RTC - real time clock) die Aufnahme durch Lieferung der Zeitdaten retten. Fällt die Internetverbindung jedoch länger aus, muss die RTC nachjustiert werden. In dem Fall ist die Funkuhr die richtige Wahl, um die RTC nachzustellen.

Das langwellige DCF77-Funkuhrensignal kann in Mitteleuropa auf 77kHz empfangen werden und wird in Deutschland (Mainhausen - Nähe Frankfurt a. M.) ausgetrahlt.
Es ist über weite Strecken vor allem in freier Natur und auch in geschlossenen Gebäuden gut empfangbar.

Test der DCF-Module

Getestet werden hier unabhängig von Preis und Hersteller vier verschiedene Funkuhr-Module (DCF77). Unterschieden werden die DCF-Module am Namen der Hauptlieferanten. Es handelt sich hierbei um die Module:

  • DCF77-Modul von Reichelt
  • DCF-Modul von Conrad
  • DCF2-Modul von ELV
  • DCF1-Modul von Pollin

Verwendung eines Mikrocontrollers

Fritzing - DCF-Modul hier mit Pullup-Widerstand

Für den Test der DCF77-Module wird ein Mikrocontroller verwendet, der die Signale des DCF-Modules auswertet. Hier wird Arduino Mini Pro 3,3V 8MHz verwendet. Die Version 3,3V eignet sich am besten für den Batteriebetrieb mit einer 3,7V-Zelle, die auch aufladbar ist.

Auch die steuerbaren Anschlüsse (GPIO-Pins) des Einplatinencomputers Raspberry Pi arbeiten intern mit 3,3V. Demzufolge wäre der Betrieb aller hier getesteten DCF77-Module auch ohne zusätzliche Treiberstufen oder Pegelumwandler mit direktem Anschluss an einen GPIO-Pin des Raspberry Pi möglich.

Anschluss am Mikrocontroller

Um bei Eintritt der Flanken sofort zu reagieren, wird Interrupt 0 genutzt.
Am Mikrocontroller Arduino Mini Pro befindet sich der für Interrupt 0 vorgesehene Anschluss an D2. Also wird der Signalausgang des DCF-Moduls am Anschluss D2 des Mikrokontrollers Arduino Mini Pro angeschlossen.

Als Betriebsspannung wird hier ausschließlich der 3,3V-Anschluss des Arduino Mini Pro (VCC) genutzt. Einige DCF-Module funktionieren auch mit höherer Betriebsspannung. Jedoch wird hier nur für den Batteriebetrieb mit einer 3,7V-Zelle getestet.

DCF-Modul von Reichelt

DCF-Modul von REichelt von der Leiterbahnseite aus gesehen

Es gibt außer den Anschlüssen VCC, GND und Signal noch einen Aktivierungsanschluss PON.
Wie man auf dem Foto sehen kann, ist der Anschluss PON und GND bereits verbunden, so dass das Modul bei Anlegen der Betriebsspannung aktiviert ist.

Anschlüsse: "-" des DCF-Moduls an GND des Mikrocontrollers, "+" an VCC (3,3V) und "Sig" an D2. Der Anschluss PON bleibt frei.

Beim DCF-Modul von Reichelt braucht oder besser sollte kein Pullup-Widerstand eingesetzt werden. Der Signalausgang liefert dem Mikrocontroller auch ohne diesen Widerstand ein gutes LOW/HIGH-Verhältnis. Wird ein Pullup-Widerstand eingesetzt, der kleiner gleich 20kOhm ist, dann liegt der LOW-Pegel über dem Schwellwert des Triggers des Mikrocontrollers. Somit würden keine Signalflanken mehr erkannt werden, da trotz fehlerfreiem Signal nur noch HIGH anliegt.

DCF-Modul von Conrad

DCF-Modul von Conrad - Anschlüsse

Dieses Modul besitzt zusätzlich zum Signalausgang einen weiteren Ausgang für das invertierte Signal. Dieser wird in diesem Test nicht benötigt.

Der Signalausgang ist laut Datenblatt von Conrad ein Open-Collector-Ausgang, was bedeutet, dass hier ein Pullup-Widerstand notwendig ist. Am hochohmigen Dateneingang des Arduino-Mikrocontrollers ist laut Beschreibung ein Widerstand von ca. 20-50 kOhm ein günstiger Wert für einen Pullup-Widerstand. Ohne einen Pullup-Widerstand bleiben die Signale (HIGH-Flanken) nahezu auf 0, also unter dem Schwellwert des Triggers.

Hier wird ein 30kOhm-Pullup-Widerstand eingesetzt.

Anschlüsse: "-" auf GND, "+" auf VCC und Sig auf D2 des Mikrocontrollers.
Ein Pullup-Widerstand von ca. 20-50 kOhm wird von Sig nach VCC (3,3V) verbunden.

Wenn das Modul in ein kleines Gerät eingebaut wird, welches nur wenig Platz zur Verfügung hat, stellt der verhältnismäßig große Schraubanschluss einen sichtbaren Nachteil dar. Der Schraubanschluss kann jedoch ausgelötet werden.

DCF-Modul von ELV

DCF-Modul von ELV

Anschlüsse: "-" auf GND, "+" auf VCC (3,3V) und Sig auf D2 des Mikrocontrollers.

Laut Datenblatt von ELV ist der Anschluss Sig ebenfalls ein Open-Collector-Ausgang. Demzufolge muss auch hier ein Pullup-Widerstand verwendet werden.
Der Pullup-Widerstand wird zwischen Sig und VCC (3,3V) verbundenen und beträgt zwischen 20-50kOhm.

Zusätzlich empfiehlt ELV noch einen Kondensator mit einer Kapazität von 10nF, der zwischen Sig und GND geschaltet wird, damit das Signal von nachgeschalteten Mikrocontrollern erkannt wird.
Im Test mit Arduino Mini Pro spielte der Kondensator keine erkennbare Rolle.

DCF-Modul von Pollin

Der Anschluss PON ist nicht mit GND verbunden

Anschlüsse: "-" und "PON" auf GND, "+" auf VCC (3,3V) und Sig auf D2 des Mikrocontrollers.

Der Anschluss PON ist auf dem DCF-Modul nicht mit GND verbunden und muss explizit an GND angeschlossen werden, damit das Modul aktiviert wird.
In manchen Dokumentationen steht geschrieben, dass die Aktivierung des Moduls eine Flanke von HIGH nach LOW benötigt. Das konnte hier nicht nachvollzogen werden. Die feste Verbindung des Anschlusses PON nach GND bei Start des Moduls reichte in einem Test für die Aktivierung aus.

Ein Pullup-Widerstand wird hier ebenfalls nicht benötigt, denn auch ohne den Pullup-Widerstand liegen die Pegel des High-Levels (nahezu VCC) weit über dem Schwellwert des Triggers des Mikrocontrollers und die Pegel des LOW-Levels nahezu auf 0.

Test-Programm für den Mikrocontroller

Hier wird der mit der weiter unten genannten Bibliothek mitgelieferte Beispiel-Code InternalClockSync leicht modifiziert, so dass die interne LED des Arduino Mini Pro (mit D13 verbunden) den Erfolg des erkannten DCF-Signals anzeigt.

DCF-Bibliothek

Um nicht Code für die Auswertung der DCF-Signale erneut zu schreiben, sondern mittels einer Bibliothek bereits getesteten Code einzusetzen, wird die Bibliothek DCF77 verwendet.

Herunterladen und Installation der DCF77-Bibliothek wird auf den entsprechenden Webseiten ausführlich beschrieben.

Arduino-Sketch für den Mikrocontroller

Der Entwickler der DCF77-Library hat für seine Tests ca. 2 Minuten für die erfolgreiche Signal-Erkennung ermittelt.
Vorab: In diesen Tests wurde die kürzeste Erkennungszeit mit ca. 2,5 Minuten festgestellt.
Die Signalerkennung hängt auch stark von den gegebenen Wetterbedingungen (Bewölkung), umgebenden elektromagnetischen Feldern und Hindernissen, wie beispielsweise Betonwände geschlossener Räume ab.

#include "DCF77.h"
#include "Time.h"

#define DCF_PIN 2	         // Connection pin to DCF 77 device
#define DCF_INTERRUPT 0		 // Interrupt number associated with pin
#define PIN_LED	13

//time_t time;
DCF77 DCF = DCF77(DCF_PIN, DCF_INTERRUPT);
// wurde ein gueltiges Signal gefunden
bool g_bDCFTimeFound = false;

void setup() 
{
  pinMode(PIN_LED, OUTPUT);
  Serial.begin(9600); 
  DCF.Start();
  Serial.println("Waiting for DCF77 time ... ");
  Serial.println("It will take at least 2 minutes until a first update can be processed.");
}

void loop() 
{
//  delay(950);
  // das Signal wird nur aller 5 Sekunden abgefragt
  delay(5000);

  digitalWrite(PIN_LED, HIGH);
  delay(50);
  digitalWrite(PIN_LED, LOW);

  time_t DCFtime = DCF.getTime(); // Check if new DCF77 time is available
  if (DCFtime != 0)
  {
    Serial.println("Time is updated");
    setTime(DCFtime);
    g_bDCFTimeFound = true;
  }
  
  // die Uhrzeit wurde gesetzt, also LED nach kurzer Zeit ein
  if (g_bDCFTimeFound)
  {
    delay(50);
    digitalWrite(PIN_LED, HIGH);
  }	
  digitalClockDisplay();  
}

void digitalClockDisplay()
{
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(" ");
  Serial.print(month());
  Serial.print(" ");
  Serial.print(year()); 
  Serial.println(); 
}

void printDigits(int digits)
{
  // utility function for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

Hochladen des kompilierten Codes zum Mikrokontroller

Arduino Software - Auswahl des Mikrocontrollers

Für das Hochladen des kompilierten Codes wird bei Mikrocontrollern ohne USB-Anschluss, wie Arduino Mini Pro ein FTDI-Adapter benötigt.
Mittels Arduino Software wird der Code kompiliert, gelinkt und als Binärcode zum Mikrocontroller hochleladen.

Start des Serial Monitors

Die serielle Arduino-Konsole

Nach erfolgreichem Hochladen des binären Codes zum Mikrocontroller sorgt der FTDI-Adapter für das notwendige, automatische Reset und startet den Mikrocontroller mit dem eben erhaltenen Programm neu.

Danach wird der Serial Monitor manuell gestartet.

Gleich nach dem Start des Testprogramms sammelt die DCF77-Bibliothek Signalflanken in ihrem internen Buffer, um sie auszuwerten.
Außerdem blinkt die interne LED des Arduino kurz auf.

Erkennung der Zeit-Signale

Die hier aufgeführten Testergebnisse wurden in einem geschlossenen Gebäude mitten in einer Großstadt ermittelt.

DCF-Modul von Reichelt

Interpretation als Zeitsignal nach ca. 2 Minuten

Wird das eintreffende Signal als vollständiges Zeitsignal erkannt, gibt die Konsole die aktuelle Uhrzeit (inkl. Datum) aus. Das Blinken der LED besteht nun aus dem langen Aufleuchten und der kurzen Pause.

Wie an der Ausgabe des Serial-Monitors zu erkennen ist, hat die Signalerkennung eine Zeit von ca. 2,5 Minuten in Anspruch genommen.
Ein anderer Test am Vortag ergab eine Zeit von ca. 4 und auch 10 Minuten für die erfolgreiche Signalerkennung mit dem "Reichelt-DCF-Modul".

Saubere Signale am DCF77-Modul von Reichelt

DCF-Modul von Conrad

DCF-Modul von Conrad - Signal erkannt

Der Test des DCF-Moduls von Conrad ergab eine Zeit von ebenfalls ca. 2 Minuten für die Signalerkennung.
Ein Test am bewölkten Vortag ergab eine Zeit von ca. 12 Minuten für die Signalerkennung.

DCF-Signale am Conrad-Modul

Durch Einsatz des Pullup-Widerstands liegt der Pegel des HIGH-Levels nahezu auf VCC-Level (3,3V).

DCF-Modul von ELV

Der Signalausgang des DCF-Moduls von ELV gibt das invertierte DCF-Signal aus.

DCF-Modul von ELV - Es scheint sich um das invertierte Signal zu handeln

Um auch negierte Signale durch die DCF77-Bibliothek richtig zu interpretieren, ist im Konstruktor des DCF77-Objektes ein weiterer Parameter vorgesehen, der im Normalfall mit einem Standard-Wert (true) belegt ist.
Soll nun nicht die steigende, sondern die fallende Flanke als Puls-Start berücksichtigt werden, wird der dritte Parameter mit false belegt.

Es wird folgende Änderung im Code vorgenommen.

// DCF77 DCF = DCF77(DCF_PIN, DCF_INTERRUPT);
// für das DCF-Modul von ELV
DCF77 DCF = DCF77(DCF_PIN, DCF_INTERRUPT, false);

Der Code wird erneut zum Mikrocontroller hochgeladen und der Serial Monitor erneut gestartet.

Eine andere Möglichkeit ist der zusätzliche Einbau eines Inverters in Form eines Transistors, der das negierte Signal nochmals negiert.

DCF-Modul von ELV - Signalerkennung

Im Serial Monitor ist zu erkennen, dass auch dieses Modul das Signal nach ca. 2,5 Minuten als Zeitsignal interpretieren konnte.
Der Test am Vortag ergab eine Zeit von ca. 16 Minuten.

DCF-Modul von Pollin

DCF-Modul von Pollin - Signalerkennung

Die Signalerkennung mit diesem Modul ergab die Zeit von ebenfalls ca. 2,5 Minuten.
Der Test am Vortag hat ergeben, dass das Zeitsignal nicht innerhalb 40 Minuten erkannt wurde.
Der Test an einem anderen bewölkten Tag ergab eine Zeit von ca. 20 Minuten für die Signalerkennung.

DCF-Signale am Pollin-Modul

Zusätzliche Hinweise

Ausrichtung der DCF-Antenne

Während der Tests mit den verschiedenen Modulen und auch verschiedenen Versionen an Mikrokontrollern wurde festgestellt, dass unter Umständen kein Signal erkannt wird.

  • Der Anschluss der Module an einer 3,3V-Stomversorgung und an einem 5V-Mikrocontroller (Arduino Mini Pro 5V, 16MHz) hat trotz gleicher oben genannter Randbedingungen ein viel schlechteres Ergebnis für die Signalerkennung ergeben. Obwohl die HIGH-Pegel über dem Schwellwert des Triggers eines 5V-Mikrocontrollers lagen, konnten die Signale einiger DCF-Module nicht als gültige Zeit-Daten erkannt werden.
  • Die Stromversorgung sollte keine Spannungsschwankungen aufweisen. Tauchen Spannungsspitzen auf, die ungeglättet zum DCF-Modul gelangen, dauert die Signalerkennung wesentlich länger als die oben genannte.
  • Die Datenleitung vom DCF-Modul zum Mikrocontroller sollte so kurz wie möglich gehalten werden, um zusätzliche Störungen durch umliegende elektromagnetische Felder gering zu halten.
  • In der Beschreibung des DCF-Moduls von ELV gibt es den Hinweis, dass die Antenne eine bestimmte Ausrichtung benötigt (siehe Bild). Das gilt sicherlich für alle DCF-Module.