Pfad: Home => AVR-Übersicht => Anwendungen => DCF77-Empfänger => AGC/AFC/Decoder    LinkThis page in english: Flag EN
DCF77-Empfang Anwendungen von
AVR-Einchip-Prozessoren AT90S, ATtiny, ATmega und ATxmega
DCF77-Controller mit ATtiny45
Logo

5 DCF77-Controller mit ATtiny45

Damit der Uhren-Anwender nicht mit zwei Potentiometern ständig die Frequenz und die Verstärkung seines Geradeausverstärkers, bzw. seiner ZF beim Superhet, justieren muss, wurde dieser Controller entwickelt: er beobachtet das gleichgerichtete AM-Signal vom Ausgang des Geradeaus- oder Superhet-Empfängers und verstellt laufend
  1. die Frequenz des Eingangskreises, so dass die Amplitudenabsenkung ihren maximalen Umfang einnimmt,
  2. die Verstärkung des regelbaren Verstärkers, so dass dieser weder wegen zu hoher Verstärkung rückkoppelt oder wegen zu niedriger Verstärkung die Gleichrichterstufe verhungern lässt.
Und weil er dazu sowieso laufend das Geschehen am Gleichrichter beobachten muss, kann er auch gleich daraus Damit er zum Anzeigen des Ganzen nicht auch noch eine eigene LCD benötigt, sendet er alle diese Infos über ein serielles Interface an die eigentliche Uhr, die bei Bedarf auch noch Anderes vollführen kann (wie z. B. das Ein- und Ausschalten von Lampen und anderen Großgeräten, das Einstellen der Zeit, wenn DCF77 mal gerade wegen Gewitter offline ist, das Einstellen einer Weckzeit und Weckmelodie, u.v.a.m.). Die Uhr braucht sich dann um all das DCF77-Gewese nicht kümmern, sie kriegt die Uhrzeit und das Datum mundgerecht geliefert und kann damit anfangen, was sie will.

5.1 Eigenschaften

Damit der Controller das alles vollführen kann, ohne sich zu verheddern, ist ein ausgeklügeltes Assemblerprogramm nötig. C-Programmierer können hier schon mal aufgeben, denn das Monster mit seinen Dutzenden Bibliotheken passt weder in einen ATtiny85 mit seinen 4.096 Instruktionsworten im Flash und noch weniger in einen ATtiny45 mit nur 2.048 Worten. Schon die Fließkomma-Bibliothek zur Berechnung des Durchschnitts aus 140 eingegangenen Messungen lastet den Tiny85 alleine aus (mal davon abgesehen, dass dazu gar nicht die Zeit bis zum Eintreffen des nächsten Messwerts ausreicht). Es sind auch gar keine Fließkomma-Operationen nötig, denn für die Durchschnittsberechnung reicht das einfache Aufsummieren und eine popelige 16*8-Bit-Multiplikation mit 24-Bit-Ergebnis (von denen 15 Bits einfach ignoriert werden) in weniger als 100 Prozessortakten völlig aus (und das kann der versierte Assembler-Programmierer im Schlaf).

