Pfad: Home => AVR-DE => Anwendungen => DCF77-Empfänger => Geregelter OpAmp   This page in English: Flag EN
DCF77 receiver logo Anwendungen von
AVR-Einchip-Mikrocontrollern AT90S, ATtiny, ATmega und ATxmega
Geradeausempfang mit geregeltem OpAmp und ATtiny25
Logo
Dieses Projekt ist experimentell. Ich bin nicht sicher, ob und wie es funktioniert. Die Software dafür ist noch in Arbeit. Nachbau auf eigene Gefahr!

10 DCF77 Geradeausempfänger mit geregeltem Operationsverstärker und ATtiny25

Geradeaus-Empfänger für DCF77 benötigen eine Verstärkungsregelung. Die Gründe dafür sind:
  1. die Information im DCF77-Signal ist in der Amplitudenhöhe kodiert, die Verstärkung darf also nicht so hoch werden, dass die Amplitudenbegrenzung einsetzt (Clipping),
  2. zu hohe Verstärkung führt zur Oszillation, weil das Ausgangssignal in den Eingang zurückgeführt wird und die Schaltung schwingt. Da man für den Empfang Verstärkungen von 5.000 und mehr benötigt, lösen schon sehr geringe Rückstrahlungen Schwingungen aus.
Bei dem Konzept hier werden folgende Komponenten verwendet: Da der ATtiny25 mit der reinen Verstärkungsregelung massiv unterfordert wäre, macht er auch gleich noch Auch die Umwandlung der Mittel-Europäischen (Sommer-)Zeit in UTC ist bei den ASCII-Text-Formaten per Software einstellbar.

10.0 Index

  1. Hardware des Empfängers und Verstärkers
    1. Schaltbild der Hardware
    2. Wie der Empfangskreis funktioniert
    3. Wie der geregelte OpAmp-Verstärker arbeitet
  2. Hardware des ATtiny25 Controllers
    1. Messung des DCF77-Empfangssignals
    2. Erzeugung und Filterung der AFC-Spannung
    3. Erzeugung und Filterung der Verstärkungs-Regelspannung
    4. Ausgabe der Ergebnisse
  3. Software
    1. Software Download
    2. Software-Überblick
    3. Die AD-Wandlung des Eingangssignals
    4. Die Verstärkungsregelung mit der OCR0B-PWM
    5. Der AFC-Scan zu Beginn
    6. Die AFC im Normalbetrieb
    7. Analysieren des DCF77-Signals
    8. Umwandlung der DCF77-Bits in Datum und Zeit
    9. Aussenden von Status und Ergebnissen

10.1 Hardware des regulierten OpAmp-Empfängers

10.1.1 Schaltbild der Hardware

Schaltbild des regulierten OpAmp-Empfaengers Das ist schon alles:

Seitenanfang Index Hardware Software

10.1.2 Wie der Eingangskreis funktioniert

1 mH Ferritspule Die 1 mH-Ferritspule wurde aus einem 10 cm langen Ferritstab gebaut. Dieser wurde mit zwei bis drei Lagen Isolierband bewickelt und darauf eine Spule mit 0,25-mm-Kupferlackdraht angebracht. Um zu ermitteln, wieviele Windingen für 1 mH nötig sind, habe ich die Induktivität nach 100, 130 und 160 Windungen gemessen. Aus diesen Messungen habe ich den AL-Wert pro Windung2 bestimmt.

WindungenInduktivität [mH]AL [nH per w2]
1000,4039,72
1300,7544,56
1601,0540,88


Der AL-Wert ist demnach ungefähr 41 nH/Windung2. Für eine 2 mH-Spule wären daher 220 Windungen nötig gewesen.

Der Ohm'sche Widerstand der 160 Windungen beträgt 5.6 Ω, die induktive Reaktanz bei 77,5 kHz liegt bei 510 Ω. Die erforderliche Kapazität C für 77,5 kHz Resonanzfrequenz liegt bei 4,03 nF. Da es entsprechende Styroflexkondensatoren nicht zu kaufen gibt, habe ich einen Kondensator mit 3,3 nF und einen mit 330 pF kombiniert. Den Rest zum Sollwert verteilt sich auf die drei Kapazitätsdioden.

Der Parallelresonanz-Widerstand von L und C liegt bei 50 kΩ und höher. Daher kommen Transistorstufen niedriger Eingangsimpedanz oder transistorisierte Operationsverstärker wie der 741 nicht infrage, es muss schon ein FET-OpAmp sein.

Seitenanfang Index Hardware Software

10.1.3 Wie der regulierte Operationsverstärker funktioniert

Operationsverstärker mit fester Verstärkung Operationsverstärker mit variabler Verstärkung In dem ursprünglichen Konzept sollte der Widerstand R1 einer linearen Verstärkerstufe durch einen FET ersetzt werden. Dessen Gate-Spannung variiert zwischen Null und -4,6 V. Das hätte den Widerstandswert zwischen den Drain- und Source-Pins des FET zwischen einigen 100 Ω und mehr als 1 MΩ varriert.

Auszug RDSon aus dem Datenblatt des BF245 Dieser Auszug aus dem Datenblatt zeigt die Variation von RDSon der drei Typen an BF245. Die Kurven beginnen bei ungefähr 200 Ω (bei einem BF245A) oder weniger und reichen bis 100 kΩ. Der BF245C benötigt für das gleiche RDSon höhere negative Gate-Spannungen als die A- oder B-Typen.

