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