Forum: Mikrocontroller und Digitale Elektronik Frequenzmessung Analogsignal mit ATMEGA16


von Sash u. (sashm)


Lesenswert?

Guten Morgen.

Ich habe die letzten Tage dieses Forum durchforstet und bin leider zu 
keiner Problemlösung gekommen. Bei dem Suchwort Frequenzmessung finde 
ich viele Ansätze, aber keins hilft mir weiter.

Ich habe ein analoges sinusähnliches Signal, welches in Abhängigkeit 
einer messenden Geschwindigkeit seine Frequenz ändert. Dieses Signal 
möchte ich gerne mit dem Microcontroller ATMEGA16 aufnehmen und die 
Periodendauer ständig messen. Die Amplitude des Signals liegt zwischen 
300mV und 2V.

Hier im Forum finde ich leider nur rechteckförmige Eingangssignale und 
mir ist nicht ganz klar, wie ich das realisieren kann.

Ich habe mir das Ganze folgendermaßen vorgestellt:

ADC Wandlung permanent wiederholen
Warten bis eine Wandlung beendet und Daten abgeholt wurden
Wert auslesen
Abfrage ob Wert = 0
dann Counter starten bis Wert wieder = 0
Counterwert als Berechnung für die Frequenz f=1/t
Counter Null setzen

Die Schwierigkeit sehe ich darin, wenn bei dem Signal ein Nulldurchgang 
auftritt, dieser aber wegen anderer Arbeit des Microcontrollers nicht 
erkannt wird, funktioniert die Programmierung nicht.

Ich wäre euch sehr dankbar, wenn ihr mir helfen könntet.

mfg

von Matthias L. (Gast)


Lesenswert?

Wandel das Signal mit einem Komparator (zB LM393) vorher in ein 
Rechtecksignal umd. Dann kann der uC (CH-Tastaturen sind doch Sch**) auf 
eine der beiden Flanken eine Auswertung per ICP machen.

>zwischen 300mV und 2V.

Alternativ kannst du das Signal mit nem OPV etwas "aufpäppeln" und dem 
ICP-Pind direkt zur Auswertung geben. Das Schmitttrigger Verhalten des 
Pins sorgt für eine Umwandlung in Rechteckt.


Alternativ kannst du auch den eingebauten Komparator nehmen.

von m.n. (Gast)


Lesenswert?

Sascha M. schrieb:
> Hier im Forum finde ich leider nur rechteckförmige Eingangssignale und
> mir ist nicht ganz klar, wie ich das realisieren kann.

In der Codesammlung findest Du eine Schaltung+Programm für einen 
Drehzahlmesser: Beitrag "einfache Drehzahlmessung mit ATmega88"
Du findest da auch einen Hinweis, wie man den Eingang für Sinussignale 
mit höherer Empfindlichkeit einstellen kann, da das Eingangssignal mit 
dem internen Komparator aufbereitet wird.
Welche Frequenzen willst Du denn messen?

von Sash u. (sashm)


Lesenswert?

Danke schon mal für die schnellen Antworten.

m.n. schrieb:
> Welche Frequenzen willst Du denn messen?


Frequenzen zwischen 44Hz und 600Hz werden anliegen.

von m.n. (Gast)


Lesenswert?

Sascha M. schrieb:
> Frequenzen zwischen 44Hz und 600Hz werden anliegen.

Das sollte ja kein Problem sein. Kommst Du mit dem Komparator klar?

Wenn Deine minimale Amplitude 300mVrms sein sollte (oder > 500mVss), 
kann man auch jeden beliebigen Eingangspin nehmen, indem man ihn auf ca. 
2,4V vorspannt. Alle Eingänge haben eine interne Hysterese von <0,5V bei 
5V Versorgungsspannung.

von Sash u. (sashm)


Lesenswert?

m.n. schrieb:
> Kommst Du mit dem Komparator klar?