RDSon und erreichbare Verstärkung beim FET BF256B Das gleiche Diagramm ist für den Typen BF246B nicht erhältlich. Normalerweise ist im Datenblatt nur IDSS aufgelistet, das ist der Drain-Source-Strom bei Null Volt Gate-Spannung, und das auch nur für eine einzige Drain-Spannung. Das ist zwar ausreichend, um daraus den RDSon bei 0 V Gatespannung zu berechnen, aber liefert keine Kurve der Steilheit wie beim BF245-Datenblatt.

Ich habe daher einen BF246B ausgemessen, indem ich an seinen Drain einen Widerstand von 100 kΩ gegen 5V angeschlossen habe und die Drain-Spannung bei verschiedenen Gatespannungen gemessen habe. Das Diagramm zeigt die Ergebnisse für das errechnete RDSon und die daraus berechnete Verstärkung der Gesamtschaltung. Die Verstärkung bewegt sich zwischen knapp über 10 und 1.000, also ein 100-facher Unterschied. Das sollte als Regelungsbereich ausreichen.

Unglücklichweise hat sich herausgestellt, dass der CA3140 in dieser Schaltung nur dann funktioniert, wenn man mit den beiden Offset-Pins 1 und 5 die Mittenverstellung des CA3140 ziemlich weit auf eine Seite verschiebt (4k7-Trimmer an Pin 1 und 5, Mitte an Minus). Der Einstellbereich, in dem der CA3140 dann verstärkt, ist recht eng. Beim Verlassen des Einstellbereichs erfolgt übermäßiges Schwingen. Auch ist diese Mittenverstellung sehr stark verstärkungsabhängig und reagiert sogar auf die Verstellung des LC-Kreises mit den Varaktordioden, den ich direkt an den positiven Eingang des CA3140 angekoppelt hatte. Jedenfalls ist das alles nix Zuverlässiges, was sich auch für den Nachbau eignet.

Es musste daher ein anderes Regelkonzept her. Nach etlichen misslungenen Versuchen hat sich die im Schaltbild gezeigte Lösung als geeignet und ausreichend robust erwiesen. Löngen, bei denen die Koppelkondensatoren kleiner ausgelegt waren (z. B. 1 nF), haben allesamt zu viel Noise und Instabilität gebracht, was bei der hohen Verstärkung von 100.000 auch zu erwarten ist, denn 10µV Rauschen oder Störsignal machen, mit 100.000 multipliziert, schon ganze 1 V aus. Dafür hat der hochempfindliche, weil FET-entkoppelte, LC-Eingangskreis nicht mal auf meine Energiesparlampe reagiert, die sonst alle handelsüblichen DCF77-Empfänger sicher zum Entgleisen bringt.

Eine Verstärkung von 100.000 bedeutet, dass 10 µV HF auf 1 V am Ausgang verstärkt werden. Die Verstärkung reicht daher sowohl für den Empfang im Nahbereich als auch in einiger Entfernung.

Seitenanfang Index Hardware Software

10.2 Hardware des ATtiny25 Controllers

DCF77-Controller ATtiny24 Das Steuern und Regeln und die Messung des DCF77-Signals erledigt ein achtpoliger ATtiny25. Es geht genauso gut auch ein ATtiny45 oder ATtiny85, wenn Du unbedingt ungenutztes SRAM und EEPROM verschwenden willst.

Die folgenden Funktionen sind im ATtiny25 realisiert:
  1. die Messung der DCF77-Amplitudensignal-Amplitude am ADC3-Eingang Pin 2,
  2. die Erzeugung des AFC-Signals am OC0A-Ausgang Pin 5,
  3. die Erzeugung der AGC-Regelspannung am OC0B-Ausgang Pin 6, und
  4. die Erzeugung und Ausgabe der gewünschten Auswertungsinhalte am Pin 3 (Daten) und Pin 7 (je nach Ausgabeart belegt, bei seriellem Synchronsignal ist das der CLOCK-Ausgang),
Die einzelnen Hardware-Funktionen sind in den folgenden Unterkapiteln näher beschrieben.

Seitenanfang Index Hardware Software

10.2.1 Messung des DCF77-Empfangssignals

Der ATtiny25-Controller misst den Maximalwert der Signalstärke am Ausgang des OpAmp an seinem ADC3-Eingang. Da das Signal positive und negative Schwingungen um die Mittenspannung herum misst, werden diese "mathematisch" gleichgerichtet, so dass auch unsymmetrische Signalformen noch korrekt gemessen und ausgewertet werden.

Mittels Software werden über 256 Messungen hinweg zwei Parameter bestimmt:
  1. die maximale Amplitude des "gleichgerichteten" Signals, sowie
  2. der Mittelwert der Signale.
Der zweite Wert sollte um +2,5V herum liegen (8-Bit-ADC-Wert = 128) und dient im folgenden dem mathematischen "Gleichrichten" des Signals.

Der erste Wert der maximalen Amplitude steuert den AGC-Wert: ist diese höher als z. B. die voreingestellten 2,0V (positiv = 4,5V, negativ = 0,5V, 8-Bit-Adc-Werte = 230 bzw. 25), dann wird der AGC-Gate-Spannungsgenerator ausgeschaltet. Dadurch nimmt die Gate-Spannung am Regel-FET langsam ab (100 µF und 1 MΩ) und die Amplitude wird niedriger.

Die weitere Auswertung der gemessenen Maximalwerte ist in der Software-Sektion beschrieben.

Seitenanfang Index Hardware Software

10.2.2 Erzeugung und Filterung der AFC-Spannung

OC0A als AFC-Controller Die OC0A PWM fuer die automatische Frequenzkontrolle Die OC0A-PWM erzeugt ein pulsweiten-moduliertes 8-Bit-Rechteck, das mit einem dreistufigen RC-Netzwerk gefiltert wird und daraus die Einstellspannung der drei Kapazitätsdioden liefert.