Damit nach dem Einschalten der Uhr (wofür beim Batterie- oder Akkubetrieb wegen des etwas höhren Strombedarfs eine Ein- und Ausschaltprozedur sinnvoll ist) alle Aufgaben erfüllen kann, ist eine umfangreiche "Aufwärmphase" nötig. Die läuft in folgenden Phasen ab:
  1. Der AGC- und der AFC-Ausgang werden beide auf 5 V eingestellt und eine Viertel Sekunde lang abgewartet, bis die beiden PWM-Spannungen stabil sind. Mit den Default-Bauteilen verläuft diese Kurve so:

    Anfangskurve des AFC-Scans

    Das reicht bis zum Erreichen der Anfangsbedingungen eindeutig aus. Wie man sieht, nimmt das PWM-Ripple auf dem ersten Kondensator (Kurve UC1) mit abnehmendem PWM-Wert zu, die zweite Stufe hat noch etwas, aber schon niedrigeres Ripple.
  2. Der AGC-Wert wird dann im Zeitabstand von 0,25 Sekunden um jeweils acht Stufen verringert. Hier der Zustand nach 2,1 Sekunden und vier weitere Verringerungen danach.

    Fortgeschrittener Scan

    Das Ripple am ersten Kondensator liegt jetzt bei 0,9 Vpp, am zweiten bei 0,2 Vpp und am dritten Kondesator bei 31 mVpp. Wie man sieht, ist der 0,25-Sekunden-Rhytmus ausreichend zur stabilen Einstellung der Spannung am dritten Kondensator.
  3. Die Resonanzfrequenzen der Ferritantenne, die sich aus den eingestellten Spannungen bei diesem Scan ergeben, sind für den Fall mit einer großen Spule (L=9,58 mH, C=330 pF, zwei Varaktordioden antiparallel) und für eine kleine Spule (L=1,5 mH, C=2,2 nF, drei Varaktordioden parallel) im folgenden Diagramm dargestellt.

    Scan-Resonanzfrequenzen

    Wie man sieht, ändert sich die Resonanzfrequenz des Eingangskreises bei dieser Scan-Geschwindigkeit sehr gleichmäßig, die PWM-Stufen sind nicht mehr zu erkennen und die DCF77-Empfamgsfrequenz wird gut abgedeckt.
  4. Während dieses Scans werden die Gleichspannungswerte vom Ausgang des Gleichrichters für jeweils zwei Sekunden lang gemessen und Minima und Maxima daraus ermittelt. Überschreiten dabei einzelne Messwerte 2,5 Volt oder unterschreiten diese 0,5 V, dann wird der AGC-PWM-Wert um jeweils acht Stufen erhöht bzw. abgesenkt und die Messzeit neu begonnen. Der eingestellte AGC-Wert sowie die Differenz aus der Messung über eine Sekunde werden als zwei 8-Bit-Zahlen in einer Tabelle im SRAM abgelegt.
  5. Unterschreitet der Spannungsscan 1,0 Volt (PWM=1,0 / 5,0 * 256 = 51), dann wird die Suche abgebrochen. Das ergibt 26 einzelne Scan-Messwerte, die in einem Bereich des SRAM abgelegt sind.
Die weitere Auswertung dieser Scan-Messungen erfolgen folgendermaßen. In der Tabelle wird nach dem Eintrag mit der höchsten Spannungsdifferenz gesucht. Die beiden Werte für diesen Eintrag werden am AFC- und am AGC-PWM eingetragen. Diese werden erneut über zwei Sekunden hinweg auf ihre Maxima und Minima hin untersucht. Liegt die Differenz unter 0,1 V (Delte = 0,1 / 5,0 * 256 = 5), dann liegt kein auswertbares Signal vor. Der Eintrag in der Tabelle wird dann gelöscht und nach dem nächstniedrigen Differenzbetrag gesucht. Ist kein brauchbares Signal identifiziert worden, beginnt der Scan neu.

Ist die Maximumdifferenz identifiziert, dann wird um diese herum mit 16 Einzelmessungen zu je einer Sekunde Dauer die PWM-Einstellung gesucht, die zur Maximaldifferenz führt. Diese AFC- und AGC-Werte werden eingetragen und der Scan ist beendet.

Die Frequenzeinstellungsprozedur wird stündlich wiederholt.

Die AGC- und AFC-Werte werden, abwechselnd, laufend an der seriellen Schnittstelle ausgegeben, so dass die DCF77-Anzeige diese Näherung mitbekommt und z. B. aus dem AGC-Wert, nach dem Eingang der Synchronisationsmeldung, eine S-Meter-Darstellung der aktuellen Empfangsstärke erstellen kann.

5.2 Schaltung

DCF77 Controller Schaltbild Das hier ist das Schaltbild des Controllers mit ATtiny45 oder ATtiny85.

Zwei PWM-Ausgänge, OC1A und OC1B, erzeugen die PWM-Signale für die AGC- und AFC-Signale. Beide PWMs nutzen die im ATtiny45 vorhandene Möglichkeit, High-Speed-Signale zu erzeugen. Dazu wird das Taktsignal für den 8-Bit-Counter/Timer TC1 mit 64 MHz, geteilt durch 8, verwendet. Das ergibt eine PWM-Taktfrequenz von 31,25 kHz. Die beiden Ausgänge werden mit einem zweistufigen RC-Filter aus 10k und 1µF geglättet. Diese Dimensionierung stellt sicher, dass die erzeugten Analogspannungen weniger als eine Sekunde benötigen, um der geänderten PWM-Einstellung zu folgen.

