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?
Okay, ich habe beide Variablen, die ich in der ISR verwende, als volatile deklariert. Leider ändert sich nichts am Ergebnis.
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.
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.
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.
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.
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.
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...
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.