www.mikrocontroller.net

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


Autor: thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Berti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klint nach einem Überlauf eines Registers...

Autor: thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wahrscheinlich tritt der Fehler exakt bei 65536 Hz auf :-)

Autor: hansen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Berti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann es sein das eine ISR zulange dauert und die Auswertung blockiert?

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Profi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: thomas (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: thomas (Gast)
Datum:

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

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry, ich meinte mit int natürlich eine 32bit-Variable.

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

Gruß

Dietmar

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.