Das gleichgerichtete und mit einer Zeitkonstanten von 0,01 ms geglättete AM-Gleichspannungssignal wird am Analogwandler ADC3 zugeführt. Getaktet vom TC0-Timer-Overflow wird das Analogsignal alle 16,4 ms gemessen. Das ergibt bei einer von DCF77 gesendeten Null (AM-Amplitudenabsenkung für 100 ms lang) etwa sechs, bei einer Eins etwa 12 Messungen. Zwei Sekundensignale, z. B. eine Null und eine Eins, plus die Zeit für ein ausbleibendes Sekundensignal bei einem Minutenwechsel ergeben eine Zeitdauer von 3 Sekunden, was bei der gewählten Taktung 183 Messungen entspricht. Die Ablage einer solchen Abfolge im SRAM, um daraus Maximum, Minimum und Mittelwert zu ermitteln, erfordert daher mindestens 183 Bytes SRAM, weshalb der ATtiny25 für diese Aufgabe nicht ausreicht.

Aus den Amplitudenschwankungen am ADC3-Eingang wird auch die gesamte Zeit- und Datumskodierung von DCF77 ermittelt, so dass keine weiteren RC-Filter für die Dekodierung erforderlich sind. Zur Funktionsweise siehe das Kapitel zur Funktionsweise.

Die serielle Ausgabe der Ergebnisse erfolgt an den Ausgängen PB0 (Data Master) und PB2 (Clock Master). Da keine Rückwärtskommunikation nötig ist, sind die beiden Signale dauerhaft Master. Die beiden LEDs sind nur für das Debugging erforderlich und können im finalen Betrieb ersatzlos entfallen, zusammen mit den beiden Widerständen.

Ebenso kann im normalen Betrieb die eingezeichnete ISP6-Schnittstelle entfallen, die nur der Programmierung des ATtiny45 in der fertigen Schaltung dient.

5.3 Funktionsweise

5.3.1 Erzeugung der PWM-Signale

Die beiden Ausgänge OC1A und OC1B erzeugen die PWM-Signale für die AFC- und AGC-Einstellung. Timer TC1 arbeitet dazu im asynchronen Modus: der Taktgenerator von 64 MHz wird in der von mir gewählten Einstellung durch zwei geteilt (Slow-Mode) und mit einem Vorteiler von 8 betrieben. Die Zählerbreite ist auf 8 Bits eingestellt, so dass sich eine PWM-Frequenz von 64 MHz / 2 / 8 / 256 = 15,625 khz oder eine PWM-Periodendauer von 64 µs ergibt.

Das Signal kommt dann zur Filterung der Oberwellen in ein zweifaches RC-Filter mit 10kΩ und 1µF. Das Filter wurde in einem Open-Office Spreadsheet hier simuliert. Beim Einschalten, mit entladenen Kondensatoren ergibt sich das folgende Verhalten.

PWM-RC-Filter zu Beginn und beim Herunterfahren auf Null Die ansteigende Kurve zeigt, dass das RC-Filter nach 0,1 Sekunden weitgehend und nach 0,2 Sekunden seinen Endstand mit voller Aussteuerung erreicht. Das ist schnell genug. Der zweite Kondensator läuft etwas nach, ist aber ebenfalls schnell genug.

Umgekehrt ergibt sich bei einer Pegeländerung der PWM auf Null ebenfalls ein Zeitraum von knapp 0,2 Sekunden, bis die PWM auch dieser erheblichen Änderung gefolgt ist. Auch hier läuft der zweite Kondensator etwas nach, erreicht aber ungefähr ebenso schnell den Endzustand Null.

PWM-RC-Filter bei Pegeländerung Dies hier demonstriert, warum das zweite RC-Glied sinnvoll ist und warum es keineswegs nur schmückendes Beiwerk darstellt. Hier ändert sich der Vollausschlag des PWM-Werts von 255 auf 254. Dass eine der 256 PWM-Stufen auf Null geht verursacht einen Spannungsabfall von ca. 3 mV am Kondensator C1, im weiteren Kurvenverlauf bis zu 4 mV. Davon merkt C2 fast gar nichts.

Auch hier läuft die Spannung an C2 etwas nach, die Anpassung an das neue C1 dauert aber weniger als 5 ms und ist daher schnell genug für die AFC- und AGC-Einstellung.

5.3.2 Messung und Auswertung des AM-Gleichrichtersignals

Analyse der Amplituden Damit die Abtastung des gleichgerichtenen Amplitudensignals in regelmäßigen Abständen erfolgt, wird der ADC vom Overflow des Timers TC0 mittels ADATE gestartet. Der TC0-Vorteiler wird dazu auf 64 gestellt. Der Overflow erfolgt daher nach 1000*64*256/Takt = 16,384 ms. Die Wandlung selbst erfordert bei einem ADC-Taktvorteiler von 128 eine Zeitdauer von 1,664 ms (siehe Sektion Timing im Quellcode).

