mikrocontroller.net

Forum: Projekte & Code Frequenzzaehler AVR-GCC


Autor: Marko B. (glagnar)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich hab mir mal auf die Schnelle einen Frequenzzaehler gestrickt. Die 
Hardware besteht erstmal nur aus einem nackten Mega16 auf einem STK500, 
welcher von einem 16MHz Quarz getaktet wird, und einem Text-LCD. Zur 
Messung benutze ich zwei Timer: einmal den Timer0, welcher alle 1ms 
Interrupts generiert und eine ms-Variable hochzaehlt (fuer die Gate 
Time) und zum anderen den Timer1, der die Pulse am T1-Pin zaehlt. Die 
maximale Frequenz die mit dem T1 Pin gemessen werden kann ist F_CPU/2, 
hier also 8 MHz.

Die Ueberlaeufe von Timer1 werden in einer 8-bit Variablen mitgezaehlt. 
Damit betraegt der maximale Zaehlwert 2^24. Somit ist eine Aufloesung 
von 1Hz moeglich.

Der Zaehlvorgang laeuft folgendermassen ab:

Timer1 starten
Timer0 starten
Warten bis ms=x
Timer1 stoppen
Timer0 stoppen

Die einzigen Ungenauigkeiten sind jetzt die Zeit, die gebraucht wird um 
den Timer0-Interrupt abzuarbeiten, sowie die Zeit, die ein Durchlauf der 
Warteschleife benoetigt. Diese muessen also nachher abgezogen werden.

Das ganze funktioniert soweit ganz gut. Ein 1MHz Quarzoszillator (100ppm 
laut Datenblatt) wird mit 1000100 Hz angezeigt. Zusammen mit den 30ppm 
des 16MHz Quarzes ist das plausibel. Waere aber schoen wenn jemand die 
Korrektheit des Messalgorithmus' bestaetigen koennte!

TODO:

- Formatierte Ausgabe mit 1000er Trennzeichen
- Messmodus fuer langsamere Signale mittels Messung der Periodendauer 
ueber ICP-Pin inkl. Tastverhaeltnismessung
- Vorverstaerker fuer kleine Amplituden
- Vorteiler fuer hoehere Frequenzen
- Impulszaehlmodus

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anregung:
Wenn du die Timer startest:
Warte zuerst, bis du eine Steigende Flanke am Messeingang registrierst. 
Auf die Art hast du keinen Jitter bei Beginn der Messung.

Die Abfrage, ob die Zeit um ist, kannst du auch in die TIMER0_COMP 
legen, die bei abgelaufener Zeit ein Flag auf 1 setzt und gleichzeitig 
den Timer 1 wieder dich macht. Dann bist du die Ungenauigkeit durch die 
Warteschleife weitgehend los.

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.