www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Takterzeugung 4.8 kHz


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

vielleicht kann mir jemand von euch einen gezielten Tip in Sachen 
Taktteilung geben.

Ich suche eine Möglichkeit mit einem Virtex4 FX20 einen Takt von 4.8 kHz 
zu erzeugen. Dieser wird für 2 mal 6-Channel ADCs benötigt. Mit DCMs 
wäre die Sache kein Problem, gibt allerdings einen Haken mit den 
Ausgangssignalen.
Als Ausgangssignal hab ich ein 100MHz (onboard) und ein 1Hz (1PPS von 
GPS) Signal. Mit DCMs komme ich nicht bis 4.8 kHz, da nur ein Faktor von 
maximal 16 möglich ist.

Als Entwicklerboard verwende ich das ML405.

Als Lösung würde ich gerne eine Art Taktteilung auf Basis eines Zählers 
favorisieren. Leider gibts bei 100Mhz zu 4.8 kHz nur ungerade Teiler, 
d.h. ich würde irgendwann Timingfehler bekommen.

Eine weitere Lösung wäre einen 76.8 kHz Oszillator mit aufs Board zu 
bringen. Dann klappts wieder mit ner DCM und dem Faktor 16.

Wäre euch super Dankbar für ein paar Hinweise

Viele Grüße

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> d.h. ich würde irgendwann Timingfehler bekommen.
Müssen die 4.8 kHz sooooooo genau sein?
Mit 100MHz/20833 = 4800,07 Hz sollte das Design schon auch noch laufen.
Oder bringen dich 70 milli Hertz um?
Was wäre dan mit Frequenzschwankungen des Oszillators?
10 ppm sind schon scharfe Anforderungen.

> 76.8 kHz Oszillator mit aufs Board zu bringen.
> Dann klappts wieder mit ner DCM
Lies mal das Datenblatt der DCM. IMHO sind die erst ab x MHz sinnvoll 
einsetzbar. Und wie gesagt: wenn der 76,8kHz-Oszillator 20 ppm 
Abweichung hätte, wärst du gleich weit wie mit dem Teiler.

EDIT:
Du weißt schon, dass man mit einem Zähler Frequenzen auch durch z.B. 23 
teilen kann? Und wie man z.B. einen Teiler durch 20833 macht?

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super schnelle Antwort, danke.

Ich geh noch mal bisschen mehr ins Detail Richtung Anwendung.

Mit den 4.8 kHz werden Stom und Spannung in einem 60Hz 
Wechselspannungsnetz abgetastet. Das sind 80 Abtastungen pro Periode. 
Der Abtastzeitpunkt soll aber nicht mehr als 4us jittern. Wenn ich nun 
den Zähler bis 20833 laufen lasse und dabei die Drittel immer unter den 
Tisch fallen lasse, hätte ich pro Abtastung ein Abweichung von 
-3.3333..ns wenn ich mich nicht irre.  Nach 80 Abtastungen wären das 
dann -266.666..ns, soweit OK. Das 1PPS Signal ist für die 
Synchronisierung zuständig, das kommt immer nach 80*60 Abtastungen. Bis 
dahin hätte ich dann 15.999..us Abweichung in der steigenden Flanke des 
ADC Clock Signals.
Wahrscheinlich müsste ich versuchen aus dem 1PPS bzw 1Hz Signal 
irgendwas schnelleres erzeugen um dann schon eher zu synchronisieren. 60 
Hz wäre optimal, da könnte pro Periode 1 mal synchronisiert werden.
Wie könnte man aus 1Hz 60 Hz erzeugen?

Hab den 20833er Zähler bereits umgesetzt und es stellt sich eine 
Frequenz von 4.799xx kHz ein.
process (SysClk) 
    variable count : integer;
  begin  
    if (SysRst = '1') then
      count := 0;
      Clk_ADC <= '0';
    elsif rising_edge(SysClk) then
      if (count = C_ADC_Clk_Divider_Counter) then
        count := 0;
        Clk_ADC <= not Clk_ADC;
      else
        count := count + 1;
      end if;
    end if;
  end process;

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Hab den 20833er Zähler bereits umgesetzt...Frequenz von 4.799xx kHz...
Der zählt vermutlich um 1 zu weit ;-)
100MHz / 20833 = 4800,0768 Hz
100MHz / 20834 = 4799,8464 Hz

