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...
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
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
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
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;
kann es sein das eine ISR zulange dauert und die Auswertung blockiert?
@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
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.
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.
@profi: Vielen Dank! Genau das war der Fehler! @all: Danke, ihr seid echt spitze!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.