Forum: FPGA, VHDL & Co. DCF77 Signal eindeutig erkennen


von Alex Baumer (Gast)


Lesenswert?

Hallo

für ein Projekt in meinem Studium soll ich ein DCF77-Signal auswerten. 
Dieses bekomme ich schon in digitaler Form in mein FPGA.
Nun muss ich auftretende Störungen sicher herausfiltern.
Ich weiß, dass es die Möglichkeit gibt ein Schieberegister zu benutzen. 
Da ich mich nun auch privat für digitale Filter interessiere, wäre ich 
für gute Literaturquellen oder Beschreibungen dankbar. Viele Erklärungen 
die ich bereits gesehen habe, sind für mich als Anfänger zu komplex.

Wie gehe ich beim Entwicklen von digitalen Filtern vor? Bzw. wie kann 
ich eine "intelligente" eindeutige Erkennung der Signallängen von 
logisch 1 bzw. logisch 0 in VHDL umsetzen?

von Michael (Gast)


Lesenswert?

Alex Baumer schrieb:
> Nun muss ich auftretende Störungen sicher herausfiltern.

Meinst du, ein FPGA schafft das zeitlich? Immerhin hat das DCF77-Signal 
eine Bandbreite von deutlich mehr als einem Hertz.

von Alex Baumer (Gast)


Lesenswert?

Das Board ist mit einem 50 MHz Quartz getaktet

von Schrei (Gast)


Lesenswert?

Also ich habe mir statt FPGA, so einen Summer gekauft, wenn der Piept 
ist es high, und das habe ich dann einem nichtsnutzigem Studenten 
erklährt wie man eine 1 und eine 0 erkennen kann je länger piep desto 1. 
Warten auf Lange Pause da fängt das Signal an.
Jetzt hört er gut 1 Minute das Piepen und notiert sich 1 und 0, ja nach 
Pieplänge.
in der 2. Minute Rechnet er das dann in eine Uhrzeit um, leider kann er 
da nicht mit zählen, da er keine Studentin ist (Multitasking können halt 
nur Frauen).
bei der nächsten Längeren Pause wies der Student dennoch wie spät es ist 
und kann sich jede Sekunde die neue Uhrzeit auf einen Zettel schreiben.

Also:
- Muss dein FPGA mehrere Dinge gleichzeitig können
- Musst du einem Studenten erklären wie man das umrechnet
- Der Student bzw der Lautsprecher hat einen natürlich bedingten 
Tiefpass, winzige Störungen von wenigen ms hört der garnicht.
- Solltest du einen Wikipedia Artikel verfassen wie man digitale Filter 
baut
- Vielleicht schaft du es ja einen billigen Arbeiter aus Fernost das 
ganze zu erklähren der Student ist mir auf dauer zu teuer, unsere Firma 
ist so sozial und zahlt auch noch eine studenbasierte Vergütung. 720h im 
Monat bescheren dem ganz schön viel Asche.

von Matthias (Gast)


Lesenswert?

Alex Baumer schrieb:
> Nun muss ich auftretende Störungen sicher herausfiltern.

Das sichere Herausfiltern funktioniert nur, wenn man Vorwissen über den 
Signalinhalt mit in den Auswertealgorithmus steckt, da das Signal auf 
Grund der Funkausbreitung mit einer gewissen Fehlerwahrscheinlichkeit 
immer fehlerhafte Bits enthalten wird. Über die Paritätsbits lassen sich 
zwar Einfachfehler innerhalb jeder Angaben zu Minute, Stunde und Datum 
erkennen, aber die Redundanz innerhalb eines Minutentelegramms alleine 
reicht nicht aus, um Einzelfehler der Übertragung zu korrigieren oder 
Mehrfachfehler zu erkennen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Alex Baumer schrieb:
> für ein Projekt in meinem Studium soll ich ein DCF77-Signal auswerten.
Das allein wäre ja nun eine eher flache Aufgabe, die in einem halben Tag 
erledigt wäre:
http://www.lothar-miller.de/s9y/archives/77-DCF77-Decoder.html