Die drei Stufen sind nötig, um die PWM-Rechtecke gehörig zu filtern. In der ersten Stufe beträgt das Ripple noch ca. 356 mVpp (siehe das Berechnungsblatt opampreg_OC0A in der LibreOffice Calc-Datei hier). Schon in der zweiten Filterstufe ist es auf 16 mVpp zurückgegangen, in der finalen dritten Stufe beträgt es weniger ca. 1,6 mVpp. Dieses mV-Ripple variiert die Resonanzfrequenz der LC-Eingangsstufe um ca. 1,5 Hz, schmal genug für den Betrieb und deutlich unterhalb der 256-Stufen-Auflösung der PWM (18 Hz/digit).

Folgeantwort der OC0A-PWM auf Aenderungen Das RC-Netzwerk hat einen weiteren Effekt: es verzögert die Anpassung an einen geänderten PWM-Wert. Die Verzögerung bei einer Änderung um 8 Bitstufen beläuft sich auf ca. 8 Sekunden, wie dieses Diagramm zeigt. Bei Messungen und Vergleichen muss dieser Zeitraum abgewartet werden, bis sich der neue PWM-Wert korrekt abbildet. Änderungen um 8 treten zu Beginn beim Scannen auf, kleinere Änderungen um eine Einheit sind hingegen schon nach ca. zwei Sekunden auf dem Endwert.

In der Start-Phase des Empfängers wird der OC0A-Wert, beginnend mit 255, in Stufen zu je acht (28 Stufen, entsprechend -0,16 V) abwärts gescanned. Nach dem Warten wird aus dem Mittelwert von 256 Maxima und Signalhöhen über 2,3 Sekunden die Differenz gebildet. Da in 2,3 Sekunden mindestens ein Amplitudenrückgang von DCF77 liegt, ist die durchschnittliche Signalhöhe niedriger als bei anderen störenden Dauersignalen, aus der Differenz kann daher DCF77 aus anderen Störquellen ermittelt werden, indem das Maximum der Differenz aus den Maxima und den Signalhöhen gesucht wird. Der PWM-Wert von OC0A wird auf den Wert eingestellt, bei dem dieses Maximum vorlag. Die Scan-Phase ist dann beendet.

Da in jeder Messphase zunächst 10 s lang gewartet wird, bis die PWM eingestellt ist, und da jede Messung über 2,3 s hinweg erfolgt, dauert diese Scan-Phase bei 28 Stufen insgesamt 344 s oder knapp 6 Minuten.

Die weitere Fein-Einstellung der Frequenz erfolgt im laufenden Betrieb, indem die OC0A-Werte jeweils um -1 und +1 variiert werden. Mehr über die Scan-Phase und die AFC-Einstellung im laufenden Betrieb ist in der Software-Sektion dieser Seite angegeben.

Seitenanfang Index Hardware Software

10.2.3 Erzeugung und Filterung der Verstärkungs-Regelspannung

AGC-Spannungsgenerator AGC-Spannungen beim Ein- und Ausschalten des Generators Die Erzeugung der negativen Regelspannung (AGC) für das Gate des FET erfolgt aus dem PWM-Ausgang OC0B des ATtiny25 über eine Spule, zwei Kondensatoren von 470 nF und zwei Germanium- (oder Schottky-) Dioden. Ist der OC0A-Ausgang aktiv (ca. 7,8 kHz), werden so -4,6 V am zweiten Kondensator erreicht. Das reicht für die Aussteuerung aller möglichen FETs völlig aus. Diese Spannung gelangt über den Ladewiderstand von 10 kΩ auf den Elko von 470 µF. Die Kurve der Aufladung ist recht steil, nach wenigen Sekunden Ladezeit sind -4,0 V erreicht.

Ist der Generator ausgeschaltet, entlädt sich der Elko über den 10 MΩ langsam wieder, die negative Gate-Spannung bewegt sich langsam in Richtung auf 0 V, RDSon wird niedriger und der in die zweite Verstärkerstufe eingespeiste Signalanteil wird niedriger.

Zu Beginn des Betriebs und wenn die Amplitude unter ein Mindestniveau fällt, dann wird der Generator eingeschaltet. Da sich in dieser Phase eine Auswertung der Amplitude nicht lohnt, wird nur die Maximalamplitude beobachtet, die sich aus 256 Messungen der Amplitude ergibt (über ca. 7,8 ms lang). Erreicht diese den Mindestlevel von 1,5 Volt, dann erfolgt die Abschaltung des Generators. Die AGC-Spannung wird dann durch die lange Zeitkonstante (10 MΩ, 470 µF) nur sehr langsam wieder entladen.

Während des normalen Betriebs wird die Maximalamplitude daraufhin überwacht, ob ein Mindestmaß unterschritten wird und der AGC-Spannungsgerenator wieder eingeschaltet werden muss. Damit die sekündliche Amplitudenabsenkung von DCF77 nicht weggeregelt wird, erfolgt das Einschalten des AGC-Gate-Spannungsgenerators und die Erhöhung der Verstärkung bei zu geringer Amplitude nur, wenn der Langzeit-Mittelwert der Amplitude dieses festgelegte Minimum unterschreitet. Die Langzeitmessung umfasst den Mittelwert aus 256 Messungen der Maximalamplitude und überspannt daher mehr als zwei Sekunden Messdauer, so dass mindestens eine Amplitudenabsenkung in die Langzeit-Mittelwertbildung eingeht.

