Moin,
wie der Betreff schon sagt, möchte ich sehr niedrige Frequenzen mit dem
Mikrocontroller messen. Die maximale Messfrequenz liegt bei 15Hz und die
niedrigste Frequenz bei 9Hz. Das Signal sind Rechteckimpulse von einem
Durchflussmesser.
Ich kenne die Methode mit der definierten Torzeit, in der die Impulse
innerhalb dieser Torzeit gezählt werden und die Zeit zwischen dem ersten
und letzten Impuls gemessen wird.
Den Takt erhält der Mikrocontroller über einen ext. 8MHz Quarzoszi. Es
wird ein 16-Bit Timer verwendet. Mit dem größten Teiler, erreiche ich
eine Torzeit von 524,288 ms (8MHz/64). Damit erreiche ich eine Auflösung
von 2Hz...
Ist es da sinnvoller mehrere Perioden zwischen zwei Impulsen zu messen,
z.B. 5 Perioden (sind dann 556ms Messzeit, die Änderung des
Volumenstromes ist ja sehr träge)? und dann aus den Mittelwert die
Frequenz zu berechnen?
Was ist da genauer? Die Frequenzmessung mit der
Torzeit/Impulsfolgen-Methode oder die Periodendauermessung?
Grüße Daniel
Daniel schrieb:> Was ist da genauer? Die Frequenzmessung mit der> Torzeit/Impulsfolgen-Methode oder die Periodendauermessung?
Es kommt darauf an, wie lange du auf ein sinnvolles Ergebnis warten
willst/kannst. Die Periodendauermessung gibt dir eben schon nach der
ersten Messung ein Ergebnis. Für die Torzeit/Pulse zählen Methode musst
du ein wenig (nämlich die Torzeit) warten.
Prinzipiell geht natürlich beides, bei so langsamen Signale nehme ich
eher die Periodendauermessung und bilde dann Mittelwerte wegen Jittern
der Flanken.
Ok, die Auflösung ist bei beiden Verfahren gleich, da ich bei beiden
Methoden bis 524,288ms messen kann.
Der Durchfluss wird einmal konstant auf 4ml/s eingestellt, wäre bei mir
eine Frequenz von 8,35 Hz.
Hm, wenn ich das richtig verstanden habe, bin ich doch umso genauer,
wenn ich Frequenzen messe, bei der ich im Bereich des Zählerendwertes
liege?
Wäre es da sinnvoller, bei einem konstanten Durchfluss den messbaren
Frequenzbereich einzuschränken, um genauer zu messen?
@ Daniel (Gast)
>Ok, die Auflösung ist bei beiden Verfahren gleich, da ich bei beiden>Methoden bis 524,288ms messen kann.
Falsch. Bei derartig niedrigen Frequenzen ist die Periodendauermessung
deutlich besser. Schneller als auch mit höherer Auflösung.
>Wäre es da sinnvoller, bei einem konstanten Durchfluss den messbaren>Frequenzbereich einzuschränken, um genauer zu messen?
Nein.
Daniel schrieb:> Ok, die Auflösung ist bei beiden Verfahren gleich, da ich bei beiden> Methoden bis 524,288ms messen kann.
Jein.
Die absolute Auflösung wird durch deine Referenzfrequenz festgelegt. Mit
8MHz bekommst du eine Zeitauflösung von 125ns.
> Der Durchfluss wird einmal konstant auf 4ml/s eingestellt, wäre bei mir> eine Frequenz von 8,35 Hz.
Zur Messung der Frequenz mußt du mindestens eine Periode ausstoppen.
Bei 8.35Hz sind das knapp 969697 (fast 1 Million) Impulse deiner 8MHz
Referenzfrequenz. Die Auflösung ist dann knapp 6 Dezimalstellen. Wenn
die Meßfrequenz niedriger wird, steigt die Anzahl der Impulse und damit
die (relative) Auflösung. Wird die Meßfrequenz höher, dann sinkt die
relative Auflösung.
Frequenzzähler für hoch variable Meßbereiche verwenden wie Mino oben
schon sagte das Reziprokmeßverfahren. Das kann man sich am einfachsten
so vorstellen, daß nicht die Länge einer einzelnen Periode gemessen
wird, sondern die Länge von N aufeinanderfolgenden Perioden. Und N wählt
man einfach passend so groß, daß man genug Referenzimpulse für die
geforderte Auflösung bekommt.
Bei einem Meßbereich von 9Hz bis 15Hz ist das aber Pillepalle. Da ist ja
gerade mal 1 Bit Differenz zwischen größter und kleinster Auflösung und
es reicht vollkommen, nur eine einzelne Periode mit passender
Zeitauflösung auszumessen.
> Hm, wenn ich das richtig verstanden habe, bin ich doch umso genauer,> wenn ich Frequenzen messe, bei der ich im Bereich des Zählerendwertes> liege?
Mit diesem merkwürdigen Satz meinst du vermutlich genau das, was ich
gerade skizziert habe.
> Wäre es da sinnvoller, bei einem konstanten Durchfluss den messbaren> Frequenzbereich einzuschränken, um genauer zu messen?
Zuerst mal mußt du festlegen, wie genau es denn sein soll. Bei einem
Durchflußmesser gibt es sicher Fehlerquellen, die viel gravierender sind
als die Zeitauflösung der Impulsmessung. Die oben abgeschätzten 6
Dezimalstellen sind sicher weit mehr als der Durchflußsensor hergibt.
Wahrscheinlich reichen 3 Stellen schon, 4 ganz sicher.
Noch wichtiger ist aber ein zweiter Aspekt: du mißt ja keine konstante
Frequenz, sondern die Durchflußmenge (ergo die Frequenz) wird ständig
kleinen Schwankungen unterworfen sein. Vermutlich willst du die
Durchflußmenge sogar einstellen bzw. nachregeln. Wie oft du messen mußt
(Messungen pro Sekunde) wird von den Eigenschaften deines Regelkreises
vorgegeben. Du hast also gar nicht die Freiheit, deine Meßauflösung
durch das Messen mehrerer Perioden beliebig zu erhöhen.
Axel Schwenke schrieb:>> Frequenzzähler für hoch variable Meßbereiche verwenden wie Mino oben> schon sagte das Reziprokmeßverfahren. Das kann man sich am einfachsten> so vorstellen, daß nicht die Länge einer einzelnen Periode gemessen> wird, sondern die Länge von N aufeinanderfolgenden Perioden. Und N wählt> man einfach passend so groß, daß man genug Referenzimpulse für die> geforderte Auflösung bekommt.
Dieses Verfahren hab ich oben beschrieben, wenn ich mich nicht Irre
> Bei einem Meßbereich von 9Hz bis 15Hz ist das aber Pillepalle. Da ist ja> gerade mal 1 Bit Differenz zwischen größter und kleinster Auflösung und> es reicht vollkommen, nur eine einzelne Periode mit passender> Zeitauflösung auszumessen.>>> Hm, wenn ich das richtig verstanden habe, bin ich doch umso genauer,>> wenn ich Frequenzen messe, bei der ich im Bereich des Zählerendwertes>> liege?>> Mit diesem merkwürdigen Satz meinst du vermutlich genau das, was ich> gerade skizziert habe.>>> Wäre es da sinnvoller, bei einem konstanten Durchfluss den messbaren>> Frequenzbereich einzuschränken, um genauer zu messen?>> Zuerst mal mußt du festlegen, wie genau es denn sein soll. Bei einem> Durchflußmesser gibt es sicher Fehlerquellen, die viel gravierender sind> als die Zeitauflösung der Impulsmessung. Die oben abgeschätzten 6> Dezimalstellen sind sicher weit mehr als der Durchflußsensor hergibt.> Wahrscheinlich reichen 3 Stellen schon, 4 ganz sicher.
Mir reichen sogar 2 Stellen
> Noch wichtiger ist aber ein zweiter Aspekt: du mißt ja keine konstante> Frequenz, sondern die Durchflußmenge (ergo die Frequenz) wird ständig> kleinen Schwankungen unterworfen sein. Vermutlich willst du die> Durchflußmenge sogar einstellen bzw. nachregeln.
Der Durchfluss wird manuell eingestellt. Mir ist klar, dass die Frequenz
immer etwas schwankt. Deshalb folgende Idee:
Kombination von beiden Verfahren (Reziprok und Periodenmessung).
Das reziprok Verfahren nutze ich um die Durchflussmenge grob
einzustellen. Wenn der Durchfluss in einem definierten Bereich (der den
Schwankungen entspricht) liegt, z. B. zwischen 3,67 ml/s und 4,33 ml/s
wird die Periodenmessung verwendet. Für die Periodenmessung wird die
Taktfrequenz des Timers so angepasst, das die maximale Messzeit für
einen Durchfluss von 3,67 ml/s ausreicht.
Wär das was?
Daniel schrieb:> Kombination von beiden Verfahren (Reziprok und Periodenmessung).
Das ist Beides gleich und nennt sich 'reziproke Frequenzmessung' ;-)
Wenn Du Dir die Software näher ansiehst, kannst Du feststellen, daß sich
die Bereichswahl vom mHz- bis in den 100 kHz-Bereich automatisch
einstellt. Oder besser gesagt: es ist ein einziger Meßbereich.
Bei geringerer Auflösung, gäbe es auch andere Möglichkeiten der Messung,
die aber letztlich keinen Vorteil bringen.
Mal ein Zahlenbeispiel:
Meine Torzeit beträgt 524,288ms. Angenommen ich habe einen Durchfluss
von 4,33 ml/s das sind 9,048 Hz (ca. 110,52 ms pro Impuls)
Bei einem Durchfluss von 4,33 ml/s erfasst der µC innerhalb der Torzeit
nur 4 Impulse. Der 5. Impuls wird nicht mehr registriert.
Die Zeit zwischen dem ersten und dem letzten Impuls beträgt idealerweise
3*110,52ms.
Dann wurde der µC f=(4-1)/3*110,522ms = 9 Hz messen.
Das Ausgangssignal wird mit einem Interrupt Eingang erfasst. Ausgelöst
wird das Interrupt bei steigender Taktflanke.
Ich habe meine Routine als Pseudocode angehängt. Ich benutze einen
Zähler für die Torzeit und die Zeit zwischen ersten und letzten
erfassten Impuls.
Ist die Vorgehensweise so korrekt?
Daniel schrieb:> Meine Torzeit beträgt 524,288ms.
Du brauchst kein Tor und folglich auch keine Torzeit!
Synchron zu den Eingangsimpulsen wird ein durchlaufender Zähler
ausgelesen und mit dem Zählerstand des vorherigen Impulses die letzte
Periodendauer errechnet: Periode = neuer_wert - alter_wert.
Der Kehrwert davon ist die Frequenz.
Meinen obigen Link könntest Du vielleicht beachten; da findet sich auch
eine Beschreibung des Meßverfahrens.
Für den Zähler nimmt man uint32_t Variablen, die es erlauben, immer die
korrekte Zeit zu erhalten, auch wenn der Zähler von 0xfffffff ->
0x00000000 überläuft.
Für geringe Auflösung kann man auch den Vorteiler des Hardware-Zählers
hoch einstellen und den Zählerstand (typ. 16 Bit) direkt verwenden.
Welchen µC wolltest Du einsetzen?
Daniel schrieb:> Meine Torzeit beträgt 524,288ms. Angenommen ich habe einen Durchfluss> von 4,33 ml/s das sind 9,048 Hz (ca. 110,52 ms pro Impuls)> Bei einem Durchfluss von 4,33 ml/s erfasst der µC innerhalb der Torzeit> nur 4 Impulse. Der 5. Impuls wird nicht mehr registriert.
Manoman.
Ersten Impuls ausmessen, Dauer => Durchfluss ausrechnen, Zeit merken.
Zweiten Impuls ausmessen, mit erstem addieren, 1 x rechts schieben,
die so gewonnene Dauer => Durchfluss.
Dritten Impuls ausmessen, mit der Zwischensumme addieren, 1 x rechts
schieben, die so gewonnene Dauer => Durchfluss.
Vierten ...
....
x-ten ...
Fur Durchschnittlichen Verbrauch, ansonsten rechnest du jeden Impuls
fur sich, oder zwei aufeinanderfolgende, um genauer zu sein und damit
die Anzeige nicht wild herumzeigt.
Ist es so schwer ?
EDIT:
Du brauchst keine Torzeit, nimm stattdessen 4 oder 5
aufeinanderfolgende Impulse und zeige den Mittelwert.
@m.n den Link hab ich mir angesehen, auch den Quellcode für den AVR. Ich
finde es aber auf den ersten Blick kompliziert programmiert.
@marc
Nicht aufregen, ist doch das gleiche was ich auch mache. Nur das die
Anzahl der Impulse durch die Torzeit bestimmt.
Bei langsamen Frequenzen habe ich weniger Impulse als bei höheren
Frequenzen. Bei sehr langsamen Frequenzen ist das natürlich schlecht,
weil dann irgendwann die Torzeit zu klein und zu wenig Impulse gezählt
werden -> zu ungenau.
Aber besser ist es, wenn ich die Torzeit weg lasse und immer eine feste
Anzahl von Impulsen unabhängig von der Frequenz messe..
Ist es dann nicht besser einen gleitenden Mittelwert aus der Dauer zu
bilden, für z.B. 4-5 Impulse?
Daniel schrieb:> Ist es dann nicht besser einen gleitenden Mittelwert aus der Dauer zu> bilden, für z.B. 4-5 Impulse?
Sage ich doch.
Bei 9Hz hast du eine Refreshrate von etwa 1.8 pro sec, bei 15Hz sind
es etwa 3.3 pro sec.
Mehr wäre schon störend.
EDIT:
Ich nehme an, dass du diesen Wert auf irgendeinem Display ausgibst.
Heyho,
hab mir nicht alle Kommentare durchgelesen, aber ich würde folgendes
machen.
1. dein externes Rechteck löst einen interrupt aus, der eine
counter-variable hochzählt (32-Bit unsigned)
2. einen Timer jede Sekunde einen Interrupt triggern lassen der sich die
aktuelle counter-variable holt
3. frequenz berechnen
(Überlauf beachten-->anzahl_impulse = neuerWert + (uint32max -
alterWert))
Dann hast du eine Torzeit von 1sec (Timer) und der reziproke Wert aus
deiner Berechnung ist dann die Frequenz. Die Auflösung sollte dann durch
die maximale externe Interruptauslösung limitiert sein.
beste grüße
public
public schrieb:> Die Auflösung sollte dann durch> die maximale externe Interruptauslösung limitiert sein.
Stimmt! Aber eine gültige Stelle könnte drin sein :-(
m.n. schrieb:> public schrieb:>> Die Auflösung sollte dann durch>> die maximale externe Interruptauslösung limitiert sein.>> Stimmt! Aber eine gültige Stelle könnte drin sein :-(
Du meinst das Timerinterrupt und externer Interrupt gleichzeitig kommen?
Wie oft brauchst du denn einen aktuellen Wert? Grundsätzlich ist mitteln
schon hilfreich, reichen alle 8 Sek ein neuer Wert? Dann bräuchtest blos
8 Werte addieren und eine Schiebeoperation :)
beste grüße
public
public schrieb:> Du meinst das Timerinterrupt und externer Interrupt gleichzeitig kommen?
Nein, ich meine, daß Du es nicht begriffen hast.
public schrieb:> Heyho,>> hab mir nicht alle Kommentare durchgelesen,
Lesen bildet!
public schrieb:> Dann hast du eine Torzeit von 1sec (Timer) und der reziproke Wert aus> deiner Berechnung ist dann die Frequenz.
Erstens ist der erhaltene Wert direkt proportional der Frequenz (und
nicht der reziproke)
und zweitens willst du dieses Messverfahren bei langsamen Frequenzen
(und davon ist hier zweifellos die Rede) gerade eben nicht einsetzen.
Die die Messung durch externe Pulse zählen während einer fixen Torzeit
und die Messmethode 2: externe Pulse fungieren als Torzeit und es werden
interne fixe Pulse mit dieser jetzt variablen Torzeit vermessen, haben
gegensätzliche Genauigkeiten.
Wenn die eine ungenau wird, wird die andere genauer und umgekehrt.
Wenn schon, dann willst du bei langsamen Frequenzen diese Frequenz als
Tor nutzen und während das Tor offen ist, werden Pulse einer intern
bekannten und hohen Frequenz gezählt. Ist das Tor 0.1 Sekunden offen und
zählst du Pulse einer 10kHz Frequenz, dann ist es nicht so schlimm wenn
dein Zählergebnis um +- 1 nicht stimmt. Ob du bei 0.13 Sekunden offenem
Tor 5000 Pulse oder 5001 Pulse der internen Frequenz zählst, wirkt sich
auf das Ergebnis nicht sonderlich aus. Wenn du aber dein Tor fix 1
Sekunde offen hast und du zählst das eine mal in dieser 1 Sekunde 4
Pulse und das andere mal 5, dann hast du einen gewaltigen Messfehler.
Aber m.n hat schon ein Verfahren gepostet, dass anständig funktioniert.
m.n. schrieb:> public schrieb:>> Du meinst das Timerinterrupt und externer Interrupt gleichzeitig kommen?>> Nein, ich meine, daß Du es nicht begriffen hast.>> public schrieb:>> Heyho,>>>> hab mir nicht alle Kommentare durchgelesen,>> Lesen bildet!
Donnerwetter danke für den Hinweis ¯\_(ツ)_/¯