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.
Das geht am besten mit reziproker Frequenzmessung. Eine Suche danach bringt jede Menge Ergebnisse. Auf die Schnelle einige Beispiele: http://www.mino-elektronik.de/fmeter/fm_software.htm
Daniel schrieb: > Was ist da genauer? Die Frequenzmessung mit der > Torzeit/Impulsfolgen-Methode oder die Periodendauermessung? Sprut hat sich damit mal bschäftigt: http://www.sprut.de/electronic/pic/projekte/frequenz/freq_uni_628.htm
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?
1 | taktfrequenz_zähler = 125000 //125kHz (8Mhz/64) |
2 | |
3 | ext interrupt routine() |
4 | {
|
5 | if(run) |
6 | {
|
7 | if(puls_cnt==0) |
8 | {
|
9 | t_start = zählerstand_torzeit_auslesen() //1. Impuls |
10 | }
|
11 | else
|
12 | {
|
13 | t_end = zählerstand_torzeit_auslesen() |
14 | }
|
15 | puls_cnt++; |
16 | }
|
17 | }
|
18 | |
19 | torzeit_Überlauf_Interrupt() |
20 | {
|
21 | run=0 |
22 | }
|
23 | |
24 | main() |
25 | {
|
26 | |
27 | run=1 |
28 | puls_cnt=0 |
29 | ext. Interupt aktivieren |
30 | Zähler-Torzeit Overflow-Interrupt aktivieren |
31 | Zähler-Torzeit starten |
32 | |
33 | while(1) |
34 | {
|
35 | if(run==0) |
36 | {
|
37 | dt = t_end - t_start |
38 | puls_cnt = puls_cnt - 1 |
39 | f = taktfrequenz_zähler*puls_cnt/dt |
40 | |
41 | run = 1 |
42 | puls_cnt = 0 |
43 | zählerstand_torzeit_löschen() |
44 | }
|
45 | }
|
46 | |
47 | }
|
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.
:
Bearbeitet durch User
@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.
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
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 ¯\_(ツ)_/¯
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.