Für die Erzeugung der negativen Gate-Spannung wird nur eine beliebige Rechteckspannung benötigt, eine PWM ist eigentlich dafür überkandidelt und auch nicht sinnvoll (das Impuls/Pausen-Verhältnis hat keinen nnenswerten Einfluss auf die erzeugte Spannung). Da der zweite OC-Ausgang eine PWM benötigt und TC0 daher im PWM-Modus arbeiten muss, wird der OC0B-Ausgang fest mit 50% Pulsweite ausgesteuert.

Mehr Details zu dem Regelungsalgorithmus der AGC-Spannung sind in der Software-Sektion zu finden.

Seitenanfang Index Hardware Software

10.2.4 Ausgabe der Ergebnisse

Die beiden Pins PB2 und PB4 produzieren das Ausgangssignal, abhängig von den Einstellungen im Quellcode der Software.
  1. Ist die Konstante Null, dann sind beide Ausgänge dauerhaft auf Low-Potenzial.
  2. Ist der einfachste Modus 1 gewählt, dann folgt Pin 3 (Data) dem DCF77-Signal. Da zur Erkennung des Pegelrückgangs der DCF77-Amplitude softwaremäßig drei Maximalwerte abgewartet werden, beträgt die Verzögerung ca 30 bis 40 ms gegenüber dem Originalsignal. Pin 7 gibt das invertierte Signal aus, so dass auch Schaltungen, die ein invertiertes DCF77-Signal benötigen, direkt an den Controller angeschlossen werden können. Die beiden Pins liefern bis zu 50 mA Strom, so dass direkt Leuchtdioden angeschlossen werden können und keine Transistortreiberstufe nötig ist.
  3. Ist synchrone serielle Ausgabe mit bTxMode = 2 ausgewählt, dann werden die Daten und Nachrichten als ASCII-Zeichenketten im seriellen Synchron-Modus übertragen. Dazu werden die Bits, beginnend mit dem niedrigstwertigen, nacheinander auf den Datenausgang an Pin 3 gelegt und mit einem Clock-Signal an Pin 7 an dem Empfänger übergeben. Die Baudrate ist mit der Konstanten cBaud einstellbar.

    Synchronuebertragung der Status- und Ergebnisbits

    Im Bild ist die Übertragung mit 10 kBd zu sehen. Die drei Phasen der Bit-Übertragung sind etwa alle gleich lang, so dass sich der Empfänger bequem auf alle Bits vorbereiten kann. Jeweils acht Bit stellen ein ASCII-Zeichen dar. Alle Zeichen werden ohne Pausen übertragen, am Ende der Zeile kommt ein Wagenrücklauf und ein Zeilenvorschub.
  4. Im Modus 3 werden die Statusmeldungen und Ergebnisse asynchron übertragen.

    Asynchrone Zeichenuebertragung

    Alle Zeichen der Zeile werden mit einem Start- sowie mit zwei Stopbits eingerahmt. Dargestellt ist oben der +/-12V-Pegel auf der RS232-Datenleitung, unten das invertierte Eingangssignal des RS232-Pegelwandlers wie es an Pin 3 des ATtiny25 ausgegeben wird. Der Pegelwandler sieht dann etwa so aus:

    Async RS232-Interface

    An Steuersignalen wird nur das Clear-To-Send-Signal der empfangenden Schnittstelle ausgewertet: solange diese auf High-Pegel ist, wird gesendet. Die Baudrate ist wieder frei zwischen 45 und ca. 50.000 wählbar. Für die Invertierung sorgt die Konstante cRevert mit 1, dann klappt es auch mit der Polarität.
Was in den letzten beiden Fällen gesendet wird, kann mit der Konstanten cTxContent eingestellt werden:
  1. Null sendet nix.
  2. Eins sendet minütlich nur die Uhrzeit mit Stunden und Minuten, mit T davor und einem U danach, sofern es sich um die UTC handelt, sowie CR/LF danach.
  3. Zwei sendet die Uhrzeit mit T davor, dann das Datum mit D davor, dann den Wochentag, ein U wenn es sich um UTC handelt, sowie danach CR/LF.
  4. Drei sendet zusätzlich noch wichtige Informationen zum Status des Controllers, z. B. den Einstellwert der AFC-PWM mit F davor, den Zustand des AGC-Generators mit G davor, sekündlich die empfangenen Bits mit B davor, Fehlermeldungen bei der minütlichen DCF77-Auswertung, und vieles andere mehr.


Seitenanfang Index Hardware Software

10.3 Die Software

10.3.1 Software-Download

Die Software befindet sich noch in der Bearbeitung. $$Hinzufügen$$

10.3.2 Software-Überblick

