Forum: Mikrocontroller und Digitale Elektronik frequenzcounter fast fertig


von tobias hofer (Gast)


Angehängte Dateien:

Lesenswert?

hallo

nun habe ich den frequenzzähler "fast" fertig.
die sprintf() fkt. habe ich durch eine funktion ersetzt die
peter danneger geschrieben hat. ich habe die auf seiner homepage 
gefunden.

@peter
an dieser stelle möchte ich dich fragen ob es dir nichts ausmacht wenn 
ich diese fkt. einfach so benutze. aber damit konnt ich ca.20% code 
eingesparren!

nun habe ich nur noch ein kleines problem:
und zwar der timer0 der mir anhand meines eingangssignal (fallende 
flanke) hochgezählt wird, hat nicht jedes mal genau den gleichen wert. 
und zwar weicht der wert immer +-1 ab.

was könnte das sein? hat vieleicht jemand eine idee?

beste grüsse und danke für eure hilfe

gruss tobias

von Peter D. (peda)


Lesenswert?

Hi Tobias,

ja, alles was ich veröfffentliche, kannst Du ruhig benutzen.

Der Grund, warum ich diese Routine entwickelt habe ist, daß sprintf() 
nicht die Ausgabe in der technischen Schreibweisse erlaubt 
(Zehnerpotenzen von 3, 6, 9 usw.).


Das die Zählerwerte um +-1 abweichen ist vollkommen klar. Alle 
Digitalisierungen könne nur in ganzen Schritten arbeiten.

Der Grund, warum daß bei mir keine Rolle spielt, ist hier beschrieben:

http://www.specs.de/users/danni/appl/soft/c51/frequenc/index.htm

Ich zähle immer volle Perioden der Eingangsfrequenz.


Peter

von tobias hofer (Gast)


Lesenswert?

hallo peter

ich habe deine messroutine von deiner home-page mal angeschaut.ich 
blicke da aber noch nicht ganz durch.
könntest du mir nicht kurz erklären wie du die timer startest und 
stopst?

wäre sehr froh um ein paar tips.

tobias

von tobias hofer (Gast)


Angehängte Dateien:

Lesenswert?

noch kurz wie ich es bis jetzt programiert habe.

eine 1-0 flanke des eingang signals (auf int0 und t0) startet mir beide 
timer gleichzeitig.

dann warte ich eine gewisse zeit (so lange wie ich sicher brauche um die 
tiefste frequez zu messen)

nach diesem delay stopt mir die nächste 1-0 flanke des eingangsignal 
beide timer wieder.

somit sollte ich doch sicherstellen können das der timer für das 
eingangssignal immer volle perioden misst. oder nicht?

auf jeden fall habe ich immer noch den gleichen fehler wie vorher.

anbei der aktuelle c-code.

tobias

von tobias hofer (Gast)


Lesenswert?

ich habe noch folgende änderung vorgenommen:

in der interruptroutine int0....

IRQ_VECTOR(ext_int0,IRQ_INT0)

void ext_int0 (void) interrupt  {

    EX0 = 0;
    flag_it0++;
    if(flag_it0==1){
      TR0=1;
      TR1=1;
                        #asmline nop;
                        TH0=0;
                        TL0=0;
                        TH1=0;
                        TL0=0;

    }
    if(flag_it0==2){

                        TR0=0;
      TR1=0;
    }
}

....die timer werte werden nach dem start noch einmal zurückgesetzt.

leider habe ich immer noch einen fehler von +-1Hz!
ich weiss wirklich nicht mehr weiter wo noch ein fehler sein könnte.

bin um alle hilfe dankbar.

gruss tobias

von UBoot-Stocki (Gast)


Lesenswert?

Hi,

wenn das zu messende Signal exakt ein vielfaches des "Torsignals" hat 
müsste der Fehler verschwinden. Da Du in der Praxis das nie hinbekommst 
ist der Fehler +/-1 "Gottgegeben"
Du kannst die Genauigkeit nur durch Vergrößerung der "Torperiode" 
erhöhen. Ein Fehler +/-1 bleibt dann zwar, ist aber relaiv kleiner.

Bsp:

Messsignal 100Hz = 10ms
Torsignal 1Hz = 1s
=> Messwert 99 oder 100 oder 101 => Fehler +/- 1%

Messsignal 100Hz = 10ms
Torsignal 0,1Hz = 10s
=> Messwert 99,9 oder 100,0 oder 100,1 => Fehler +/- 0,1%

Messsignal 100Hz = 10ms
Torsignal 0,01Hz = 100s
= Messwert 99,99 oder 100,00 oder 100,01 = Fehler +/- 0,01%

usw.

Gruß

UBoot-Stocki

von Peter D. (peda)


Lesenswert?

Wenn man einen flankengetriggerten Interrupt freigibt, wird der 
natürlich auch sofort ausgeführt, wenn vorher schon mal eine Flanke 
erfolgte.

Deshalb sollte man vor der Freigabe immer erst das Interruptflag 
zurücksetzen. Siehe mein Beispielkode:

IE0 = 0;
EX0 = 1; // wait until next count pulse


Peter

von tobias hofer (Gast)


Lesenswert?

hallo peter

besten dank, ist halt das erste mal das ich mit interrupts arbeite.
jetzt funktioniert es wie geswünscht!

tobias

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.