Forum: Mikrocontroller und Digitale Elektronik Frequenzen größer als 55KHz messen


von thomas (Gast)


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

von Berti (Gast)


Lesenswert?

Klint nach einem Überlauf eines Registers...

von thomas (Gast)


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

von Dietmar (Gast)


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

von crazy horse (Gast)


Lesenswert?

wahrscheinlich tritt der Fehler exakt bei 65536 Hz auf :-)

von hansen (Gast)


Lesenswert?

8125 * 8 = 65000 und eine integer kan nu bis 65536
da muss es an dine variabel für count * 8 (gröse als 16bit)

Grüsse aus denemark

von thomas (Gast)


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;

von Berti (Gast)


Lesenswert?

kann es sein das eine ISR zulange dauert und die Auswertung blockiert?

von Bernhard S. (bernhard)


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

von Profi (Gast)


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.

von thomas (Gast)


Angehängte Dateien:

Lesenswert?

mmh ich denke nicht dass es an der ISR liegt, die ist relativ kurz.

Im Anhang mal der Quellcode.
Header-Datei fehlt, ich weiß es, aber es steht auch nix wichtiges drin.

von thomas (Gast)


Lesenswert?

@profi: Vielen Dank! Genau das war der Fehler!
@all: Danke, ihr seid echt spitze!

von Dietmar (Gast)


Lesenswert?

sorry, ich meinte mit int natürlich eine 32bit-Variable.

Arbeite mit ARM, da ist int = 32 bit breit.

Gruß

Dietmar

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.