Das Abholen der einzelnen eingetroffenen Messwerte erfolgt in der ADC-Interrupt-Service-Routine:
  1. es wird nur das High-Byte des ADC-Resultats gelesen (ADLAR aktiviert),
  2. der Messwert wird in einen Dreierpuffer in den Registern rLast geschrieben, der die jeweils drei letzten Messwerte enthält (rLast1 bis rLast3),
  3. der Messwert wird in einem SRAM-Puffer sBuffer abgelegt, der insgesamt 155 Messwerte aufnehmen kann und das Messwert-Geschehen in den letzten 155 * 16,384 ms = 2,54 Sekunden abbildet.
Immer, wenn dieser Puffer voll ist, wird das Bit bBufFull im Flaggenregister rFlag gesetzt. Außerhalb der Interrupt-Service-Routine wird dieses Bit ausgewertet und der gesamte aufgelaufene Puffer nach dem Minimal- und dem Maximalwert abgesucht. Die Differenz aus den beiden gefundenen Extremwerten wird
  1. daraufhin untersucht, ob es die Mindestdifferenz erreicht oder überschreitet. Falls das nicht der Fall ist, wird die Fehlermeldung E0 über die serielle Schnittstelle gesendet (Time-Out) und mit dem Bit bMin im Flaggenregister die weitere Verarbeitung unterbunden,
  2. halbiert und zum Minimalwert addiert, woraus sich ein Mittelwert ergibt. Dieser wird bei der Signalauswertung als Vergleichswert verwendet, ob die Gleichrichterausgangsspannung High oder Low ist.
Zu Beginn, wenn noch wenige Messwerte vorliegen, ist die Auswertung der Einzelmesswerte unterbunden. Dies wird durch das Bit bScan im Flaggenregister signalisiert. Die Initialphase mit der Einstellung der Frequenz- und Verstärkungs-PWM-Werte
  1. durchsucht in 16-er-Schritten die Frequenzeinstellung,
  2. stellt dabei jeweils in 8-er-Schritten die Verstärkung so ein, dass die gemessene maximale Spannung bei 2 V liegt, und
  3. speichert die gemessene Differenz bei jeder dieser Frequenzeinstellungen in einem SRAM-Puffer.
Sind alle 16 Stufen der Frequenzeinstellung durchlaufen, wird diejenige Einstellung mit der höchsten Differenz (maximale Amplitudenschwankung) herausgesucht und in die AFC-PWM geschrieben. Das Bit bScan im Flaggenregister wird gesetzt und damit die Signalauswertung eingeschaltet.

Die weitere Feineinstellung der Frequenz erfolgt ab jetzt und fortlaufend bei jedem Buffer-Voll-Ereignis so:
  1. Der PWM-Wert wird nacheinander um Eins erhöht und danach um Zwei abgesenkt, die daraufhin erzielten Differenzen werden im SRAM-Puffer abgelegt.
  2. Ist die Differenz beim höheren PWM-Wert größer, wird der h&aouml;here PWM-Wert eingestellt.
  3. Ist die Differenz beim niedrigeren PWM-Wert größer, wird der niedrigere PWM-Wert eingestellt.
Die AGC-PWM wird laufend so angepasst: Ist das gemessene Maximum kleiner als 2 V, wird der PWM-Wert abgesenkt (höhere Verstärkung). Ist es größer als 2 V, wird der PWM-Wert erhöht.

Ist bScan gesetzt, erfolgt die Auswertung bei jedem Eintreffen eines Einzelmesswertes so:
  1. Das Bit bHi im Flaggenregister besagt, ob der letzte erkannte Zustand eine hohe Amplitude war.
  2. Ist bHi Eins, wird nach dem Eintreffen einer Amplitudenabsenkung gesucht. Dazu wird geprüft, ob die drei letzten Messwerte in den Registern rLast1, rLast2 und rLast3 alle drei kleiner sind als der Mittelwert im Register rMed:
  3. Ist bHi Null, wird nach dem Eintreffen einer Amplitudenerhöhung gesucht. Dazu wird überprüft, ob alle drei letzten Messungen in rLast1 bis rLast3 über dem Wert in rMed liegen:

5.3.3 Serielle Übertragung

Nach der Signalauswertung können im Sendepuffer zu sendende Datensets vorliegen. Daher wird nach jeder Signal- und Auswertungsphase die Senderoutine aufgerufen, die prüft, ob der Ausgabezeiger auf die gleiche Adresse zeigt wie der Ausgabezeiger. Ist das nicht der Fall, wird der nächste Datenset ausgesendet.

