Forum: Mikrocontroller und Digitale Elektronik Frequenzzähler mit atmega48


von Lukas (Gast)


Lesenswert?

Hallo,

gibt es für den Frequenzzähler hier:

http://www.ebay.de/itm/Profi-1-500MHz-Hohe-Genauigkeit-Frequenzzahler-Prufvorrichtung-Mess-Meter-Zahler-/131693166348?hash=item1ea9863f0c:g:cB4AAOSwaA5Wi4A5

eine alternative Software, oder die bestehende Software irgendwo?

Der Controller ist ein Atmega48

: Verschoben durch Moderator
von Karl M. (Gast)


Lesenswert?

Hast Du einen Schaltplan,

dann schreibe ich Dir eine neue Firmware, wenn ich so eine Musterplatine 
hätte.

von Karl M. (Gast)


Lesenswert?

Hallo Lukas ,

es wird wohl Timer1 mit Input T1, bei 20MHz ext. Takt und ein 1:64 
Vorteiler verwendet.
Dadurch kann man einen schönen reziproken Frequenzzähler programmieren.
Ich würden den einfachen Quarz noch gegen einen 20MHz TCXO oder OCXO 
ersetzen.

Das LCD ist ein ein 8 Zeichen x 2 Zeilen organisiert, wenn es keinen 
exotischen Chip hat, ist die Ansteuerung kein Problem.

Bei Ebay findet man unter "8 x 2 LCD Modul 0802 Zeichen" ein 
vergleichbares Modul.
http://www.ebay.de/itm//252658879655
Betriebsspannung: 5V
Hintergrundbeleuchtung
Anzeige Format: 8 Zeichen x 2 Zeilen
Charakter Groesse: 2,96 x 5,56 mm
Controller-IC: KS0066U

von m.n. (Gast)


Lesenswert?

Lukas schrieb:
> gibt es für den Frequenzzähler hier:
>
> Ebay-Artikel Nr. 131693166348
>
> eine alternative Software,

Was soll die neue Software denn anders machen?

Karl M. schrieb:
> es wird wohl Timer1 mit Input T1, bei 20MHz ext. Takt und ein 1:64
> Vorteiler verwendet.
> Dadurch kann man einen schönen reziproken Frequenzzähler programmieren.

Bei der angegebenen Auflösung von (nur) 100 Hz vermute ich eher einen 
torgesteuerten Ereigniszähler, der sich ohne input-capture-Eingang kaum 
zum reziproken Zähler umbauen läßt.

von Zweifler (Gast)


Lesenswert?

m.n. schrieb:
> Was soll die neue Software denn anders machen?

Immer bis zum Ende des Satzes lesen ...

Lukas schrieb:
> eine alternative Software, _oder die bestehende Software irgendwo?_

Klingt so, als ob er den Zähler nachbauen und den Controller dafür 
(natürlich) mit irgendwas Lauffähigem flashen muss.

von Alexander S. (alesi)


Lesenswert?

Zweifler schrieb:
> Klingt so, als ob er den Zähler nachbauen und den Controller dafür
> (natürlich) mit irgendwas Lauffähigem flashen muss.

Beispiele für Frequenzzähler mit ATmega findet man z.B.
im AVR Softwarepool 
https://www.mikrocontroller.net/articles/AVR_Softwarepool#Frequenzmesser

von m.n. (Gast)


Lesenswert?

Zweifler schrieb:
> m.n. schrieb:
>> Was soll die neue Software denn anders machen?
>
> Immer bis zum Ende des Satzes lesen ...

Das ändert nichts an meiner Frage.

von Karl M. (Gast)


Lesenswert?

Hallo,

m.n. schrieb:
> Bei der angegebenen Auflösung von (nur) 100 Hz vermute ich eher einen
> torgesteuerten Ereigniszähler, der sich ohne input-capture-Eingang kaum
> zum reziproken Zähler umbauen läßt.

