Pfad: Home => AVR-Übersicht => Anwendungen => DCF77-Empfänger => AGC/AFC/Decoder
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 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 halbe Sekunde lang abgewartet, bis die beiden PWM-Spannungen stabil sind.
  2. Der AGC-Wert wird so lange verringert, bis die Spannung am Gleichrichterausgang sich auf 2,5 V eingependelt hat. Überschreiten einzelne Messungen einen Pegel von 3,0 V, wird der AFC-Wert erhöht. Liegt der Durchschnitt aller Messungen oberhalb des Durchschnitts unter 2,5áV, wird der AGC-Wert vermindert (und die Verstärkung entsprechend erhöht).
  3. In einem Sendersuchlauf wird die AFC-Spannung in 16 Stufen um jeweils 0,31 V bis auf 0 V abgesenkt und aus 128 Messungen der Durchschnittswert berechnet. Alle Messungen unter und über diesem Durchschnittswert werden dann separat gemittelt und die Differenz aus beiden im SRAM abgelegt.
  4. Mit dem Spannungswert derjenigen Messung mit der höchsten Differenz wird dann begonnen. Die Spannung wird dazu um zwei Einheiten (39 mV) erhöht oder abgesenkt und erneut die Differenz bestimmt. Hat die Differenz zugenommen wird der neue Wert eingestellt, hat sie abgenommen wird der alte Wert beibehalten und in anderer Richtung weiter ermittelt.
  5. Dasselbe wird mit einer Differenz von einer Einheit (19,5 mV) vollführt, bis die optimale Frequenzeinstellung erreicht ist.
  6. Die Frequenzeinstellungsprozedur wird stündlich wiederholt.
Die AGC- und AFC-Werte werden, abwechselnd, laufend an der seriellen Schnittstelle ausgegeben, so dass die Uhr diese Näherung mitbekommt und z. B. aus dem AGC-Wert 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 s 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. Dessen Vorteiler wird dazu auf 64 gestellt. Der Overflow erfolgt daher nach 1000*64*256/Takt = 16,384 ms. Die Wandlung erfordert bei einem ADC-Taktvorteiler 1,664 ms. Danach erfolgt die Auswertung des Signals:
  1. Der Messwert wird in den SRAM-Puffer geschrieben.
  2. Aus allen gespeicherten Messwerten wird das Maximum und das Minimum ermittelt. Das Maximum wird dazu verwendet, um den AGC-PWM-Wert auf den Sollwert zu bringen. Der Abstand zwischen dem Maximum und dem Minimum dient dazu, den AFC-PWM-Wert zu optimieren. Der halbe Abstand zwischen Maximum und Minimum dient als Vergleichswert für die Erkennung von Pausendauern (hohe Amplitude) und Bitdauern (niedrige Amplitude).
  3. War das letzte Signal eine Pause (überdurchschnittlicher Amplitudenpegel), dann werden die letzten drei Messungen daraufhin überprüft, ob sie unterdurchschnittliche Pegel aufweisen. Ist dies der Fall, wird Ist dies nicht der Fall, wird der Pausendauerzähler um Eins erhöht und das Senden gestartet.
  4. War das letzte Signal ein Null- oder Eins-Bit (unterdurchschnittlicher Amplitudenpegel), dann werden die letzten drei Messungen daraufhin überprüft, ob sie überdurchschnittliche Pegel aufweisen. Ist dies der Fall, wird Ist dies nicht der Fall, wird der Bitdauerzähler um Eins erhöht und das Senden gestartet.

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)
Empfangene Zeit98,3
Minuten"m"(Minuten)
Stunden"h"(Stunden)
Wochentag"W"(Wochentag)
Tag"D"(Tag)
Monat"M"(Monat)
Jahr"Y"(Jahr)
Statusmeldungen32,8
Signalstärke"S"(AGC-Wert)
Frequenz"F"(AFC-Wert)
Bit-Monitoring
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"


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.

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

$$

5.5 Betriebserfahrungen

$$

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