Die Software muss Folgendes erledigen:
  1. Das am ADC3-Eingang ankommende Signal wird regelmäßig vom ADC gemessen und
    • das Maximum der Amplitude festgestellt werden, und
    • der Mittelwert des ADC-Wertes berechnet werden.
    Bei der Mittelwertbildung wird der Roh-ADC-Wert gemittelt und nach 256 Messungen das MSB der Summe im Register rAvg abgelegt. Dieser Wert wird vom ADC-Wert abgezogen. Tritt beim Abziehen das Carry-Flag ein, dann wird der Kehrwert gebildet (mathematisch: Gleichrichtung). Dieser Wert wird mit dem bisherigen Maximum in rMaxM verglichen und, falls er höher ist, als neuer Maximalwert abgelegt. Sind 256 Messwerte eingegangen (nach ca. 7,3 ms) wird der Maximalwert nach rMax kopiert und die bAdc-Flagge gesetzt. Dies findet in der Interrupt-Service-Routine des ADC complete Interrupts statt.
  2. Außerhalb der Interrupt-Service-Routine wird jeweils geprüft, ob der AGC-Generator eingeschaltet ist (bGain = 0). Ist das der Fall und ist der eingestellte Maximalwert der Amplitude in cMaxLevel erreicht, wird dieser Generator abgeschaltet, die Flagge bGain gesetzt sowie die Langzeit-Mittelwert-Bildung neu gestartet.
  3. Aus dem Maximalwert der Amplitude werden jeweils 256 Messungen aufsummiert. Der MSB dieser Summe wird in rLTMax abgelegt. Ist dieser Maximalmittelwert kleiner als der in cMinLevel eingestellte Minimalwert, dann wird der AGC-Generator gestartet und die Flagge bGain gel&aouml;scht.
  4. Die DCF77-Signalerkennung erfolgt dann folgendermaßen:
    1. War der vorherige Zustand eine hohe Amplitude, dann wird geprüft, ob das Kurzzeitmaximum der Amplitude niedriger ist als der Langzeit-Mittelwert. Ist das der Fall, wird der Änderungszähler erhöht. Erreicht dieser Drei, dann liegt der Beginn einer Absenkung vor. Der High-Zähler wird dann auf den Bereich eines Minutenwechsels überprüft. Liegt er in diesem Bereich, wird ein Minutenwechsel durchgeführt.
    2. Lag beim vorherigen Zustand eine niedrige Amplitude vor, dann wird umgekehrt geprüft, ob das Kurzzeitmaximum höher als der Langzeit-Mittelwert liegt. Ist das der Fall, wird der Änderungszähler erhöht und bei Erreichen von Drei erfolgt eine Auswertung auf Nullen und Einsen.
  5. Falls Ausgabe-Optionen gewählt sind, müssen noch die entsprechenden Ausgabe-Operationen folgen. Diese werden dem erzeugten Binärcode optionsabhängig hinzugefügt, do dass der Code nicht mit ungenutztem Zeugs vollgemüllt wird.