Ich habe mir gestern Abend noch einen Schaltplan von der Baugruppe 
abgeleitet.
Das geteilte (1:64) Zählersignal gelangt über T1 in die Zählregister von 
Timer1. Über Timer0 oder Timer2 kann man dann eine Zeitbasis herleiten.
Die 8x2 LCD-Ansteuerung und die zugehörige Pinbelegung muss man noch 
ausmessen - auch kein Akt.

Falls nun das 8x2 LCD keine negative Konstrastspannung benötigt, die man 
i.a. über einen TimerN mit negativer Ladungspumpe erzeugen kann, werden 
dann auch nur insgesamt 2 Timer belegt.

Die 100Hz Auflösung kommen u.a. durch den normalen Quarz und von der 
begrenzen Stellenanzahl auf dem 8x2 LCD.
Zeile 1: "500.0000"
Zeile 2: "   MHZ  "

von m.n. (Gast)


Lesenswert?

Karl M. schrieb:
> Die 100Hz Auflösung kommen u.a. durch den normalen Quarz und von der
> begrenzen Stellenanzahl auf dem 8x2 LCD.
> Zeile 1: "500.0000"
> Zeile 2: "   MHZ  "

Die Auflösung hängt nicht vom Quarz ab und mit dem Display kann ich mir 
auch andere Frequenzen anzeigen lassen wie z.B.:
Zeile 1: "500.1234"
Zeile 2: "   Hz   "

von Lurchi (Gast)


Lesenswert?

Wenn das Signal über den T1 Eingang rein kommt, ist die HW nicht so gut 
für einen Reziprokzähler geeignet. Ein Receporkzähler würde das Signal 
am ICP Eingang oder ggf. noch Ersatzweise an einem der analogen 
Eingänge, notfalls dem Koparator haben wollen.

Beim klassischen Zähler ist halt die Auflösung begrenzt, vor allem bei 
niedriger Frequenz.

von Kolja (Gast)


Lesenswert?

Lurchi schrieb:
> Receporkzähler
...
> Koparator

Wassn das? :-)

von Karl M. (Gast)


Lesenswert?

Hallo,

nun dann, schreibst Du aus eigener Erfahrung ?
Ich habe schon verschiedenste reziproke Frequenzzähler programmiert und 
den ICP Eingang von Timer1 benötige ich dabei nicht.

Lurchi schrieb:
> Wenn das Signal über den T1 Eingang rein kommt, ist die HW nicht
> so gut
> für einen Reziprokzähler geeignet. Ein Receporkzähler würde das Signal
> am ICP Eingang oder ggf. noch Ersatzweise an einem der analogen
> Eingänge, notfalls dem Koparator haben wollen.
>
> Beim klassischen Zähler ist halt die Auflösung begrenzt, vor allem bei
> niedriger Frequenz.

von m.n. (Gast)


Lesenswert?

Karl M. schrieb:
> Ich habe schon verschiedenste reziproke Frequenzzähler programmiert und
> den ICP Eingang von Timer1 benötige ich dabei nicht.

Dann mußt Du allerdings deutliche Abstriche bei der Genauigkeit 
hinnehmen. Elegant ist das nicht.

von Karl M. (Gast)


Lesenswert?

Hallo m.n.

"viele Wege führen nach Rom": und da du den Ansatz nicht kennst und 
voreilig schon negative Schlüsse zieht, möchte ich Dich auf die 
Implementierung des "Reziproker Frequenzzähler + Optimierte 64 Bit UInt 
Routinen" von Matthias Hopf hinweisen:

Beitrag "Reziproker Frequenzzähler+ Optimierte 64bit uint Routinen"

Und jetzt schreibe bitte nicht, dass man noch einen INTx Eingang o.ä. 
benötigt, ja so ist das. :-)

von m.n. (Gast)


Lesenswert?

Stimmt, kenne ich nicht. Ich habe kein Programm installiert und auch 
keinen Bedarf, um .tgz zu öffnen.
In der Beschreibung steht etwas von 10 ppm Auflösung. Das sind gerade 5 
Stellen. Da gibt es eine Schaltung, die das gleich für 4 Kanäle macht: 
http://mino-elektronik.de/fmeter/fm_software.htm#bsp4

