Frequenzen größer als 55KHz messen

Gast #335189
Lesenswert?

Hallo!
Ich hab ein kleines Problem, ich will Frequenzen messen im Bereich von
500Hz bis 300KHz! Ich benutzen eine ATMega16 mit 8MHz, so nun hab ich
mir mit dem Timer eine Messzeit von 125ms eingestellt! Und mit dem
CapturePin zähle ich während dieser Zeit die Anzahl der steigenden
Flanken meines Signals und multipliziere diese dann mit 8, dann hab ich
nämlich die tatsächliche Frequenz in Hz. Allerdings hab ich ein Problem,
das Programm arbeitet bis ca. 55KHz ohne Probleme, allerdings Frequenzen
größer als 55KHz werden nicht mehr richtig erfasst bzw. er liefert dann
als Ergenbis wieder 1Hz, 2Hz, 3Hz, ... Hat schonmal jemand das Problem
gehabt? Könnte es am NoiseCanceler liegen? Ich bin am verzweifeln...
Gast #335191
Lesenswert?

Uuups, sorry hab mich vertippt, der Fehler tritt nicht nach 55KHz
sondern nach 65KHz auf.
An einen Registerüberlauf des Timer1 hab ich auch schon gedacht, aber
ich glaub das kann ich ausschließen, da er 65KHz ja noch packt, und bei
65000Hz/8= 8125 pos. Flanken gezählt hat und das ja noch locker in ein
16-Bit Register passt
Gast #335192
Lesenswert?

Hast du für das Multiplikationsergebnis eine int-Variable definiert?

Welchen Wertebereich (Bitbreite) umfaßt denn das Capture-Register?

Mit welcher Taktfrequenz läuft der Timer?

Gruß

Dietmar
Gast #335195
Lesenswert?

nein an der variablen liegt es glaub auch nicht.

CaptureRegister ist 16-Bit


Berechnung beim Überlauf:
unsigned long int messwert;
unsigned int mess_counter;

messwert = mess_counter<<3;  // Multiplikation mit 8
   mess_counter = 0;
#335197
Lesenswert?

@Thomas

Vor einiger Zeit konnte ich mich etwas intensiver mit dieser Thematik
beschägtigen.

Frequenzen im MHz-Bereich können problemlos hinreichend genau erfasst
werden.

http://www.mikrocontroller.net/forum/read-4-230466.html

Ich setze bei Deinem Problem voraus, dass das Eingangssignal auch bei
höheren Frequenzen noch halbwegs rechteckig ist?

Es empfiehlt sich, das Eingangssignal zuerst Durch ein Flip-Flop-Gatter
durch 2 zu teilen, damit auch Impuls- Nadeln erfasst werden.

Denn zu kurze Impulse, auch wenn es nur wenige kHz sind, registriert
der µC nicht.

Bernhard
Gast #335198
Lesenswert?

Klassischer Fall, Du musst vor der Multiplikation casten:

messwert = (unsigned long)(mess_counter)<<3;  // Multiplikation mit 8
oder mess_counter gleich von vorn herein long definieren.

Denn sonst macht er zuerst die Berechnung (mit 16 Bit) und dann weist
er das Ergebnis der 32-Bit-Variablen zu.

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