1Hz-Taktgeber mit (Schwing-)Quarz

Wenn man beispielsweise eine digitale Uhr bauen möchte, benötigt man einen zuverlässigen (Sekunden-)Takt mit der Frequenz von 1Hz. Eine Umsetzung mit dem NE555 wäre zu ungenau, denn die zeitgebenden Komponenten (Widerstände und Kondensatoren) variieren ebenso wie der NE555 selbst abhängig von der Umgebungstemperatur. Daher wird auf einen Schaltkreis mit einem (Schwing-)Quarz zurückgegriffen, der auf der Pierce-Schaltung basiert.

Schwingquarz mit 32,768kHz Frequenz

Verwendete Bauteile

Funktionsweise

Schwingquarze erzeugen einen Oszillator mit einer bestimmten Frequenz in hoher Genauigkeit, sobald eine Spannung angelegt wird. Meist sind diese Schwingungen jedoch im Bereich kHz oder MHz. Für unser Signal benötigen wir jedoch eine Frequenz von 1Hz.
Hier wird zunächst der Binärzähler-Chip CD4060 als Frequenzteiler verwendet, so dass an seinem Q14-Ausgang ein 2Hz-Signal anliegt. Weiter lässt sich die Original-Frequenz von 32768kHz des Quarzes nicht teilen. In einer weiteren Stufe wird der Zähler CD4518 verwendet, um diese 2Hz in ein 1Hz-Signal umzuwandeln.

CD4060

Der IC CD4060 ist ein 14-stufiger, binärer Ripple-Carry-Zähler/Teiler mit Oszillator, der meist in dem DIP-16 Gehäuse schon seit 1968 auf dem Markt ist. Er bietet die Möglichkeit, neben einen Taktgenerator für RC-Glieder auch ein Schwingquarz zu verwenden. Dessen Signal geht auf einen 14-stufigen Teiler, wobei 10 Teilerstufen nach außen geführt sind.

Anschlüsse

Anschlüsse des CD4060
VDD 3V (abhängig vom IC auch mehr)
VSS / GND Masse
Q4 – Q14 Ausgänge der Teilerstufen
RESET (auch: MR) ("Master Reset") Setzt den Takt und die Teilerstufen zurück, sobald ein HIGH-Signal anliegt
1 [#11] (auch: Clock) Externes Taktsignal für den Teiler (RC-Stufe oder Schwingquarz)
0 [#10] (auch: ExtR) Widerstand der RC-Kombination
0 [#9] (auch: ExtC Kondensator der RC-Kombination

CD4518

Der IC CD4815 ist ein dualer BCD-Zähler Baustein in einem DIP-16 Gehäuse. Es können also unabhängig voneinander zwei Taktsignale hochgezählt werden.

Anschlüsse

Anschlüsse des CD4518
VDD Spannungsversorgung (3V)
VSS / GND Masse
Enable A Aktiviert Zähler A
Enable B Aktiviert Zähler B
Reset A Setzt Zähler A zurück
Reset B Setzt Zähler B zurück
Clock A Eingangs-Takt für Zähler A
Clock B Eingangs-Takt für Zähler B
Q1A, Q2A, Q3A, Q4A BCD-Ausgänge für Zähler A
Q1B, Q2B, Q3B, Q4B BCD-Ausgänge für Zähler A

Aufbau der Schaltung

Im ersten Schaltplan ist der Aufbau des Quarz-Oszillators mit dem CD4060 gezeigt, der an seinem Ausgang (Q14) zunächst das 2Hz-Signal generiert. Dies wird durch eine blaue LED visualisiert:

Schaltung mit Schwingquarz und CD4060

Hinweis: Obwohl in den meisten Datenblättern eine Betriebsspannung von bis zu 15V angegeben wird, hat die Schaltung bei mir nicht mit einer 9V-Batterie funktioniert. Eine 3V-Knopfzelle hat einwandfrei funktioniert. Vermutlich lag es aber daran, dass ein Schwingquarz höchstens mit einer Leistung von ca. 1µW belastet werden darf, um zu schwingen, ansonsten bleibt er "stehen"

Schaltung mit CD4518

Das Signal an CLOCK des ersten Schaltplans wird mit dem Eingang CLOCK/A des CD4518 verbunden und sollte dann ein stabiles 1Hz-Signal am Ausgang Q1A ergeben. Dies wird hier mit einer roten LED visualisiert.

Aufbau des 1Hz-Taktgebers auf dem Breadboard
Abb.: Aufbau des 1Hz-Taktgebers auf dem Breadboard

Resultat

Wenn die Schaltung richtig aufgebaut wurde, dann sollte die blaue LED am Ausgang des CD4060 im 2Hz-Takt und die rote LED am Ausgang des CD4518 im 1Hz-Takt blinken wie im folgenden Video gezeigt:

Video: Demonstration des 1Hz-Taktgebers

Messung des Taktes

Um die Genauigkeit und Stabilität des Taktsignals zu überprüfen, habe ich den 1Hz-Ausgang mit einem digitalen Eingang (hier: D7) eines Arduino Uno verbunden und den Taktgeber direkt über den Arduino mit 3,3V mit Spannung versorgt. (Alle anderen externen Spannungsquellen entfernen!)
Der folgende Sketch misst die Differenz zwischen zwei Takten in einer Genauigkeit von Mikrosekunden und gibt diese auf der seriellen Konsole aus:

#define PIN_CLOCK 7

long lastClockValue = 0, clockValue = 0;
byte oldClockState = 0, clockState = 0;

void setup()
{
    lastClockValue = micros();
    clockValue = lastClockValue;
    pinMode(PIN_CLOCK, INPUT_PULLUP);
    Serial.begin(9600);
}

void loop()
{
    clockState = digitalRead(PIN_CLOCK);
    if (clockState != oldClockState) {
        oldClockState = clockState;
        clockValue = micros();
        Serial.println(clockValue - lastClockValue);
        lastClockValue = clockValue;
    }
}
Ausgabe auf der seriellen Konsole der Arduino-IDE
Abb.: Ausgabe der Differenz der Taktsignale in Mikrosekunden auf der seriellen Konsole der Arduino-IDE

Das Signal scheint recht stabil zu sein, ist aber meist um 20µs zu kurz, was aber dennoch einer Genauigkeit von 99,996% entspricht.

zurück