Wozu denn irgendwelche 64 Bit Routinen erfinden, wenn man doch einfach 
und schnell - wie zuvor gezeigt - mit float rechnen kann?
Die Referenzfrequenz grundlos ohne Timer-capture zu erfassen, ist 
schlechtes Design, als wenn man die FPU im µC links liegen läßt und 
durch Software emuliert.

von c-hater (Gast)


Lesenswert?

Karl M. schrieb:

> "viele Wege führen nach Rom": und da du den Ansatz nicht kennst und
> voreilig schon negative Schlüsse zieht

Das ist NICHT voreilig.

> möchte ich Dich auf die
> Implementierung des "Reziproker Frequenzzähler + Optimierte 64 Bit UInt
> Routinen" von Matthias Hopf hinweisen:

Der gute Mann hat sich zwar sehr bemüht, aber er kann auch nicht 
zaubern. Das ist nix Schlimmes: schließlich kann das niemand.

...

Es gibt beim AVR8 genau zwei Möglichkeiten, die Flanken eines zu 
messenden Signals mit einer (weitaus höheren) Referenzfreqenz zu 
vergleichen, reine Software oder die Verwendung der 
Timer-Capture-Peripherie.

Letztere ist in der Lage, die Flanken mit der Genauigkeit von einer 
Periode der Referenzfrequenz (Systemtakt) zu erfassen, Software ist in 
jedem Fall deutlich ungenauer, weil man in einem Takt kein sinnvolles 
Programmstück abarbeiten kann, was die notwendigen Funktionen leistet. 
Sie braucht schonmal zwei Takte, um überhaupt eine Endlosschleife 
konstruieren zu können, mit drei Takten schafft sie dann eine Schleife 
mit Abbruchmöglichkeit. Das aber ist das absolute Minimum, was diese 
Meßaufgabe an Funktionalität von der Software erfordert.

Woraus sich ganz unmittelbar der Schluss ziehen läßt, das eine reine 
Softwarelösung (maximal) ein Drittel der Genauigkeit haben kann. 
Tatsächlich sieht das in realen Implementierungen noch deutlich 
schlechter aus, zumal in C. Also auch in der des Herrn Hopf...

Wie auch immer, der einziger Ausweg der Software ist: Messungen zu 
mitteln. D.h.: sie muss deutlich öfter messen als die Hardwarelösung, um 
die gleiche Genauigkeit erreichen zu können. Was unmittelbar heißt: sie 
kann nur deutlich seltener einen gleich genauen Meßwert liefern.

Dazu kommt dann noch die Interaktion über das Timing mit dem Rest der 
Software, die eventuell auf dem gleichen Controller laufen muss. Das ist 
oft noch ein viel größeres Problem...

Das einzige, was also Lösungen wie die des Herrn Hopf eine gewisse 
Existenzberechtigung zu verleihen vermag, ist die Tatsache, dass sie 
auch ohne Capture-Hardware funktionieren. Was allerdings spätestens dann 
kein substantieller Vorteil mehr ist, wenn man entsprechende Hardware 
einfach mal hat...

...

Aber klar, wenn es nur darum geht, das Ergebnis über ein Display an 
einen Menschen auszuliefern, ist das alles Pillepalle. Dann hat man 
unzählige Takte zur Verfügung und kann ewig viele Samples mitteln, bevor 
ein Update des Displays irgendeinen Sinn ergibt. Schlicht, weil ein 
Mensch Grenzen bei der Wahrnehmung hat. Öfter als mit 2..4Hz braucht man 
eine mehrstellige Digitalanzeige einfach mal nicht aktualisieren, weil 
es sowieso keiner mehr hinreichend schnell ablesen könnte...

von Karl M. (Gast)


Lesenswert?

Hallo m.n. und c-hater,

ich lese eure fachlichen Beiträge häufig mit und gerade was die 
Assemblerprogrammierung angeht freue ich mich immer neue Ideen von Dir 
c-hater auf zugreifen.

Nur leider irrt ihr beide in der Funktionsweise des
"Reziproker Frequenzzähler + Optimierte 64 Bit UInt Routinen" von 
Matthias Hopf.

