Forum: Mikrocontroller und Digitale Elektronik Netzfrequenz messen (Hilfe)


von Erik F. (erikf508)


Lesenswert?

Hi,

mein Programm ist soweit fertig ich habe leider nur ein kleines Problem.
Die Zahl bzw. die Frequenz, die angezeigt wird startet bei ca 357,00 und 
fällt dann auf die 7,0000
und wird zurück auf die 357 gesetzt.( Je kleiner die Zahl desto 
langsamer wirds.)

Hier das Programm:

---------------------------------------------------------------------
1
int freq = 7;               //Frequenz Eingang (D4)
2
int a = 0;
3
int b = 0;
4
int FQv = 0;
5
float Frequenz = 0.000;
6
float Zeit = 0.000;
7
unsigned int START_Messung = 0;
8
unsigned int STOP_Messung = 0;
9
10
#include <LiquidCrystal.h>
11
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
12
13
void setup() {
14
  pinMode(freq, INPUT);
15
  lcd.begin(20, 2);
16
}
17
18
19
void loop()
20
{
21
  FQv = digitalRead (freq);
22
  if ((FQv == HIGH) && (a == 0))
23
  {
24
    START_Messung = millis();
25
    a = 1;
26
  }
27
28
  FQv = digitalRead (freq);
29
  if ((FQv == HIGH) && (a == 1) && (b == 0))
30
  {
31
    STOP_Messung = millis();
32
    b = 1;
33
  }
34
35
  if (( a == 1) && (b == 1))
36
  {
37
    Zeit = STOP_Messung;
38
    Zeit = Zeit / 1000;
39
    Frequenz = 1.0 / Zeit;
40
    Frequenz = Frequenz * 500;
41
    lcd.clear();
42
    lcd.begin(20, 2);
43
    lcd.setCursor(14, 0);
44
    lcd.println(Frequenz, 4);
45
    delay(200);
46
    a = 0;
47
    b = 0;
48
  }
49
}
---------------------------------------------------------------------

Wäre super wenn ihr mir helfen könntet.

: Bearbeitet durch User
von Klaus R. (klara)


Lesenswert?

Erik F. schrieb:
> mein Programm ist soweit fertig ich habe leider nur ein kleines Problem.

Wir haben auch ein Problem. Was hast Du denn für eine Hardware?
mfg klaus

von Karl M. (Gast)


Lesenswert?

Hallo Erik,

ist das ein Arduino Framework Programm?

Warum wird da mit so vielen Int Variablen gearbeitet?

Dann denke ich, dass Du mit den Variable a und b einen Zustandsautomaten 
aufbauen möchtest, aber dafür nutzt man i.a. eine Switch - Case 
Konstruktion.

Z.B.
1) Messung Starten --> 2)
2) Frequenzmessen - Stopp Zustand erreicht ? --> 3)
3) Messergebnis berechnen und anzeigen. --> 1⁾

Sollte das so bei Dir aussehen ?

von Klaus R. (klara)


Lesenswert?

Ich sehe bei den dürftigen Info mit Hilfe der Glaskugel

START_Messung = millis();
STOP_Messung = millis();
Zeit = STOP_Messung;

Mußt Du nicht die Differenz zwischen Start und Stopp ausrechnen?
mfg Klaus

von erikf508 (Gast)


Lesenswert?

Danke für die schnellen Antworten.
Ja habe das ausrechnen der Differenz vergessen.
Sieht jetzt so aus:
1
Zeit = STOP_Messung - START_Messung;
Jetzt wird bei mir "inf" angezeigt.


>Wir haben auch ein Problem. Was hast Du denn für eine Hardware?
mfg klaus

Ich nutze einen Arduino Nano v3.0 mit dem Atmega328 chip

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Denke, es wurde eher eine Antwort in die Richtung erwartet, woher Du die 
Impulse in Netzfrequenz hast.

Das 'inf' erschließt sich mir nicht, auf dem Display?
Von wo soll dieses 'inf' kommen?

MfG

von Joe F. (easylife)


Lesenswert?

Patrick J. schrieb:
> Das 'inf' erschließt sich mir nicht, auf dem Display?
> Von wo soll dieses 'inf' kommen?

inf kommt daher,
dass 1/0=unendlich (infinity) ist (float).
Und das kommt daher, dass start und stopp den gleichen wert haben.
nachdem start gemessen wurde wird a=1 und damit wird auch gleich darauf 
(in der gleichen millisekunde) die stopp zeit genommen.
vermutlich soll auf FQv==LOW gewartet werden um die stopp zeit zu 
nehmen.

du solltest auch nach der ausgabe aufs display noch darauf warten dass 
der input pin low ist. sonst misst du eine zu kurze periode (da der pin 
zum zeitpunkt der nächsten start messung bereits eine weile high gewesen 
sein kann).

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

Erik F. schrieb:
> unsigned int START_Messung = 0;
> unsigned int STOP_Messung = 0;

millis() liefert einen unsigned long.
Das wird Schrott geben.

Davon mal abgesehen, wäre nicht micros() angemessener?
Würde die Auflösung um den Faktor 250 steigern.

von Bastler^ (Gast)


Lesenswert?

Von milli zu mikro ist doch aber normalerweise 10^-3 also Faktor 1000 
oder ist das bei Arduino etwa mal wieder anders?

von Einer K. (Gast)


Lesenswert?

Bastler^ schrieb:
> oder ist das bei Arduino etwa mal wieder anders?

Zumindest ist es ein dokumentiertes Verhalten.
https://www.arduino.cc/en/Reference/Micros

Der hier genutzte Nano läuft mit 16MHz, damit liegt die Auflösung bei 
4µs

von Joe F. (easylife)


Lesenswert?

Arduino F. schrieb:
> millis() liefert einen unsigned long.
> Das wird Schrott geben.

das sollte mit unsigned int kein problem geben solange der unsigned int 
max. 1x überläuft. du guckst halt nur die unteren bits an.

von Einer K. (Gast)


Lesenswert?

Joe F. schrieb:
> du guckst halt nur die unteren bits an.
OK, in diesem Fall wirds klappen.

Befürchte allerdings, dass das unabsichtlich so geschrieben wurde.

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.