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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.