Wir er im ersten Beitrag zeigt, wird gerade nicht nur ein Takt des 
Eingangssignals lang der Systemtakt gezählt, sondern mehrere Perioden.

Er schreibt:
--------------------------------------
Ein reziproker Frequenzzähler zählt sowohl die Zyklen des Systemtakts,
als auch die der 1-0-Übergänge des Eingangssignals.
Der Zählerstart erfolgt an einem 1-0-Übergang, und endet nach einer 
minimalen Samplingzeit (500ms hier) wieder an einem 1-0-Übergang. Da das 
ganze in Software realisiert wird, kann ein Interrupt zu genau dem 
falschen Zeitpunkt die Genauigkeit reduzieren - das README erklärt, wie 
ich auf die 10ppm komme. Die Berechnung ist nicht trivial, da könnten 
also auch noch Fehler enthalten sein.

Nach dem Zählen hat man zwei Zahlen: n_CLK (Taktzahl bei einer 
Taktfrequenz f_CPU) und n_EVT (Anzahl an 1-0-Übergängen).
Die Frequenz ergibt sich dann als:

   f = n_EVT * f_CPU / n_CLK
--------------------------------------

Somit wird der TimerN als Hardwarezähler mit Softwareerweiterung auf 
32Bit benutzt der die 1-0-Übergänge des Messsignal zählt.
Nach Ablauf der Messzeit wird über einen Interrupt Eingang (INTn) der 
Letzte 1-0-Übergang als Stoppzustand gewertet.
Der nächste 1-0-Übergang entsprechen als Startzustand, usw.
Man kann natürlich auch beides miteinander verbinden.

von c-hater (Gast)


Lesenswert?

Karl M. schrieb:

> Somit wird der TimerN als Hardwarezähler mit Softwareerweiterung auf
> 32Bit benutzt der die 1-0-Übergänge des Messsignal zählt.

Genau das ist der Knackpunkt, wie ich dir oben zu erklären versuchte.

Man muss über etliche Perioden der Messfrequenz messen, um zu einem 
brauchbaren Ergebnis zu kommen. Benutzt man die Capture-Hardware, 
braucht man nur eine einzige Periode.

Jetzt begriffen?

von m.n. (Gast)


Lesenswert?

Karl M. schrieb:
> Nach dem Zählen hat man zwei Zahlen: n_CLK (Taktzahl bei einer
> Taktfrequenz f_CPU) und n_EVT (Anzahl an 1-0-Übergängen).
> Die Frequenz ergibt sich dann als:
>
>    f = n_EVT * f_CPU / n_CLK
> --------------------------------------

Das ist bekannt ;-)
http://mino-elektronik.de/Archiv/Elektronik25_1984.pdf

c-hater schrieb:
> Benutzt man die Capture-Hardware,
> braucht man nur eine einzige Periode.

Nein, nur bei Frequenzen unterhalb der Anzeigerate <= 10 Hz. Erklärung 
siehe zuvor.
Die Capture-Funktion erhöht die Auflösung (und damit die potentielle 
Genauigkeit) und sorgt dafür, die eff. Messzeit unabhängig von 
Programmlaufzeiten zu erfassen. Damit sind genaue Messungen möglich, 
auch wenn die Anzeige im Multiplex betrieben wird oder andere Interrupts 
jederzeit den Programmablauf unterbrechen können.

von Karl M. (Gast)


Lesenswert?

Hallo Lukas,

jetzt hast Du dich gar nicht mehr gemeldet. Warum nicht?

Meine Platine ist eingetroffen, das Programm (also die Firmware) ist 
geschrieben, die fehlerhafte Hardware wurde überarbeitet und nun ist der 
Frequenzzähler wieder brauchbar.

mino-fm (m.n.) hatte dazu auch schon etwas geschrieben:

https://www.eevblog.com/forum/projects/ten-dollar-pic-100khz-2-4ghz-frequency-counter-thread-2/msg1030544/#msg1030544

von Pandur S. (jetztnicht)


Lesenswert?

