Forum: Compiler & IDEs Abweichungen bei einer Frequenzmessung -> Ursachen?


von Jens K. (jens_)


Lesenswert?

Hi!

Mal ne Frage: Ich messe ja eine Frequenz über den ICP.
Jetzt ist mir aufgefallen, das ab ca. 5kHz hin und wieder ein Fehler von 
ca. 1% gemacht wird (ca. bei jeder 3. Messung)  und je höher die 
Frequenz wird, umso größer wird die Abweichung.

Ich verwende einen externen 8MHz Quarz, von daher sollte der Timer 
(läuft ohne Prescaler) schon mal ziehmlich genau sein.

Welche anderen Ursachen könnte das haben?

MFG und Danke

von groc (Gast)


Lesenswert?

Einen anderen interrupt ? Werden die interrupts gesperrt ?

g

von Falk (Gast)


Lesenswert?

@Hans Dampf

>Mal ne Frage: Ich messe ja eine Frequenz über den ICP.
>Jetzt ist mir aufgefallen, das ab ca. 5kHz hin und wieder ein Fehler von
>ca. 1% gemacht wird (ca. bei jeder 3. Messung)  und je höher die
>Frequenz wird, umso größer wird die Abweichung.

Rechnen wir mal. 5 kHz = 200 uS Periodendauer, etspricht 1600 Takten bei 
8 Mhz. Hmm, der systematische Fehler beträgt hier 1/1600, also knapp ein 
halbes Promille. Wobei das für einen Freqeunzmesser schon recht schlecht 
ist. Hier solltest du über mehrere Perioden messen, damit wird der 
Fehler geringer.

>Ich verwende einen externen 8MHz Quarz, von daher sollte der Timer
>(läuft ohne Prescaler) schon mal ziehmlich genau sein.

Ja. Ca.+/- 100ppm.

>Welche anderen Ursachen könnte das haben?

Schhlechte Software. Im Prinzip musst du garantiereren, dass kein 
anderer Interrupt länger als 200us läuft, denn dann verschluckst du eine 
Messung (Wobei dann aber die dopplete Zeit gemessen werden sollte??)

@groc

>Einen anderen interrupt ? Werden die interrupts gesperrt ?

Das ist nicht notwendig (bei ordentlicher Programmierung).

MfG
Falk

von Jens K. (jens_)


Lesenswert?

Hi!

Es laufen lediglich die Interrupts zur Auswertung des Frequenzsignals.
Und erst wenn die Frequenz ausgewertet ist, wird im Hauptprogramm wieder 
etwas gemacht (nämlich die Frequenz auf einem Display ausgegeben.
Somit ist gwährleistet, dass während der Frequenzmessung nichts stört.

Während der Displayausgabe, werden die Interrupts abgeschalten -> Das 
hat den Grund, dass während der Ausgabe sowieso keine Frequenz gemessen 
werden würde, allerdings bei aktiven Interrupts die Displayausgabe sehr 
langsam währe, da der Überlauf ISR sehr oft aktiviert werden würde.

Werd jetzt mal testen über 4 Periodendauern zu messen.
Schon ma Danke.

MFG

von Stefan (Gast)


Lesenswert?

Wobei der Code von dir (aus dem anderen Thread) IMHO die Interrupts 
NICHT sperren kann, weil die Bitoperation falsch ausgeführt wird:
1
   TIMSK &= (1<<TICIE1) | (1<<TOIE1);      
2
   // Interrupts für Timer deaktvieren, da sonst Displayausgabe bei 
3
   // sehr hohen Frequenzen extrem verlangsamt (->Überlauf sehr oft voll)

wenn überhaupt, müsstest du meiner Meinung nach schreiben
1
   TIMSK &= ~((1<<TICIE1) | (1<<TOIE1));      
2
   // Interrupts für Timer deaktvieren, da sonst Displayausgabe bei 
3
   // sehr hohen Frequenzen extrem verlangsamt (->Überlauf sehr oft voll)

von Falk (Gast)


Lesenswert?

@Hans Dampf

>Es laufen lediglich die Interrupts zur Auswertung des Frequenzsignals.

Welche interupts sind das denn (Mehrzahl)? Zur Periodendauermessung 
brauchst du nur ICP.

>werden würde, allerdings bei aktiven Interrupts die Displayausgabe sehr
>langsam währe, da der Überlauf ISR sehr oft aktiviert werden würde.

Naja, sehr langsam ist relativ. Ich glaube kaum dass man das direkt 
merkt ob die Zeichenausgabe 40us oder 100us braucht. Ein komplettes LCD 
mit 4x16 Zeichen braucht gerade mal 2,5ms für einen kompletten Refresh, 
wenn den nun 4 ms braucht merkt das niemand.

MFG
Falk

von Jens K. (jens_)


Lesenswert?

Hi!
Es ist einmal der ISR(TIMER1_OVF_vect) und ISR(TIMER1_CAPT_vect) aktiv.
Jetzt war es so, dass bei hohen Frequenzen der TIMER1_CAPT_vect sehr 
häufig aktiv ist -> und das schreiben auf das Diplay wird immerkurz 
unterbrochen(zumindest hab ich mir den Effekt so erklärt).
Daher die Idee mit dem Interrupts ausschalten.

MFG und Danke

von Falk (Gast)


Lesenswert?

@Hans Dampf

>Jetzt war es so, dass bei hohen Frequenzen der TIMER1_CAPT_vect sehr
>häufig aktiv ist -> und das schreiben auf das Diplay wird immerkurz
>unterbrochen(zumindest hab ich mir den Effekt so erklärt).

Wenn man das sehen kann dann tippe ich auf einen Programmierfehler.

MfG
Falk

von Jens K. (jens_)


Lesenswert?

Hi!

Die Frequenzmessnung funktioniert so wie die von Holger(der sitzt 2 
Stockwerke unterhalb):
Beitrag "Am Input Capture Pin (ICP) Frequenz messen"

Und da trat eben dieses Problem auf bei hohen Freuqenzen.
Das Funktioniert ja mitterlweile wie es soll.

Hab jetzt nen Fehler von ca. 1-2 Promille drin.
Wobei es mich stutzig macht, dass sich der Wert hin und wieder eben um 
die 1-2 Promille ändert, obwohl an der Frequenz nichts verändert wird. 
Also quasi ein "delta" das um den eigentlichen Wert schwingt.
Evtl sind es Störeinflüsse durch das Netzteil / Monitor oder der 
Frequenzgenerator schwankt ein klein wenig (wobei ich mir letzteres 
nicht vorstellen kann).Jetzt muss ich wohl mal auf die geätzte Platine 
warten und mal sehen wie sich das ganze dann verhält wenn es in ein 
gehäuse verbaut ist.

Danke!

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.