Soweit ich aus dem Datenblatt entnehmen kann, muss das ACSR Register 
richtig gesetzt werden und mein Signal an dem positiven Eingang (AIN0) 
angeschlossen werden. Der negative Eingang (AIN1) ist Null. Sobald mein 
Signal größer als 0 wird, wird ACO gesetzt. Daraus entsteht ein 
Rechtecksignal und die Input Capture Unit kann auf die positven Flanken 
reagieren.

Habe ich das soweit richtig verstanden?

von Klaus D. (kolisson)


Lesenswert?

Sascha M. schrieb:
> er negative Eingang (AIN1) ist Null.

Naja .. mit null zu vergleichen ist eher schlecht da ja auch die 
kleineste
Störung von 1mV oder so schon > 0 ist.
Du musst also eher eine andere Vergleichsspannung anlegen.
(bei dier ja wohl so 200mV).
Vielleicht einfach mal nen Poti zwischen VCC und GND und den Schleifer
an AIN1. Zusätzlich noch 100nF von AIN1 zu GND. Dann kannst du den LEVEL
einstellen.

Gruss Klaus

von billydeedaniels (Gast)


Lesenswert?

Irgendwie kommt mir das ganze bekannt vor.
Geht es hierbei zufällig um Auswertung von Dopplersignalen mit einem uC?

Das Differenzsignal vom ausgesandten und empfangenen Signal ist 
Niederfrequenkt, was auf deine Anforderung deuten würde.

Ich mußte so etwas auch mal realisieren.
Ich habe für das Eingangssignal einen offset am ADC benutzt, der Offset 
entspricht dann deinem Nulldurchgang. Wenn es kein sauberer Sinus sein 
sollte, dann brauchst du eine FFT um die Frequenz bestimmen zu können.
Außerdem habe ich auf eine Art Trigger gewartet.
Ich hatte wenn ich mich nicht täusche den Mega128 der hat nämlich 
ausreichend Speiecrh dafür gehabt.
Ich habe das Signal bzw. die Werte gebuffert und dann mit FFT das Siganl 
verarbeitet. Daraus konnte ich dann die Geschwindigkeit bestimmen.
Für FFT auf dem uC kann ich nur an Elm Chann verweisen. Sehr schnelle 
FFT in Assambler.

von Sash u. (sashm)


Lesenswert?

billydeedaniels schrieb:
> Geht es hierbei zufällig um Auswertung von Dopplersignalen mit einem uC?

Richtig. ich bin dabei eine Geschwindigkeitsmessung zu erstellen. Erst 
sollte es mit einem Modul ausgeführt werden. Wenn das stabil läuft, 
werde ich ein zweites Modul im 60Winkel daneben setzen. (Janus 
Konfiguration) Zur Realisierung habe ich mir noch keine Gedanken 
gemacht.

Deine Version der Realisierung hört sich komplizierter an? Wie erstellt 
man denn aus dem Signal eine FFT? Hat der uC diese Funktion? Ist es 
nicht einfacher, die Periodendauer zu messen?

von billydeedaniels (Gast)


Lesenswert?

http://elm-chan.org/works/akilcd/report_e.html

Ich hoffer der Link funktioniert.
Sollte auf jeden Fall der Audio Spectrum Monitor sein.

von billydeedaniels (Gast)


Lesenswert?

Also ich weiß nicht, wie dein Signal aussieht.
Aber das was ich hatte, war ziemlich fuzzy, sprich es war nicht möglich 
ohne weiteteres die Nulldurchgänge zu definieren da es eher einem 
Rauschen ähnelte. Wenn es bei dir ein erkennbarer Sinus sein sollte, mit 
Nulldurchgängen, dann sollte es auch ohne die FFT möglich sein.

von m.n. (Gast)


Lesenswert?

Sascha M. schrieb:
> Richtig. ich bin dabei eine Geschwindigkeitsmessung zu erstellen.

Dazu habe ich auch einen passenden Link :-)
Beitrag "Stoppuhr – Geschwindigkeit – Pulsweite mit Atmega88"