> Wie könnte man aus 1Hz 60 Hz erzeugen?
Das wird dir auch nichts bringen, denn das 1 Hz ist ebenfalls asynchron 
zur Netzfrequenz... :-/

Wenn du es unbedingt sooo genau haben willst:
Zähl einfach 2x auf 20833 und das 3. mal auf 20834. Dann hast du eine 
Frequenz von (4799,0768+4799,0768+4800,8464)/3 = 4800Hz
So z.B.
signal count : integer range 0 to 20384;
signal corr  : integer range 0 to 2;

process (SysClk) 
  begin  
    if (SysRst = '1') then
      corr  <= 0;
      count <= 0;
      Clk_ADC <= '0';
    elsif rising_edge(SysClk) then
      if ( (corr/=0 and count=20833-1) or (corr=0 and count=20834-1) ) then
        count <= 0;
        if (corr=2) then     corr <= 0;
        else                 corr <= corr+1;
        end if;
        Clk_ADC <= not Clk_ADC;
      else
        count <= count + 1;
      end if;
    end if;
  end process;

BTW:
du solltest integer immer mit range angeben, sonst werden 32Bit 
synthetisiert ;-)

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super Sache... werde ich gleich mal implementieren.

Danke auch für den Tipp. :)

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie genau sind denn das 60Hz des Netzes?

Autor: Matthias G. (mgottke)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Stabilität des Taktes und die Grundgenauigkeit eines Quarzes lassen 
eine so exakte Teilung nicht zu. Das mag zwar examplarisch zu einem 
bestimmten Zeitpunkt und bei einer bestimmten Temperatur zutreffen. 
Reproduzierbarkeit, Langzeitstabilität und thermische Stabilität wird 
man dadurch nicht erreichen.

Ich hoffe ich gehe recht in der Annahme, dass das "1pps" aus der 
Netzfrequenz hergeleitet wird. Dass ist es besser die Zeit von einem zum 
anderen "1pps" zu messen (100MHz-Takte zählen) und diesen dann 
rechnerisch für die näschten 80 Messungen einteilen. Das ist dann 
kurzeitstabil und gleicht sowohl die Netz-Frequenzschwankungen als auch 
die Quarzschwankungen aus.

Im übrigen prinzipielle Überlegungen zu der Messaufgabe:
Die Netzfrequenz ist aus sicht der Kraftwerke Lastabhängig. Daher 
schwankt diese über den Tag verteilt sehr. Nur im Langfristigen Mittel 
(über Tage oder sogar Wochen) werden die 50 Hz exakt eingehalten. Wir 
hatten einmal eine Digitaluhr direkt mit den 50 Hz aus dem Trafo 
getaktet aufgebaut. Die hatte über Monate keine Abweichung. Innerhalb 
eines Tages war die Abweichung zeitweise über eine halbe Minute. Daher 
30s = 30 Mio us. Bei 12h in der diese Differenz zustande kahm sind 12h * 
60min  60sec  50Hz = 2,16 Mio Perioden. Daraus ergibt sich eine 
mittlere Abweichung von fast 14us.

"Im Verbundnetz der westeuropäischen Länder darf die Netzfrequenz nur um 
etwa 0,05 Hertz von der 50-Hertz-Norm abweichen", heißt es bei folgender 
Seite:
http://members.magnet.at/alpha-channel/electro/Las...

Das sind immerhin 20us / Periode. Das das nicht so weit hergeholt ist, 
zeit die Uhr. Da muss ich die 4us maximalen Jitter mal grundlegend 
hinterfrage. Vielleicht sollte die Messaufgabe deshalb nicht auf die 
Frequenz sondern auf die Phasenlage bezogen betrachtet werden.

Die Netz- und die Quarzfrequenzen sind von Sekunde zu Sekunde sehr 
stabil und ändern sich nur sehr wenig. Eine Messung des 
Synchronisationsintervalles läßt eine ausreichende 
Genauigkeitsbestimmung für die nächste Periode zu.