> Wie gehe ich beim Entwicklen von digitalen Filtern vor? Bzw. wie kann
> ich eine "intelligente" eindeutige Erkennung der Signallängen von
> logisch 1 bzw. logisch 0 in VHDL umsetzen?
Da wirds dann interessanter und man darf sich hier ruhig mal Anregungen 
aus der Mikrocontrollerecke holen. Dort wird eine Flanke erst bei 
oftmaligem stabilem Abtasten eines Pegels für gültig erklärt. Damit wäre 
dieser Ansatz geeigneter:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
entity DCF77 is
6
    Generic( fclk : integer := 50000000 ); -- 50MHz
7
--    Generic( fclk : integer := 50000 ); -- 50kHz
8
    Port   ( clk       : in  std_logic; 
9
             dcf       : in  std_logic;
10
             dcf_sec0  : out std_logic;
11
             bitsout   : out std_logic_vector (58 downto 0) );
12
end DCF77;
13
14
architecture Behavioral of DCF77 is
15
constant t10ms     : integer := (fclk/100)-1;        -- 10 ms
16
signal cnt10ms     : integer range 0 to t10ms := 0;  -- Vorteiler 10 ms
17
signal cnt         : integer range 0 to 110 := 0;    -- Zähler bis 110*10ms = 1.1 sec
18
signal dcfsr       : std_logic_vector(3 downto 0);
19
signal dcfakt      : std_logic := '0';
20
signal dcfold      : std_logic := '0';
21
signal bits        : std_logic_vector(58 downto 0):= (others=>'0');
22
begin
23
   process begin
24
      wait until rising_edge(clk);
25
      if (cnt10ms < t10ms) then 
26
         cnt10ms <= cnt10ms+1;
27
      else -- 10ms vorbei
28
         cnt10ms <= 0;
29
         -- Einsynchronisieren und Störpeaks ausfiltern: 
30
         -- nur wenn 3x der selbe Pegel abgetastet wurde, ist er gültig
31
         dcfsr  <= dcfsr(2 downto 0) & dcf;
32
         dcfold <= dcfakt;
33
         if (dcfsr(3 downto 1)="111") then dcfakt <= '1'; end if;
34
         if (dcfsr(3 downto 1)="000") then dcfakt <= '0'; end if;
35
36
         -- Zaehler hochzählen (sättigend bei 1.1 sec)
37
         if (cnt < 110) then cnt <= cnt+1; end if;
38
         
39
         -- steigende Flanke vom DCF-Signal
40
         dcf_sec0 <= '0';             -- für 1 Taktzyklus bei Sekunde 0 aktiv
41
         if (dcfakt='1' and dcfold='0') then 
42
            if (cnt = 110) then       -- Überlauf? ja: Sekunde 59 war da
43
               dcf_sec0 <= '1';       -- Sekunde 0 anzeigen
44
               bitsout <= bits;       -- die gesammelten Daten übergeben
45
               bits <= (others=>'0'); -- Bit-Schiebegregister zuruecksetzen
46
            end if;
47
            cnt <= 0;
48
         end if;
49
      
50
         -- einlesen bei fallender Flanke vom DCF-Signal
51
         if (dcfakt='0' and dcfold='1') then 
52
            if (cnt < 15) then                  -- Grenze 150ms
53
               bits <= '0' & bits(58 downto 1); -- kurzer Impuls: 0 von links einschieben
54
            else
55
               bits <= '1' & bits(58 downto 1); -- langer Impuls: 1 von links einschieben
56
            end if;      
57
         end if;
58
59
      end if;
60
   end process;
61
end Behavioral;
Das "Filtern" ist also nur eine Plausibilitätskontrolle über 30ms: 
solange darf kein anderer Pegel auftreten, dann wird der eingetastete 
Pegel als gültig erkannt und für die weitere Verarbeitung genommen.
Eine weitere "Filterfunktion" steckt in der Abfrage der Dauer eines 
High-Pegels. Ist der High-Pegel irgendwas zwischen 30ms und 140ms, dann 
wird eine '0' erkannt, ab 150ms wird das Bit als '1' erkannt.

Dazu kommt dann noch die Plausibilitätskontrolle mit den erwähnten 
Paritybits für die einzenlen Stellen.

Und zu guter Letzt wäre es noch sinnvoll, die gerade empfangene Minute 
mit der vorhergehenden auf eklatante Unterschiede zu vergleichen und nur 
bei einer plausiblen Abweichung die erkannte Zeit für gültig zu 
erklären.

Insgesamt müssen also einige "Filtermaßnahmen" auf die einzelnen Ebenen 
angewendet werden, bevor ein Telegramm für gültig erklärt werden kann.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.