Frequenz eines Signals mit µC bestimmen ...

Hi NG,

ich möchte die Frequenz eines Rechtecksignals bestimmen (eigentlich Geschwindigkeitssignal am Auto).

Hat jemand Erfahrungen/Beispielprogramme für sowas ?

Der µC für das Projekt soll ein AVR werden.

Nicolas Nickisch

Reply to
Nicolas Nickisch
Loading thread data ...

Nicolas Nickisch schrieb:

Wieviel Erfahrung hast Du denn mit uC überhaupt? Für sowas haben eigentlich alle aktuellen uC spezielle Ports bzw. Zähler. Zieh Dir mal das Datenblatt zu einem beliebigen AVR und schau mal nach der Beschreibung der Capture Ports/Register. Das ist trivial.

- Carsten

--
Audio Visual Systems                          fon: +49 (0)2238 967926
Carsten Kurz                                  fax: +49 (0)2238 967925
 Click to see the full signature
Reply to
Carsten Kurz

Nicolas Nickisch schrieb im Beitrag ...

Es gibt dutzende von Application Notes und Bauvorschlaege fuer Freqeuenzzaehler mit uC, meist mit 4-stelliger Anzeige. Google halt mal (bzw. Microchip AppNotes durchforsten, ePanorama etc.)

--
Manfred Winterhoff, reply-to invalid, use mawin at despammed.com
homepage: http://www.geocities.com/mwinterhoff/
 Click to see the full signature
Reply to
MaWin

Ich glaube schon ... Bin allerdings nur Hobby-µCler und habe nicht so viel Überblick.

Nicolas Nickisch

"Thomas Drescher" schrieb im Newsbeitrag news: snipped-for-privacy@groucho.TFDrescher.net...

Reply to
Nicolas Nickisch

Hmm, jetzt kommt mir gerade die Idee: Wenn es reicht die steigende oder fallende Flanke des Signals als Interrupt zu nehmen und dann mit dem internen Timer die Zeit bis zum nächsten Signal zu messen, dann ist das in der Tat einfach ...

Nicolas Nickisch

"Carsten Kurz" schrieb im Newsbeitrag news: snipped-for-privacy@t-online.de...

Reply to
Nicolas Nickisch

"Nicolas Nickisch" schrieb:

fallende

einfach

... und genau das macht die Capture-Einheit von uCs: automatische Triggerung eines internen Zählers durch externe Rechteck-Signale.

Gruß,

Christian

Reply to
Christian Gudrian

Wenn Du einen sauberen Rechteck am Eingang hast (also keine softwaremäßige Entstörung/Filterung/Entprellung machen mußt), dann sollte das genügen.

Wenn Du einen sehr weiten Frequenzbereich überstreichen willst (vermutlich in Deinem Falle eher nicht), dann kann man auch nach 5 ms,

25 ms, 100 ms usw. jeweils mal nachsehen, ob der Zähler schon am Überlaufen ist und ansonsten weiterzählen lassen. Hinweis: die Überläufe selbst müssen Dich wenig kümmern. Die Zwerikomplementzahlen sind so angelegt, daß Du den Wert zweier 16-Bit-Zählerzustände einfach subtrahieren kannst (Variablen vom Typ uint16_t). Damit kannst Du einen durchlaufenden Zähler benutzen und die input capture Funktion. Falls der Zähler inzwischen einen Nulldurchgang hatte, stört das überhaupt nicht, Du mußt nur noch den Fall abfangen, daß er nicht /mehr als einen/ Nulldurchgang hatte.

Die Benutzung von input capture spart Dir den Overhead der Interruptfunktion, die Du bei Deinem externen Interrupt hättest.

Bitte kein TOFU. (Siehe

formatting link
)

--
J"org Wunsch					       Unix support engineer
joerg_wunsch@interface-systems.de        http://www.interface-systems.de/~j/
Reply to
Joerg Wunsch

Ich schätze, daß das Signal für meine Zwecke ausreichen wird ! Nicolas Nickisch

"Heinz Saathoff" schrieb im Newsbeitrag news: snipped-for-privacy@news.arcor.de... Nicolas Nickisch schrieb...

fallende

einfach

Denk daran, daß das Signal von einem Sensor kommt, bei dem die Zeit zwischen 2 Impulsen schwanken kann (Jitter). Also entweder in einer Nachbearbeitung mitteln oder mehr als einen Impuls auswerten. Kann man mit Cap/Com Unit machen, aber IMO ist ein Zähler besser geeignet, da die Interruptlast geringer wird.

- Heinz

Reply to
Nicolas Nickisch

Sehr nett von Dir. Als "Gedankenstütze" wäre das prima.

Gleich noch ne' Frage:

Da die Schaltung letzlich die im Fahrzeug vorhandene Steuerung überlisten soll, muß in bestimmten Fällen das vom Getriebesignal unterdrückt oder auch unverändert weitergegeben werden.

Ich muß also:

- Das Signal erkennen

- Die Frequenz ermitteln

- ggf. die Pulse unverändert wieder ausgeben.

Ginge das mit diesen OC1ABC-Pins der ATmels ? Wenn ich die Doku richtig verstanden habe, dann kann man einen Timer so programmieren, daß nach dessen Ablauf ein bestimmter Pin "kippt".

Nicolas Nickisch

"Dirk Wiebel" schrieb im Newsbeitrag news:bjmnhr$c3q$ snipped-for-privacy@newsserv.zdv.uni-tuebingen.de... Hallo Nicolas,

habe gerade einen Frequenzzaehler fertig, das ist eine ganz nette Einstiegsuebung in den ATmega8, bzw. -16 gewesen. Ich messe damit Impulse von einer Lichtschranke aus. Auf einem kleinen LCD wird sowohl die aktuelle Frequenz (aktualisiert 1x pro sec) als auch die Gesamtzahl der Impulse ausgegeben. Vorgehen:

- LCD-Routinen fuer HD44800 einbinden und ggfs. anpassen (fuer 4MHz z.B. auf

formatting link
zu finden)

- Timer2 starten und mit der Overflow-Interruptroutine den Zeitablauf steuern

- Timer1 (16bit) als Zaehler verwenden.

1x pro Sekunde lese ich den Zaehler in ein "Gesamtanzahl"-Register ein, gebe die Werte (Aktuell -> Frequenz und Gesamtanzahl) aus und loesche den Zaehler.

Fuer die Umwandlung der Binaer-/Hexwerte in ASCII gibt's massenhaft Beispiele im Netz. Suche mal nach "hex2bcd", die "Abziehmethode" ist auch recht leicht verstaendlich.

Den Rest der Zeit schlaeft die CPU und wird nur von den Timer/Counter-Interrupts geweckt.

Wenn Du meinen (q&d) Assembler-Code haben willst, schicke ich ihn Dir heute abend (von zu Hause).

Gruss, Dirk

--
Dirk Wiebel
SFB 441 Linguistische Datenstrukturen
 Click to see the full signature
Reply to
Nicolas Nickisch

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.