Die Lösung des Problems in VHDL:
Zeit Messen in dem man Takte zählt. Dann gibt es zwei 
Lösungsmöglichkeiten:
1. CPU
2. Tabellen (in RAM-Blöcken)

Wahrscheilich ist die letztere die praktikablerere. Es müssen ja "nur" 
alle Frequenzen von 48,95 Hz bis 49,05 Hz abgedeckt werden. Die 
Quarzgenauigkeit spiel da schon keine nennenswerte Rolle mehr. 
Rechnerisch sollten es genau 250 Schritte sein um die 4us einzuhalten. 
Mit einer Tabelle von 512 Werten sollte man also hinreichen genau 
werden.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wahrscheilich ist die letztere die praktikablerere. Es müssen ja "nur"
> alle Frequenzen von 48,95 Hz bis 49,05 Hz abgedeckt werden.
Es ist ein 60Hz-Netz  ;-)

>> Mit den 4.8 kHz werden Stom und Spannung in einem 60Hz
>> Wechselspannungsnetz abgetastet. Das sind 80 Abtastungen pro Periode.
> Vielleicht sollte die Messaufgabe deshalb nicht auf die
> Frequenz sondern auf die Phasenlage bezogen betrachtet werden.
Unbeantwortet ist z.B. die Frage, warum die Abtastzeitpunkte so 
dermaßen genau an jeweils derselben Stelle sein müssen. Ich würde z.B. 
ganz pragmatisch die Zeit zwischen zwei Nulldurchgängen ermitteln, und 
dann die 80 Messungen (warum so ein unbinärer Wert? Von 360° kann der 
kaum kommen...) so aufteilen, dass die nächste Halbwelle phasengenau von 
Nulldurchgang bis Nulldurchgang mit 80 Messungen erfasst wird.

> Zeit Messen in dem man Takte zählt.
Und den ermittelten Wert durch 80 teilen, fertig.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wunderschönen Guten Morgen, ich bedanke mich nochmal für die zahlreichen 
Antworten.

Das 1PPS Signal stammt von einem GPS-Empfänger und ist auf 1us genau. 
Das Signal aus den 50 bzw. 60 Hz zu nehmen macht ja keinen wirklichen 
Sinn. Es soll ja Strom und Spannung (aller 3 Phasen) überwacht werden. 
Evtl muss zur Synchronisierung (80 Samples pro Periode) die 50 oder 60 
Hz herangezogen werden.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier kommt die ganze Geschichte übrigens her:
http://sharepoint.ucausersgroup.org/helpdesk/Lists...

Autor: Matthias G. (mgottke)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Das 1PPS Signal stammt von einem GPS-Empfänger und ist auf 1us genau.

Das Hilft Dir dann leider nichts

> Das Signal aus den 50 bzw. 60 Hz zu nehmen macht ja keinen wirklichen
> Sinn. Es soll ja Strom und Spannung (aller 3 Phasen) überwacht werden.

Das GPS hift vielleicht einen exakten Zeitstempel der Messung zuordnen 
zu können, aber um eine Synchronisation zu den 50Hz, bzw. 60Hz kommst Du 
nicht herum. Auch bei einem 3-Phasensystem kann man auf eine Phase 
synchronisieren. Die beiden anderen Phasen laufen ja nicht weg. Sonnst 
Misst Du alles, nur nicht eine Phase.

> Evtl muss zur Synchronisierung (80 Samples pro Periode) die 50 oder 60
> Hz herangezogen werden.

Nicht nur evtl..

Autor: Bernd G. (Firma: LWL flex SSI) (berndg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Mit DCMs komme ich nicht bis 4.8 kHz, da nur ein Faktor von
 maximal 16 möglich ist.

100 MHz durch 25 gleich 4 MHz. Mit DCM mal 6 gleich 24 MHz. Dann durch 
5000
teilen. Das Ergebnis müsste dann eigentlich 4,8 kHz lauten (und nicht 
42,
wie ansonsten).

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist ein interessanter Ansatz, leider klappts bei mir nicht. Der Ausgang 
CLKFX der PLL (DCM_Base) gibt keinen Mux von sich. CLKIN ist alles da...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.