Um den optimalen AFC-Ausgang zu ermitteln, werden
  1. zu Beginn ein Scan durchgeführt, und
  2. im laufenden Betrieb Messungen mit einer PWM-Stufe niedriger und höher durchgeführt.
    1. Durchschnitte aus den Amplitudenmaxima Der Scan funktioniert folgendermaßen. Er startet mit der höchstmöglichen OCR0A-Einstellung (255 entspricht +5V entspricht der höchsten Frequenz). Nach einer Wartezeit von 2,3 Sekunden (Einstellzeit des RC-Filters) werden jeweils die Maxima bei allen Kurzzeitmessungen (256 Messungen, ca. 7 ms) für 2,3 Sekunden lang ausgewertet. Einerseits wird der Mittelwert ermittelt, der durch den Einfluss von darin enthaltenen Nullen- und Einsen-Übertragungen etwas niedriger liegt als der Maximalwert über die gesamten 2,3 Sekunden. Andererseits wird das Maximum über den gesamten Zeitraum gebildet. Das Diagramm zeigt den Unterschied über mehr als eine Minute lang an. Manche Durchschnitte liegen etwas niedriger, weil zufällig zwei übertragene Bits in diesem Zeitraum auftraten.

      Der OCR0A-Wert wird dann jeweils um acht erniedrigt und diesselbe Warte- und Messzeit ausgeführt. Ist die Differenz aus dem Maximalwert und dem gemittelten Maximum höher, wird der Differenzwert sowie der zugehörige OCR0A-Wert gespeichert. Ist der OCR0A-Wert kleiner als 39, dann ist der Scan beendet und der ermittelte OCR0A-Wert wird in den Vergleicher des TC0 geschrieben. Weiter unten ist das Flussdiagramm des Algorithmus im Detail abgebildet.

      Im laufenden Betrieb erfolgt die Messung folgendermaßen. Nach der Langzeit-Messung wird der OC0A-Wert um Eins angesenkt und nach einer Wartezeit von 2,3 s die Differenz aus den Langzeit-Maxima und dem gemittelten Langzeit-Mittelwert ermittelt. Danach wird der OC0A-Wert um Zwei erhöht und nach einer weiteren Wartezeit diese Differenz gemessen. Der OC0A-Wert wird auf denjenigen Wert eingestellt, bei dem die Differenz am größten war.
      Seitenanfang Index Hardware Software

      10.3.3 Die AD-Wandlung des Eingangssignals

      Die AD-Wandlung erfolgt im Freilauf-Modus (automatischer Neustart des Wandlers nach Lesen des Ergebnisses). Da der AD-Wandler das Maximum der 77,5-kHz-Wellenzüge erkennen muss, erfolgt die Wandlung relativ schnell (Vorteiler = 4) und das Abholen und der erste Teil der Verarbeitung erfolgt unmittelbar im ADC-Interrupt.

      Das Timing ist im Rechenblatt opampreg_ADC der LibreOffice Calc-Datei hier näher angegeben. Die Maximalwert-Erkennung wertet 256 Werte aus. Da die nächste Wandlung erst dann angestoßen wird, wenn das Ergebnis der letzten Wandlung abgeholt worden ist, beträgt die Dauer pro Wandlung 14,25 Taktzyklen. Der AD-Wandler arbeitet daher mit 35,1 kHz und tastet das Eingangssignal von 77,5 kHz ca. 0,45-mal pro Sinuswelle ab. Die Sammlung von 256 Ergebnissen dauert etwa 7,3 ms.

      Um Umrechnungen zu vermeiden, erfolgt die Maximalwertermittlung und die Mittelwertbildung der Eingangssignalamplituden mit einem separaten Zähler bis 256. Dadurch kann einfach das MSB der Summe als 8-Bit-Mittelwert gebildet werden.

      Da für die gesamte Erkennung und Mittelwertbildung nur 8-Bit-AD-Werte herangezogen werden, wird beim Start des ADC das ADLAR-Bit gesetzt, nur das MSB des Ergebnisses wird abgeholt und weiterverarbeitet.

      Die Erkennung des Maximums und die Bildung des Mittelwerts der Amplitude erfolgen innerhalb der Interrupt-Serrvice-Routine. Diese braucht dafür minimal 27 und maximal 32 Taktzyklen. Damit dies innerhalb der verfügbaren Dauer möglich ist und es nicht zu Verzögerungen beim Abholen des AD-Ergebnisses kommt, wird der Prozessortakt auf 2 MHz umgestellt (mit CLKPR). Bei 2 MHz und der gewählten Taktrate bleiben ausreichend Taktzyklen für die Interrupt-Service-Routine. Bei 1 MHz Takt käme es zu Konflikten, da dann das nächste ADC-Ergebnis schon vorläge, wenn die ISR noch gar nicht fertig abgearbeitet ist. Selbiges wäre auch der Fall, wenn durch die serielle Ausgabe von Status- und Ergenismeldungen längere Wartezeiten vorlägen. Dies würde zu einer Absenkung der Abtastrate und zur Verlängerung des Mittelungszeitraums führen. Da dieser Zeitraum aber genügend Pufferzeit aufweist, sind solche geringfügige Verzögerungen kein Problem.

      ADC-Messungen Um herauszufinden, wie groß die Messwert-Unterschiede der Maximumerkennung zu erwarten sind, habe ich im Rechenblatt opampreg_maxdetection in der LibreOffice Calc-Datei hier eine Simulation gemacht. Darin sind 256 Messungen in 7,3 ms simuliert, bei normaler und abgesenkter Amplitude. Die Amplitude wurde mit 20% Zufalls-Zittern modelliert.

      Wie man an den simulierten Werten erkennt, ist die Trefferquote beim Maximum und beim Signaldurchschnitt überwältigend gut. Einen Ausschnitt der ersten 0,4 ms zeigt die Abbildung.

      Seitenanfang Index Hardware Software

      10.3.4 OC0A- und OC0B-Einstellung: Der AFC-Scan zu Beginn

      Flussdiagramm der Scan-Phase Dies zeigt den Scan-Vorgang, der zu Beginn des Betriebs außerhalb der ADC-Interrupt-Routine ausgeführt wird. Der Vorgang wird alle ca. 9 ms vom TC0-Interrupt angestossen, wenn dessen Zähler abgelaufen ist. Dies stellt sicher, dass eine feste und verlässliche Zeitbasis vorliegt, die unabhängig von den ADC-Ereignissen ist.

      Zu Beginn, wenn der 470 µF-Kondensator noch nicht aufgeladen ist, ist der Verstärker noch mit einer Verstärkung von ca. 100 unterwegs, das DCF77-Signal verursacht noch keine ADC-Werte. Es wird daher der Gate-Spannungs-Generator eingeschaltet. Erst wenn die Verstärkung soweit angestiegen ist, dass der eingestellte Maximal-Level der Amplitude erreicht wird, wird der Generator wieder abgeschaltet und die weitere Signalverfolgung nimmt ihren Lauf.

      Durch Aufsummierung von 256 abgeholten Kurzzeit-Maximalwerten der Amplitude sowie durch Feststellung der Maximalamplitude über den gesamten Zeitraum von 2,3 ms werden die entsprechenden Größen ermittelt. Liegen diese 256 Werte vor, dann wird überprüft, ob die Mindest-Aussteuerung des Verstärkers unterschritten wird. Ist dies der Fall, dann wird erneut der Generator in Gang gesetzt, um die Verstärkung zu erhöhen.

      Wenn die 256 Werte mit ausreichend Amplitude vorligen, werden diese Langzeit-Werte in entsprechende Register abgelegt. Wenn der Scan-Vorgang abgeschlossen ist, wird mit dem Maximalwert die DCF77-Signalerkennung durchgeführt (siehe weiter unten).

      Zu Beginn muss herausgefunden werden, auf welcher Frequenzeinstellung des AFC-Signals sich DCF77 befindet. Das erfolgt in einer Scan-Phase.

      Weil sich im Einstellbereich des AFC-Bereichs zwischen 70 und 80 kHz auch noch andere Sender tummeln können, wie z. B.
      1. Zu allererst: die fünfte Harmonische der 15.625 kHz-PWM liegt bei 78.125 kHz und vom Nutzsignal nur 625 Hz weg, daher müssen die Verbindungen der PWM vor dem RC-Filter bzw. Gleichrichter kurz gehalten und die Antenne möglichst weit weg vom PWM-Controller montiert werden.
      2. An meinem Standort hier südlich von Frankfurt gibt es einen starken Störer bei 80 kHz, von dem ich nicht weiß, woher der stammt.
      3. Meine Energiesparlampe sendet bei 70 kHz.
      Es reicht daher nicht aus, nur das Maximum der Empfangsstärke heranzuziehen, denn die AFC würde sich dann auf dieses Störsignal einstellen und würde DCF77 verpassen. Zur4 Erkennung von DCF77 wird daher beim Scan (und später auch bei der AFC-Feineinstellung) der Amplitudenrückgang von DCF77 herangezogen. Beim Langzeit-Mittelwert ziehen die Amplitudenrückgänge den Durchschnittswert um 10 bis 20% nach unten. Es muss also die Differenz aus den Mittelwerten der Langzeit-Maximalamplitude mit dem Mittelwert der Signalstärke verglichen werden und dasjenige Signal herangezogen werden, bei dem diese Differenz am größten ist.

      Zu Beginn startet die AFC-PWM mit 255 (= 5 V) und in einem längeren Durchlauf wird dieser Wert jeweils um 8 bis herunter auf 39 verringert (39/256*5 = 0,762 V). Bei jeder Verringerung um 8 wird eine Wartezeit eingefügt, bis sich das RC-Filternetzwerk der PWM auf den neuen Wert eingestellt hat. Die nötige Wartezeit wurde mittels Simulation in der Abbildung hier bestimmt. Im Beispielfall wurde der Scan-Wert 128 kurz nach 0,5 Sekunden um 8 abgesenkt (auf 2,1875 V). Wie das Diagramm zeigt, braucht es 1,5 Sekunden, bis sich die Spannung dem neuen Sollwert nähert, nach weiteren 0,5 Sekunden ist der neue Sollwert erreicht. Es ist daher angebracht, etwas länger als zwei Sekunden zu warten, bis die AFC-Spannung stabil ist.

      Während der Scan-Phase, die 27 Schritte umfasst, sollten folgende Bedingungen eingehalten werden:
      • Es sollte keine sprunghafte Änderung der AGC-Spannung eintreten, wie sie beim Einschalten der negativen Ladungspumpe eintritt. Ist das erforderlich, beginnt die Wartephase und das Sampling erneut.
      • Wenn die Mindestverstärkung unterschritten wird, indem der Langzeit-Mittelwert unter den eingestellten Mindestwert abfällt, muss der 470 µF-Elko wieder geladen werden.
      • Die Differenz aus gemitteltem Maximalwert und Durchschnittswert ist dann unempfindlich für Änderungen der AGC-Spannung.
      Ist der Scan noch aktiv, dann wird jeweils das Ende eines 2,3-Sekunden-Intervalls abgewartet, bevor weiter analysiert wird. Der erste Durchgang wird dabei verworfen, um die Zeit für die Filtereinstellung abzuwarten. Erst bei gesetzter bWait-Flagge wird der Langzeit-Mittelwert in rLTMax von dem Langzeit-Maximalwert in rLTMaxM abgezogen. Ist dieser Wert größer als der bisherige, wird er gespeichert.

      Dann wird der OCR0A-Wert um acht verringert und in das PWM-Vergleichsregister geschrieben. Unterschreitet der OCR0A-Wert den Wert 39 (entspricht 0,76 V), dann ist der Scan beendet und der ermittelte Bestwert wird in das Portregister OCR0A geschrieben.

      Danach wird im normalen Betrieb die Feineinstellung des AFC-Wertes vorgenommen (siehe das nächste Kapitel).

      Seitenanfang Index Hardware Software

      10.3.5 Die AFC im Normalbetrieb

      Nachdem der Grobscan absolviert ist, wird die AFC-Spannung feinjustiert. Dazu wird laufend der folgende Algorithmus verwendet:
      1. Die Langzeit-Differenz zwischen den über 2,3 Sekunden gemittelten Maxima und dem Langzeitmaximum wird für den aktuellen Zustand ermittelt und im SRAM zwischengespeichert.
      2. Der aktuelle OCR0A-Wert wird um Eins abgesenkt und nach einer Wartezeit von weiteren 2,3 Sekunden und nach einer Messzeit von 2,3 Sekunden wird erneut dieser Differenzwert ermittelt und gespeichert.
      3. Dann wird der OCR0A-Wert um zwei erhöht und erneut gewartet, gemessen und gespeichert.
      Das Maximum der drei gespeicherten Werte wird ermittelt und das OCR0A-Portregister auf diesen Wert gesetzt.

      Seitenanfang Index Hardware Software

      10.3.6 Analyse des DCF77-Signals

      $$Noch zu erstellen$$

      Seitenanfang Index Hardware Software

      10.3.7 Umwandlung der DCF77-Bits in Datum und Zeit

      $$Noch zu erstellen$$

      Seitenanfang Index Hardware Software

      10.3.8 Serielles Senden von Status und Ergebnissen

      Die Signalaussendung verwendet TC1 als Baudraten-Generator und für das nötige Timing. Da der 8-Bit-TC1 im ATtiny25 Prescaler-Werte zwischen 1 und 16.384 in Zweierpotenzen einstellen kann und im CTC-Betrieb durch 1 bis 256 geteilt werden kann, kann nahezu jede beliebige Baudrate eingestellt werden. Baudraten oberhalb von 50.000 werden durch die Ganzzahlen-Mathematik zunehmend ungenauer, aber wer braucht das schon unbedingt so schnell. Die Ungenauigkeit kann in der Symboltabelle, die gavrasm und avr_sim im Listing produzieren, in den beiden Konstanten cBaudEff (effektive Baudrate) und cBaudDiff in 0,01%-Auflösung abgelesen werden. Bei 9k6 async liegt die echte Baudrate bei 9.615 Bd, was um 0.16% zu hoch liegt. So was Kleines kümmert aber keine RS232-Schnittstelle.

      Während des Betriebs sammeln sich Status- und Ergebnismeldungen an, die zu senden sind. Diese werden in einem SRAM-Sendepuffer gesammelt, der von sBuf bis sBufEnd reicht. Ist die Zeile komplett, werden Wagenrücklauf- und Zeilenvorschub-Zeichen sowie eine ASCII-Null angefügt, der den Sendeprozess beendet.

      Ist der Puffer fertig zum Sendden,
      1. zeigt der Zeiger X auf den Pufferanfang,
      2. im synchronen Fall wird rTxCnt auf Zwei gesetzt,
      3. eine Eins wird in den Bitzähler rTxBit geschrieben, damit das nächste Zeichen aus dem Puffer geholt wird,
      4. die Flagge bTx im Flaggenregister rFlag wird gesetzt,
      5. der Zähler TCNT1 wird mit Null überschrieben, und
      6. das Interrupt-Masken-Bit OCIE1A des Zählers wird gesetzt und damit die Interrupts eingeschaltet.
      Der gesamte Sendevorgang läuft dann in der Interrupt-Service-Routine ab, die es in zwei Versionen im Quellcode gibt:
      1. mit cTxMode=2 wird die Synchron-Variante aktiviert, mit
      2. 3 wird die Async-Variante eingebracht.
      In beiden Modi kann mit der Konstanten cReverse=1 die Polarität der beiden Ausgabepins invertiert werden.

      Da sich Async- und Sync-Methode erheblich unterscheiden, werden diese nachfolgend separat im Detail dargestellt.

      10.3.8.1 Serielles Senden im Sync-Modus

      Serial sync Flussdiagramm Das Flussdiagramm zeit die Interrupt-Ausführung beim TC1 Compare Match Interrupt. Die roten Zahlen stellen die Anzahl Taktzyklen bei jeder Instruktion dar.

      Ist synchrones Senden eingestellt, erfolgt der Interrupt drei mal häufiger als im asynchronen Modus, denn für die Übertragung jedes Bits werden drei Phasen benötigt. Diese werden in dem Phasenzähler rTxCnt verwaltet. Die Phasen 1 und 0 aktivieren und deaktivieren den CLOCK-Ausgangs-Pin PB2. Die Phase 2, in der die Bits auf den DATA-Ausgangs-Pin PB4 gelangen (unterer Teil des Flussdiagramm) erniedrigt zunächst den Bitzähler in rTxBit. Wenn dieser Null erreicht, wird das nächste ASCII-Zeichen aus dem SRAM-Puffer geholt. Ist dies eine ASCII-Null, wird das Senden beendet, die Sendeflagge bTx gelöscht, der Datenausgang auf Null gebracht und die TC1-Interrupts abgeschaltet. Wenn nicht, wird das erste Bit rechts herausgeschoben und der Ausgang damit gesetzt oder gelöscht.

      Alle Verläufe benötigen weniger als 32 Taktzyklen. Daher werden die Takte der ADC-Messung nur in Einzelfällen etwas verzögert, aber nur kurz blockiert. Nur bei hohen Baudraten über 60kBd blockiert der Sendevorgang den ATtiny25 und keine anderen Interrupts werden mehr ausgeführt. Der Quellcode lässt keine höheren Baudraten als 31 kBd zu.

      Wenn cTxContent die Ausgabe des kurzen Zeitformats auswählt, benötigt die Senderoutine bei 10 kBd dafür ca. 8.8 ms. Beim Langformat sind es 18 ms. Da beides nur einmal pro Minute auftritt, ist es nicht relevant.

      Seriell Sync-Ausgabe AA mit 10 kBd Dies zeigt die Sendung von hexadezimal 0xAA (=1010.1010) über die Data- und Clock-Pins i Sync-Modus.


      Seitenanfang Index Hardware Software

      10.3.8.2 Serielles Senden im Async-Modus

      Flussdigramm Seriell Async Senden Das Flussdiagramm zeigt die Interrupt-Ausführung im Async-Sende-Modus.

      Wenn die asynchrone Sendung ausgewählt ist, bedeutet jeder Interrupt ein Bit. Pro Zeichen werden zu den 8 Zeichen-Bits ein Start-Bit und zwei Stopbits zusätzlich ausgesendet. Die Baudrate entspricht daher 8/11 der Zeichengschwindigkeit.

      Die Interrupt-Service-Routine beginnt mit der Verminderung der Anzahl Bits in rTxBit. Erreicht der Bitzähler Null, wird das nächste Zeichen aus dem Puffer in rTx geholt. Ist dies eine ASCII-Null, ist das Senden beendet und die Interrupts werden ausgeschaltet. Ist es keine Null, wird das Startbit gesendet (bei cRevert = 0 ist das Startbit high, bei 1 ist es low). Bei den nachfolgenden Interrupts werden zwei Stopbits ausgegeben, wenn die Anzahl Bits unter drei liegt. Bei allen anderen Bitzahlen wird ein Bit nach rechts in das Carry herausgeschoben und PB4 entsprechend gesetzt.

      Alle Verzweigungen benötigen maximal 27 Takte. Die Maximalgeschwindigkeit, bei der alle anderen Interrupts blockiert werden, beträgt 74,1 kBd. Berechnet man die echte Zeit, die das Startbit, die acht Datenbits und die beiden Stopbits benötigen, dann sind knapp 95 kBd Blockade-Baudrate möglich. Die Baudrate ist daher softwareseitig auf 47 kBd begrenzt.

      Die Minimal-Baudrate liegt bei unter 45 Bd, niedrig genug, um auf Kurzwelle im 80- oder 40-m-Band mit 45 Bd einen DCF77-Datum/Uhrzeuit/Wochentag-Sender über Radio-Teletype (RTTY) aufzusetzen.

      Bei 9k6 dauert das Langformat 25 ms, das Kurzformat 12,6 ms, welches über cTxContent ausgewählt werden kann.

      Die beiden Simulationsdiagramme zeigen das Zeichen 0xAA im Async-Modus, rechts im invertierten Ausgabeformat wie es in einen MAX232 eingespeist werden kann.

      Async Seriell-Ausgabe AA mit 9,6 kBd Async Seriell-Ausgabe AA mit 9.6 kBd, invertiert


      Seitenanfang Index Hardware Software



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