Wenn man nur ein einziges Signal hat, kann man den Analog-Komparator 
passend beschalten und über ICP1 mit Timer1 sehr genaue Messungen 
durchführen. Für Umrechnung und Anzeige kannst Du ja das bestehende 
Programm verwenden; für die Messung müssen die Interrupt-Routinen 
angepaßt werden.

von Sash u. (sashm)


Lesenswert?

billydeedaniels schrieb:
> Also ich weiß nicht, wie dein Signal aussieht.

Ich habe einen annähernden Sinus. Damit lassen sich dann auch die 
Nulldurchgänge detektieren.

von Curby (Gast)


Lesenswert?

Ich hab ein Stimmgerät für Gitarre gebaut mit dem Atmega16. Erst habe 
ich ich das Signal ziemlich verstärkt, dass es annähernd Rechteckig 
wurde (5V Op Schaltung) und dann habe ich das Signal in den 
Analog-Digital Wandler gejagt und nicht den Komparator.

Dann habe ich immer die Zeit gemessen, die eine Periode gebraucht hat 
und mit einer tabelle vergleichen. Ich hab dabei aber nicht eine 
Durchgangslinie verwendet, sondern die beiden Spitzen vom erzeugten 
Rechtecksignal.
Also immer warten bis das Obere Ende ereicht ist, dann warten bis die 
untere Spannungsgrenze erreicht ist.
Dadurch kann ich auch geringe Oberwellen kompensieren. Nur wenn die 
Oberwellen von Spitze zu Spitze reichten, wurde die erkannte Frequenz 
verfälscht.

Vielleicht war das ja ein alternativer Ansatz.

von Klaus D. (kolisson)


Lesenswert?

Mach es so, wie die Typen mit den Metallsuchgeräten.
Fünf OPV Stufen hintereinander... jeweils ne Fette Verstärkung..
.. dass stellt den Sinus schon ziemlich steil auf.
dann der Komparator und der Detector.

ggf. noch einen Satz Clampdioden damit die OPV nicht sättigen.

Ich hoffe du verstehst!  würde mich aber auch nicht wundern
wenn du nicht verstehst.

Gruss
Klaus de Lisson

von Sash u. (sashm)


Lesenswert?

Klaus De lisson schrieb:
> Mach es so, wie die Typen mit den Metallsuchgeräten.
> Fünf OPV Stufen hintereinander... jeweils ne Fette Verstärkung..
> .. dass stellt den Sinus schon ziemlich steil auf.
> dann der Komparator und der Detector.
>
> ggf. noch einen Satz Clampdioden damit die OPV nicht sättigen.
>
> Ich hoffe du verstehst!  würde mich aber auch nicht wundern
> wenn du nicht verstehst.
>
> Gruss
> Klaus de Lisson

Hallo, ich verstehe.
Den Sinus wandele ich dann in ein Rechtecksignal um.
Habe ich das dann auch richtig verstanden, dass es gar nicht möglich 
ist, aus einem annähernden Sinus eine Messung der Periodendauer 
durchzuführen? Man benötigt immer ein Rechtecksignal?

Ich stelle mir das so vor:
Mein Signal ist kein reiner Sinus, sondern ist verzerrt. Wenn keine 
Frequenz zu messen ist, habe ich ein Rauschen von einigen 100mV. Würde 
ich im Analog Comparator des Atmega16 eine Vergleichspannung von gerade 
diesem Rauschen einstellen, so beginnen meine zu messenden Frequenzen ja 
erst ab diesem Wert. Wenn ich einen Sinus betrachte, dann ergibt sich 
eine andere Periodendauer, wenn ich jede Nulldurchgänge detektiere oder 
meine Messung erst etwas später (nach dem Rauschen).
Wurde weiter oben empfolen!

Danke für die Hilfe.

von Ulrich (Gast)


Lesenswert?