> m.n.
> Wozu denn irgendwelche 64 Bit Routinen erfinden, wenn man doch einfach
und schnell - wie zuvor gezeigt - mit float rechnen kann?

float, dh 32 bit float, hat 24 bit Mantisse und bringt daher nur 
vielleicht 6 dezimale Stellen. AVR haben ueblicherweise keine 64 bit 
floats. Weil es niemand fuer noetig fand diese zu implementieren.

von m.n. (Gast)


Lesenswert?

Sapperlot W. schrieb:
> float, dh 32 bit float, hat 24 bit Mantisse und bringt daher nur
> vielleicht 6 dezimale Stellen.

Der große Vorteil von float ist es, nicht bei jeder Rechenoperation neu 
skalieren zu müssen, um Über- bzw. Unterläufe abzufangen. Und wenn man 
die "beschränkten"6-7 Stellen Genauigkeit erhalten möchte, braucht man 
schon mindestens einen TCXO-Takt. Für die hiesige Anwendung also völlig 
ausreichend.

> AVR haben ueblicherweise keine 64 bit
> floats. Weil es niemand fuer noetig fand diese zu implementieren.

AVRs können von sich aus auch keine 32 bit float, da ihnen die FPU 
fehlt. Um Deine Unwissenheit ein wenig aufzuhellen: 
http://mino-elektronik.de/fmeter/fm_software.htm#bsp2
Hier wird double mit einem AVR gerechnet, was der verwendete Compiler 
schon seit knapp 20 Jahren direkt unterstützt.

von Doublechecker (Gast)


Lesenswert?

m.n. schrieb:
> Hier wird double mit einem AVR gerechnet

So so ... du glaubst mit double rechnen zu lassen weil
du double hinschreibst?

m.n. schrieb:
> was der verwendete Compiler
> schon seit knapp 20 Jahren direkt unterstützt.

Nicht dass ich wüsste. Es sei denn du hast einen ganz
besonderen Compiler.

Wünschen kann man sich viel. Aber nicht alles was man
glaubt ist auch die Wahrheit.

von Karl M. (Gast)


Lesenswert?

Guten Morgen,

Ja, dieses Programm wurde von m.n. mit dem IAR-KickStart geschrieben und 
übersetzt, der kann 64 Bit double float.

http://www1.futureelectronics.com/doc/IAR%20SYSTEMS/EWAVR.pdf

Siehe:  64-bit IEEE-compatible floating-point arithmetic

Ich zolle m.n. Respekt er weis von was er schreibt, durch seine vielen 
Jahre Praxis. :-)

Doublechecker schrieb:
> m.n. schrieb:
>> Hier wird double mit einem AVR gerechnet
>
> So so ... du glaubst mit double rechnen zu lassen weil
> du double hinschreibst?
>
> m.n. schrieb:
>> was der verwendete Compiler
>> schon seit knapp 20 Jahren direkt unterstützt.
>
> Nicht dass ich wüsste. Es sei denn du hast einen ganz
> besonderen Compiler.
>
> Wünschen kann man sich viel. Aber nicht alles was man
> glaubt ist auch die Wahrheit.

von m.n. (Gast)


Lesenswert?

Doublechecker schrieb:
> m.n. schrieb:
>> was der verwendete Compiler
>> schon seit knapp 20 Jahren direkt unterstützt.
>
> Nicht dass ich wüsste. Es sei denn du hast einen ganz
> besonderen Compiler.
>
> Wünschen kann man sich viel. Aber nicht alles was man
> glaubt ist auch die Wahrheit.

Unter dem obigen Link findet sich der Quellcode nebst Kommentaren 
bezüglich Funktion und verwendetem Compiler. Das zu lesen, wäre recht 
schnell gegangen. Mit etwas mehr Einsatz, hättest Du das alles auf 
eigenem System nachvollziehen können.
Insofern verstehe ich Deine Ignoranz nicht.

Karl M. schrieb:
> Ich zolle m.n. Respekt er weis von was er schreibt, durch seine vielen
> Jahre Praxis. :-)

Ich vermute, Du brauchst noch meine Bankverbindung?
;-)

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.