Frequenz aus differenz bestimmen

Gast #4579949
Lesenswert?

Hallo,

Ich stehe wohl gerade auf dem Schlauch. Ich möchte aus der differenz 
zwischen zwei Interrupts die Frequenz berechnen. Ich lege also ein 
Interrupt auf die steigende Flanke meines Signals.

Nun messe ich die Zeit (in Mikrosekunden) zwischen den Interrupts. Die 
Zeit liegt zwischen 8,33Hz -> 120048 Mikrosekunden  und 116Hz -> 8620 
Mikrosekunden.

Als Globale Variable ist timer1 und Tacho1 deklariert:

uint32_t timer1 = 0;
uint16_t Tacho1 = 0;

Meine ISR sieht wie folgt aus:
1
void readTacho1() {
2
  uint32_t currentTime = micros();
3
  uint32_t microTime = currentTime - timer2;
4
  Tacho1 = 60000000 / microTime;
5
  timer1 = currentTime;
6
}


Als Prozessor nutze ich einen Arduino DUE (mit der Arduino IDE), also 
einen SAM3X8E.


Jedoch bekomme ich nur ziemlich wirre und Wilkürliche ergebnisse heraus 
:(.
Resette ich den Chip mit einem anliegendem Signal bei 116Hz bekomme ich 
bspw 61586 heraus. Ändere ich die Frequenz dann auf 20Hz springt die 
ausgabe auf 2 bzw läuft innerhalb von 10 sekunden auf 0, ändere ich die 
Frequenz wieder auf 116Hz bleibt die anzeige auf 0...

Resete ich den Chip bei einer Frequenz von 20Hz startet er bei ungefähr 
bei einer hohen Zahl und läuft wieder gegen 0 (der Verlauf sieht 
logarithmisch aus).

Mir kommt es so vor als würde da etwas überlaufen, kann das sein? Aber 
soweit ich gesehen habe gibt micros() ein unsigned long zurück, was 
einem uint32_t entspricht, oder?

Grüße

Peter
Gast #4580048
Lesenswert?

Sorry, das war ein Fehler.. sollte Timer1 heissen, hab es nun in meinem 
Code geändert:
1
void readTacho1() {
2
  uint32_t currentTime = micros();
3
  uint32_t microTime = currentTime - timer1;
4
  Tacho1 = 60000000 / microTime;
5
  timer1 = currentTime;
6
}

Nun bekomme ich nur den Wert 61669 zurück, egal welche Frequenz ich 
setze :-/
Gast #4580072
Lesenswert?

Sorry für das doppelosten, vielleicht sollte ich mich mal anmelden.

Ich habe nun einfach mal die Zeit ausgeben lassen:
1
void readTacho1() {
2
 
3
  uint32_t currentTime = micros();
4
  uint32_t microTime = currentTime - timer1;
5
  Tacho1 = (uint16_t) microTime;
6
  timer1 = currentTime;
7
}

Das funktioniert bis hin zu 25641 Mikrosekunden (39Hz). Erhöhe ich die 
Frequenz jedoch auf 40Hz springt es sofort auf 57767 Mikrosekunden, 
erhöhe ich es weiter bekomme ich nur fantasie zahlen die sich nur ändern 
wenn ich wieder unter die 40Hz grenze gehe und wieder darüber (von 3159, 
27490, 67450... alles dabei).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren