Forum: Mikrocontroller und Digitale Elektronik AVR Frequenzzähler für Metalldetektor


von Kaktusbombe (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Forum,

ich versuche gerade, einen Metalldetektor mit einem Attiny 2313A als 
Frequenzzähler aufzubauen.

Der Schwingkreis schwingt bei ca. 220 KHz

Der AVR sollte darauf eingestellt sein, dass er die Signalflanken in 
einem Fenster von 32 ms zählt und anhand von diesem Zählwert 
verschiedene Töne ausgibt. Leider piept der AVR immer nur in der 
gleichen Tonlage, unabhängig davon, ob ich Metall an die 
Schwingkreisspule bringe oder den Schwingkreis mit zusätzlichen 
Kondensatoren verstimme.
Die Signalpegel des Schwingkreises sehen - soweit messbar - gut aus, das 
Signal pendelt von ca. 0,5 V bis auf 3-4 V. Der AVR soll mit 4,5 V 
betrieben werden.
Der Schaltplan ist recht simpel, der AVR hat einen 100 nF Kondensator 
neben sich und der Ausgang des Schwingkreises geht auf Pin D.5. Ein 
piezo-Pieper ist über 1 kOhm und 10 uF an Pin B.2 angeschlossen.

Da ich mit der AVR Timer-hardware jetzt zum ersten Mal richtig arbeite, 
wäre es schön, wenn ihr euch mal meinen Code im Anhang anschauen 
könntet. Vielleicht entdeckt ihr ja einen Fehler, der mir entgangen ist?

von Oliver S. (oliverso)


Lesenswert?

volatile

Oliver

von Kaktusbombe (Gast)


Lesenswert?

Okay, ich habe beide Variablen, die ich in der ISR verwende, als 
volatile deklariert.
Leider ändert sich nichts am Ergebnis.

von c-hater (Gast)


Lesenswert?

Kaktusbombe schrieb:

> Okay, ich habe beide Variablen, die ich in der ISR verwende, als
> volatile deklariert.
> Leider ändert sich nichts am Ergebnis.

Wie wäre es denn, wenn du einfach mal wenigstens einen Schaltplan der 
Hardware zeigst, idealerweise auch noch ein Foto des Aufbaus?

Software ist immer nur die eine Hälfte der Sache, wenn die Hardware nur 
unbrauchbaren Müll liefert, kann die beste Software nix ausrichten.

von Patrick (Gast)


Lesenswert?

Du scheinst eine Art Adaption drin zu haben. Schmeiß die mal raus und 
versuch es erstmal mit Konstanten. Alternativ nach einer gewissen Anzahl 
Messtorzeiten die Max und Min Werte wieder auf ihre Init - Werte setzen, 
sonst wird Fullscale immer größer und die ohnehin schon geringe 
akustische Auflösung ist dahin. Wenn du die Signalpegel bei 200 kHz 
bestimmen konntest, kannst ja auch maximale und minimale Frequenz 
bestimmen. Ich denke der Krebsschaden liegt ausserdem darin, dass du 
deine "Fullscale" Berechnung auf Werte von 0 bis 8 runter brichst.
Läuft dein Timer 1 überhaupt? Aktivier doch mal einen overflow interrupt 
und lasse nach x zyklen einen Pin mit ner Led dran toggeln.

von Patrick (Gast)


Lesenswert?

Noch eine Anmerkung: TCNT1 bei laufendem Timer zu lesen kann 
Kauderwelsch fabrizieren. Für deine Anwendung kannst du den Timer vor 
der Messung anhalten, dann den Zählwert lesen, nullsetzen und dann den 
Timer wieder starten.

Bei 32 ms Torzeit müsstest du mit 200 kHz am Schwingkreis 6400 Takte 
gezählt haben. Versuch doch mal rund um diesen Wert dein 
Fullscalefenster zu bilden, das du nach und nach kleiner machst. Wirst 
dann sehen, wie stark die Frequenz tatsächlich schwankt.

von S. Landolt (Gast)


Lesenswert?

Mir ist die Art der Messung unklar: Timer0 läuft doch nur bis OCR0A 
(CTC!), wie wird da (im Regelfall) OCR0B für die Mess-ISR überhaupt 
erreicht?
  Wenn ich es richtig verstehe, müsste für diese Doppelnutzung von 
Timer0 OCR0B relativ klein sein, bzw. es müsste sichergestellt sein, 
dass OCR0A immer größer ist.

von Patrick (Gast)


Lesenswert?

S. Landolt hat Recht. Für eine Variable Frequenz müsstest du noch die 
ISR für Timer1A hinzufügen und dort den aktuellen Comparewert um deine 
berechnete Comparegröße erhöhen. Überlauf bei 250 nicht vergessen.

von c-hater (Gast)


Lesenswert?

Patrick schrieb:

> Noch eine Anmerkung: TCNT1 bei laufendem Timer zu lesen kann
> Kauderwelsch fabrizieren. Für deine Anwendung kannst du den Timer vor
> der Messung anhalten, dann den Zählwert lesen, nullsetzen und dann den
> Timer wieder starten.

Wozu soll denn das gut sein?

Timer1 ist beim Tiny2313A ein vollwertiger 16Bit-Timer mit ICP-Fähigkeit 
(so wie bei den allermeisten Megas). Da braucht man zur Messung 
überhaupt nix mehr am Timer rumspielen, der wird nur einmal gestartet 
und läuft dann mit vollem Zählumfang durch.
Man braucht bloß noch auf die ICP-Interrupts reagieren und Differenzen 
der gemessenen Zeitpunkte bilden. Einfacher kann es ja wirklich nicht 
mehr gehen...

von falkR (Gast)


Lesenswert?

Kaktusbombe schrieb:
> Der AVR sollte darauf eingestellt sein, dass er die Signalflanken in
> einem Fenster von 32 ms zählt und anhand von diesem Zählwert
> verschiedene Töne ausgibt. Leider piept der AVR immer nur in der
> gleichen Tonlage, unabhängig davon, ob ich Metall an die
> Schwingkreisspule bringe oder den Schwingkreis mit zusätzlichen
> Kondensatoren verstimme.

32ms sind 31,25Hz. Ist das der Takt vom ADC oder wie wird das Signal vom 
Schwingkreis eingemessen?

Sicher, dass der Schwingkreis schwingt? Wie wird er überhaupt zum 
Schwingen angeregt? Mit sowas wie Meißnerschaltung oder Colpitts per 
rückgekoppeltem Transistor?


> Die Signalpegel des Schwingkreises sehen - soweit messbar - gut aus, das
> Signal pendelt von ca. 0,5 V bis auf 3-4 V. Der AVR soll mit 4,5 V
> betrieben werden.

Was genau pendelt da von ca. 0,5V bis auf 3-4V - der Ausgang des 
Schwingkreises?

von Kaktusbombe (Gast)


Lesenswert?

S. Landolt hatte den richtigen Riecher, ich hab das Datenblatt falsch 
verstanden. Mein Bestreben, einen Ausgangston mit dem CTC Timer zu 
erzeugen, hat dafür gesorgt, dass mein Zählfenster nie erreicht wurde.

Ich habe jetzt den CTC Modus beendet und den Timer0 im Default Modus 
belassen. Jetzt muss ich mir nur noch etwas überlegen, wie ich 
stattdessen ein akustisches Ausgangssignal hinbekomme.

von batman (Gast)


Lesenswert?

Durch 20 teilen auf einen Port und Beeper dran?

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.