Forum: Mikrocontroller und Digitale Elektronik Frequenz aus differenz bestimmen


von Peter (Gast)


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

von Wolfgang (Gast)


Lesenswert?

Peter schrieb:
> timer2

Und was ist das?

von Peter (Gast)


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

von Peter (Gast)


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

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.