Forum: Mikrocontroller und Digitale Elektronik reziproker 50-Hz Netzfrequenz-Zähler; AVR-assembler


von Christian S. (roehrenvorheizer)


Angehängte Dateien:

Lesenswert?

Hallo Allerseits,

ich habe hier mit dem AT90S2313 einen reziproken Frequenzzähler zur 
Messung der 50 Hz der Netzfrequenz aufgebaut und programmiert.
Der Brumm wird vom Trafo über Kondensator und Schmitt-Trigger aus zwei 
Transistoren bereit gestellt und dem 16-Bit Timer1 gegeben.
Die Überläufe werden in zwei weiteren Registern aufsummiert.
Das vollständige Programm zeigt mir den Messwert, also die aufsummierten 
Zählpulse während einer Messung sowie den reziproken Wert an,
also eine passende große Zahl dividiert durch den 4-Byte breiten 
Messwert ergibt ungefähr 50,000 Hz mit Nachkommastellen. Quarzfrequenz 
ist 5 MHz.
Ich habe die Wahl, ob nur eine Periode, zehn Perioden oder 100 Perioden 
zur Messung heran gezogen werden, indem einfach die Flankenerkennung
die Perioden mitzählt bis zur gewünschten Anzahl.

Nun habe ich die Ausgabe verglichen mit den zwei, drei im Internet 
verfügbaren online-Anzeigen, die allesamt drei Nachkommastellen bieten 
und untereinander ziemlich genau überein stimmen.
https://www.netzfrequenz.info/    (zwei Sekunden Intervall)
https://www.netzfrequenzmessung.de/  (eine Sekunde Intervall)
https://50hz.ewelt.net  mit STM32  (tendentiell immer geringerer Wert 
als die anderen beiden, 4 Nachkommastellen)

Es zeigt sich, daß mein Programm in etwa das gleiche anzeigt, jedoch 
immer etwas mehr, nämlich in der dritten Nachkommastelle etwa 3 zu viel, 
gestern 5 zu viel . Das bedeutet, daß der Messwert zu klein sein muß.

Wo könnte ich denn beim Zählen der vorbei kommenden Flanken einen Fehler 
gemacht haben? Klar ist, die Befehle für Sprung und Abfrage brauchen 
immer ein, zwei Takte, um zu reagieren. Könnte es sein, daß bei 100 
Perioden 100 Flanken zu wenig unter kommen?

Anbei ein Minimalprogramm mit Flankenerkennung und Timer1.

Vielleicht blickt diesbezüglich jemand durch und kann behilflich sein.
Danke im Voraus.

mit freundlichem Gruß

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


Lesenswert?

Wie genau ist denn dein Quarz am uC?

von Christian S. (roehrenvorheizer)


Lesenswert?

Ich kann nur mit dem Rigol-DSO vergleichen, das noch nicht warm gelaufen 
ist: 4,99962 MHz zeigt es an, direkt am Pin4. Das belastet zusätzlich.
Ja, man müßte ein Programm verwenden, das den Takt an einem Pin 
ausgibt,habe ich gerade nicht parat. Kommt noch. An den Quarz denke ich 
natürlich zuletzt.

mfg

von S. Landolt (Gast)


Lesenswert?

Also für mich ist das in Ordnung:

> in der dritten Nachkommastelle etwa 3 zu viel, gestern 5 zu viel
Das sind also, bei Sollwert 50.000, 60 resp. 100 ppm.

> 4,99962 MHz zeigt es an
Das entspricht 76 ppm.

von S. Landolt (Gast)


Lesenswert?

Das Programm selbst ist wohl in Ordnung. Zwar ein gewöhnungsbedürftiger 
Stil, besonders die '20 warnings', aber okay.

von Christian S. (roehrenvorheizer)


Lesenswert?

Danke fürs Drüberschauen. Habe es mit wavrasm assembliert, da läuft es 
ohne Fehler durch.

MfG

von S. Landolt (Gast)


Lesenswert?

Ich habe das mal laufen lassen (mit aktiviertem 'ldi temp2, 0'), auf 
einem ATtiny2313: Takt von einem 5 MHz-Quarz, dahinter eine Teilerkette 
auf 50 Hz, diese auf Pin D5 gelegt, führt zu zwei wechselnden 
Zählerständen: 10000002 und 10000005.

von Wolfgang (Gast)


Lesenswert?

Wie sieht denn die Aufbereitung des 50Hz-Analogsignals aus?

Insbesondere sollte man einen guten Blick auf die Bandbreite des 
Vorfilter haben, damit Transienten auf dem Netz die Flankenerkennung 
nicht stören (Jitter).

Wie sieht die statistische Verteilung der Einzelmesswerte aus?

von S. Landolt (Gast)


Lesenswert?

Ein Problem besteht darin, dass ohne Input-Capture gearbeitet wird: 
tritt die Flanke an D5 zu Beginn der Timer1-Overflow-ISR auf, dauert es 
über 30 Takte bis zur Reaktion. Bei den derzeitigen 100 Durchläufen mag 
das okay sein, bei 10, die ja auch, alternativ, im Programm stehen, 
wären es über 30 ppm Fehler.

von Christian S. (roehrenvorheizer)


Lesenswert?

Wolfgang schrieb:
> Wie sieht denn die Aufbereitung des 50Hz-Analogsignals aus?

Nur mittels Schmitt-Trigger aus zwei Transistoren und Hysterese.

>
> Insbesondere sollte man einen guten Blick auf die Bandbreite des
> Vorfilter haben, damit Transienten auf dem Netz die Flankenerkennung
> nicht stören (Jitter).

Vorfilter ist keines drinnen, wenn der Trafo noch was durch läßt. Also 
müßte noch ein Resonanzkreis oder mehrstufiger TP für 50 Hz dazu?
>
> Wie sieht die statistische Verteilung der Einzelmesswerte aus?

Über sie kann ich gar keine Aussage treffen. Das ginge nur, wenn sie 
sofort per UART schnell genug ausgegeben würden oder erst im SRAM landen 
zur späteren Ausgabe.

mfg

von Wolfgang (Gast)


Lesenswert?

Christian S. schrieb:
> Das ginge nur, wenn sie
> sofort per UART schnell genug ausgegeben würden oder erst im SRAM landen
> zur späteren Ausgabe.

Bei 50Hz hast du dafür 20ms Zeit.
Bei gemütlichen 9600Bd kannst du also pro Periode 10 Zeichen mit großer 
Pause übertragen. Selbst in ASCII würde das für eine Auflösung von 
0.0001ppm reichen ;-)

von S. Landolt (Gast)


Lesenswert?

Eine gewisse Verbesserung, falls Sie nicht auf Input-Capture umsteigen 
wollen, brächte die Beschleunigung der ISR:
1
          ;Interrupttabelle:
2
3
rjmp  Initial    ; nach RESET zum Hauptprogramm
4
5
.org OVF1addr
6
    push    temp1
7
    in      temp1,SREG
8
    inc     over_low
9
    brne    hopp
10
     inc    over_high
11
hopp:
12
    out     SREG,temp1
13
    pop     temp1
14
    reti
15
16
Initial:
Die 'over_low/high' in den oberen Arbeitsregisterbereich zu legen, 
sparte einen weiteren Takt (subi sbci).
  Was mich betrifft, so würde mir die damit erreichte Genauigkeit 
genügen, z.B. bei 100 Durchläufen, d.h. 2 s-Messintervall.

von OldPapa (Gast)


Lesenswert?

gibt es auch ein aktuelles Projekt in "C" ?
Oder auch Arduino?
Zum Nachbauen.

von S. Landolt (Gast)


Lesenswert?

... Ein Arbeitsregister für das Sichern von SREG zu reservieren, brächte 
vier weitere Takte (kein push pop).

von OldPapa (Gast)


Lesenswert?

Wolfgang schrieb:
> Insbesondere sollte man einen guten Blick auf die Bandbreite des
> Vorfilter haben, damit Transienten auf dem Netz die Flankenerkennung
> nicht stören (Jitter).

Das würde auch prima in Software gehen...
Nicht "mögliche Frequenzen" rauswerfen und Mittelwert über 50 oder 100 
Messungen bilden.
Flankenjitter wäre damit eliminiert.

von Christian S. (roehrenvorheizer)


Lesenswert?

S. Landolt schrieb:
> Ich habe das mal laufen lassen (mit aktiviertem 'ldi temp2, 0'), auf
> einem ATtiny2313: Takt von einem 5 MHz-Quarz, dahinter eine Teilerkette
> auf 50 Hz, diese auf Pin D5 gelegt, führt zu zwei wechselnden
> Zählerständen: 10000002 und 10000005.

Das ldi temp2, 0 muß dazu wieder im Queltext sein.
Verstehe ich das richtig, daß der Tiny2313 die 5 MHz Quarztakt bekommt 
und extern dieser Takt auf 50 Hz herunter geteilt wird, um phasenstarr 
verkoppelt in den PD5 zu gelangen? Dann ergeben sich also die um 2 oder 
5 erhöhten Zählerstände, die tendentiell zu einem kleineren Ergebnis 
nach der Division führen müßten.

Das Projekt hier sollte mich nach 15 Jahren wieder mit Assembler 
vertraut machen und ich wollte einige Feinheiten der Timer nacheinander 
ausprobieren. Ich hatte von früher noch etliche Code-Bausteine und 
Übungsprojekte in der Hinterhand. Input capture wäre dann meine nächste 
Baustelle.

mfG

von S. Landolt (Gast)


Lesenswert?

> Verstehe ich das richtig ...

Ja.
Ich hatte dann noch, da es ja bei mir ein ATtiny2313 ist, mit dem Timer0 
ein niederfrequentes Signal auf/für D5 erzeugt, und da gab es dann eine 
Erhöhung um 34.

von Erbsenzähler (Gast)


Lesenswert?

Hallo,

ein interessantes Thema.
Es gibt Konzepte, bei denen als Zeitbasis/ Referenz eine Dallas RTC oder 
auch gleich ein GPS Empfänger genutzt wird.

Kann jemand  die Messgenauigkeit im Vergleich zu der hier vorgestellten 
Lösung beurteilen oder gar “vorrechnen”?

Danke

von Udo (Gast)


Lesenswert?

Warum in assembler? Das schränkt doch nur den potentiellen Nutzerkreis 
unnötig ein.

Kopfschüttel...

von Erbsenzähler (Gast)


Lesenswert?

Udo schrieb:
> Warum in assembler? Das schränkt doch nur den potentiellen Nutzerkreis
> unnötig ein.
>
> Kopfschüttel...

Aha,
Kopfschüttel

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.