Die serielle Übertragung erfolgt Bit für Bit, mit dem höchsten Bit zuerst. Nach dem Löschen des Clock-Ausgangs wird zuerst das Datenbit auf den Datenausgang gelegt. Nach einer halben Baudraten-Zeit wird der Clock-Ausgang aktiviert (High). Der Empfänger sollte das Bit auf der Datenleitung bei positiven Flankenwechseln ablesen und übernehmen. Er hat dafür bei 10 kBd ca. 50 µs, bei 20 kBd ca. 25 µs lang Zeit. Ein Controllertakt des Empfängercontrollers, der zum Abholen jedes Bits mit einem PCINT 27 Taktzyklen benötigt, müsste bei einer Baudrate von 10 kBd mit einem Takt von mindestens 540 kHz arbeiten, um der Aufgabe gerecht zu werden, bei 20 kBd mit dem Doppelten. 32 kHz Takt wären daher z. B. nicht ausreichend.

Zeitbeziehungen Controller Alle 16,384 ms erfolgt die Übertragung eines Datensets für 800 oder 1.600 µs lang.

Für die Auswertung einschließlich Auswertung und Senden eines Datensets steht fast der gesamte Zeitraum der Taktung zur Verfügung (16,3 Millisekunden). Sendegeschwindigkeiten von 10 oder 20 kBd (Bits pro Sekunde) sind möglich. Die niedrigste mögliche Übertragungsrate wäre daher 16 ms/16 Bit = 1 kBd.

Es sind eine Reihe von Informationen an die Uhr zu übertragen. Es wurde daher entschieden, 16 Bits pro Datenset zu übertragen. Die ersten 8 Bit geben an, welcher Parameter übertragen wird (als ASCII-Zeichen). Die zweiten 8 Bit geben den Parameter an. Alle Meldungen sind in der Tabelle angegeben. In Gänsefüßen angegebene Zeichen sind ASCII-Zeichen.

ParameterHigh ByteLow ByteDauer (ms)
Statusmeldungen16,4
Restart"R"0
Frequenzscan komplett"C"0=nicht ok, 1=ok
Signalstärke"S"(AGC-Wert)
Frequenz"F"(AFC-Wert)
Empfangene DCF77-Zeit98,3
Minuten"m"(Minuten)
Stunden"h"(Stunden)
Wochentag"W"(Wochentag)
Tag"D"(Tag)
Monat"M"(Monat)
Jahr"Y"(Jahr)
Bit-Monitoring16,4
Null empfangen"0"0
Eins empfangen"1"1
DCF77-Fehlermeldungen16,4
Timeout"E""0"
Kurzsignal"E""1"
Null/Eins"E""2"
Eins/Pause"E""3"
Pause/Minute"E""4"
Minute lang"E""5"
<>59 Bits"E""6"
Anzahl Bits"B"(Anzahl Bits)
Parität Minuten"E""7"
Minuten Einer"E""8"
Minuten>59"E""9"
Parität Stunden"E""A"
Stunden Einer"E""B"
Stunden>23"E""C"
Parität Datum"E""D"
Wochentag=0"E""E"
Tag=0"E""F"
Tag Einer>9"E""G"
Tag>31"E""H"
Monat=0"E""I"
Monat Einer>9"E""J"
Monat>12"E""K"
Jahr Einer>9"E""L"
Jahr>99"E""M"
Debugging-Meldungen32,8
Puffer voll"a"(Mittelwert)
Delta Max - Min"d"(Differenz)


Alle übertragenen Zeit- und Datumsangaben des erfolgreich ausgewerteten DCF77-Signals einer Minute benötigen zusammen knapp 100 ms. Das kann bei der Synchronisation der Uhr verwendet werden, um die Dauer der ersten Sekunde einer Minute genauer zu gestalten.

Die Debugging-Meldungen treten nur auf, wenn die entsprechenden Debugging-Schalter auf "Yes" stehen.

Das erzeugte Signal sieht dann im Simulator so aus (links mit 10 kBd, rechts doppelt so schnell mit 20 kBd). Gesendet wurde hier 0xAAAA (wechselnde 1- und 0-Bits). Das Datensignal an PB0 (SDM) ist rot, das Clock-Signal an PB2 (SCM) ist grün dargestellt:

Serielle Signalerzeugung mit 10 Kilo-Baud Serielle Signalerzeugung mit 20 Kilo-Baud

5.4 Software

(Die Software ist noch nicht fertig!)

5.5 Betriebserfahrungen

(Liegen noch nicht vor!)

©2019 by http://www.avr-asm-tutorial.net