Damit man nicht zu empfindlich auf Rauschen reagiert, sollte man zru 
Bestimmung der Flanken eine gewisse Hysterese einbauen. Davor sollte ein 
Filter sein (wenigstens ein Tiefpass) um unnötiges Rauschen zu 
unterdrücken.
Auch sollte man mehr als nur eine Periode messen und dann die Werte 
statistisch auswerte: Dabei eher nicht einfach den Mittelwert nehmen, 
sondern eher in Richtung Median gehen, denn man muss mit echten 
Ausreißern rechnen, also werden die deutlich falsch sind.

Wenn die Qualität des Signals eher schlecht ist, wird die FFT schon die 
Methode der Wahl sein, zumindest erst mal für die Größenordung. Für eine 
genaue Messung (langer Datendatz) per FFT könnte der Speicher knapp 
werden. Danach kann man mit angepasstem digitalem Filter eine Messung 
über die Periodendauer machen.  Alternativ ginge auch ein digitaler IQ 
Mischer und dann eine FFT für einen kleinen verbleibenden Bereich - 
klingt kompliziert, ist aber ein Weg, um mit wenig Speicher genau den 
Teil der FFT zu berechnen den man braucht.

von Klaus D. (kolisson)


Lesenswert?

Ulrich schrieb:
> Wenn die Qualität des Signals eher schlecht ist, wird die FFT schon die
> Methode der Wahl sein,

ob das nicht wieder zu hoch gegriffen ist.

Ulrich schrieb:
> Auch sollte man mehr als nur eine Periode messen und dann die Werte
> statistisch auswerte: Dabei eher nicht einfach den Mittelwert nehmen,
> sondern eher in Richtung Median gehen,

Das macht Sinn.

Sascha M. schrieb:
> Wenn keine
> Frequenz zu messen ist, habe ich ein Rauschen von einigen 100mV.

Das würde in mir die Suche nach einem Fensterkomparator aktivieren.
Dabei musst du dir aber im Klaren sein, dass ein Sinus eine gewisse
Steilheit im Signal hat. (Delta U Delta T)
Diese Steilheit ist aber im Betrachtungsfenster von einigen hundert
Millivolt auch von der Gesamtamplitude abhängig.

Ich denke du musst deine Parameter enger eingrenzen oder einfach
mit einem Komparator austesten.

klaus

von Sash u. (sashm)


Lesenswert?

Klaus De lisson schrieb:
> Das würde in mir die Suche nach einem Fensterkomparator aktivieren.

Meinst du vielleicht das Komparator-IC LM393?
Sollte ich dann die Beschaltung für den Non-inverting Comparator aus dem 
Datenblatt nehmen? MIr ist die Beschaltung noch nicht ganz klar.

Ich habe das Komaparator IC LM311 vorliegen. Kann man mit diesem auch 
aus einem Sinus ein verwendbares Rechtecksignal erzeugen?

von Sash u. (sashm)


Lesenswert?

Das Programm läuft jetzt.
Ich habe das Signal ohne Komparatorschaltung direkt auf den Analog 
Comparator gegeben. Vorher filtert ein Hochpass das Signal noch.
Am AIN0 liegt mein Signal und an AIN1 liegt eine Referenzspannung von 
eingen mV, die ich mit einem Poti von VCC zu GND einstelle.

Sobald mein Signal größer als die Referenzspannung ist, wird ACO gesetzt 
und durch die Input Capture Unit, bei einer positive Flanke, das ICF1 
gesetzt und der Zählerstand von T1 ins Register ICR1 geschrieben.

Aus zwei steigenden Flanken lässt sich jetzt die Periodendauer und 
Frequenz bestimmen.  Wird nach Ablauf von T0 keine Flanke detektiert, so 
ist die Frequenz 0. Der Wert wird noch geschickt umgerechnet und über 
UART an einen PC gesendet.

Einen großen Dank an alle, die mir dabei geholfen haben.

Bei Interesse an den Code, einfach melden.

Sobald ich die Ergebnisse mit einer Referenzmessung überprüft habe, 
werde ich ein zweites Signal dazuschalten und beide Signale zur 
Auswertung bringen.

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.