Forum: Mikrocontroller und Digitale Elektronik Welche Methode niedrige Frequenzen von 9Hz bis max.15 Hz messen


von Daniel (Gast)


Lesenswert?

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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von m.n. (Gast)


Lesenswert?

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

von <Insert random nichname> (Gast)


Lesenswert?

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

von Daniel (Gast)


Lesenswert?

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?

von Falk B. (falk)


Lesenswert?

@ 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.

von Axel S. (a-za-z0-9)


Lesenswert?

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.

von Daniel (Gast)


Lesenswert?

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?

von m.n. (Gast)


Lesenswert?

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.

von Daniel (Gast)


Lesenswert?

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
}

von m.n. (Gast)


Lesenswert?

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?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
von Daniel (Gast)


Lesenswert?

@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?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
von public (Gast)


Lesenswert?

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

von m.n. (Gast)


Lesenswert?

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 :-(

von public (Gast)


Lesenswert?

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

von m.n. (Gast)


Lesenswert?

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!

von Karl H. (kbuchegg)


Lesenswert?

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
von public (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.