Forum: Mikrocontroller und Digitale Elektronik ATmega324P Frage zum Analog Comparator


von Frank(d*m#m.) (Gast)


Lesenswert?

Hallo zusammen,


ich möchte den Analog Comparator des ATmega324P ansprechen. Das heißt 
ein Signal(Sinus mit niedriger Frequenz) einlesen und mit dem Komparator 
die Frequenz zählen. Dazu möchte ich den Timer/Counter1 verwenden.

Laut Datenblatt gibt es die im ACSR - Register die Bits: ACIE und ACIC. 
Mit dem ACIC-Bit schalte ich den Komparator auf den Timer/Counter1, muss 
ich jetzt das ACIE-Bit aktivieren oder läuft die Zählung im 
Timer/Counter1 ??

Freue mich auf eine Antwort.

Beste Grüße
Frank

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Wenn du nicht gerade noch zusätzlich einen Komparator-Interrupt
haben willst, lässt du ACIE ausgeschaltet.  Selbst wenn du einen
haben willst, kommst du besser, stattdessen den input capture
interrupt zu aktivieren.

Vorsicht bei niedrigen Frequenzen: Jitter oder eine leichte Überlage-
rung einer zweiten Frequenz könnten schnell dazu führen, dass der
Interrupt mehrmals triggert, weil das Signal über die Schaltschwelle
ein paarmal hin und her "hüpft".

von Frank(d*m#m.) (Gast)


Lesenswert?

Hallo Jörg,


danke für die schnelle Antwort.

Ich möchte mir einen Violinenstimmer bauen, es ist also gut möglich das 
ich die Harmonischen mitverstärke und das Signal verfälschen können.

Ich würde behaupten das setzen des ICF (Input Capture Flag) reicht zum 
entprellen des Interrupts?

Beste Grüße
Frank

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Frank(d*m#m.) schrieb:

> Ich möchte mir einen Violinenstimmer bauen, ...

Dafür gibt's doch Stimmgabeln :), und den Rest bekommt man mit
Gehör hin. ;-)

> Ich würde behaupten das setzen des ICF (Input Capture Flag) reicht zum
> entprellen des Interrupts?

Nein, du könntest in der ISR für den input capture den Interrupt
selbst sperren (und den Timestamp schnell vorher sichern), und ein
Timer gibt ihn erst dann wieder frei, wenn es sinnvoll ist.  Du
musst ja nur Frequenzen von etwa 190 Hz (kleines g) bis 660 Hz
(zweigestrichenes e) erkennen können.

Möglicherweise wäre es ein sinnvollerer Ansatz, das Signal in einen
AD-Wandler zu stopfen und eine FFT drüber laufen zu lassen.  Bei
diesen Frequenzen könnte ein ATmega das gerade noch so schaffen.

von Frank(d*m#m.) (Gast)


Lesenswert?

Hi Jörg,


deine Anmerkung mit der Stimmgabel und dem Gehör ist natürlich richtig, 
aber ich brauche das auch für ein Projekt in der Uni.

Habe mir hier ein zwei Problemlösungen für einen Gitarrenstimmer 
durchgelesen. Da wurde grundsätzlich davon abgeraten eine FFT versuchen 
zu wollen, da ein Instrument eine viel größere Amplitude der 
Grundfrequenz als die Harmonischen aufweist.


Wenn FFT, dann weiß ich leider nicht wie ich das anzustellen habe. 
Kannst du mir da mal die nötigen Programmschritte(grob) aufschreiben?

Ich habe natürlich Fourier-Transformation in Mathe3 gehabt und auch per 
Hand durchgerechnet. Weiß also das man die Funktion mit exp(*) 
multipliziert und integriert (den *-Ausdruck habe ich gerade nicht bei 
der Hand), die diskrete Fourier-Transformation (DFT) ist dann die 
Summenbildung anstelle der Integrale. (Bitte um Korrektur, wenn Falsch)

Äh wenn du also zufällig eine FFT in C hast wäre das Traumhaft.

Beste Grüße
Frank

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Frank(d*m#m.) schrieb:

> Habe mir hier ein zwei Problemlösungen für einen Gitarrenstimmer
> durchgelesen. Da wurde grundsätzlich davon abgeraten eine FFT versuchen
> zu wollen, da ein Instrument eine viel größere Amplitude der
> Grundfrequenz als die Harmonischen aufweist.

Ja, und, wo ist dabei das Problem?  Dann sollte man doch einen
sauberen Peak bekommen...

> Wenn FFT, dann weiß ich leider nicht wie ich das anzustellen habe.
> Kannst du mir da mal die nötigen Programmschritte(grob) aufschreiben?

Nicht wirklich, weil ich's auch nur theoretisch kenne. ;-)

Du musst in gleichmäßigen Abständen sampeln, natürlich entsprechend
dem (Nyquist/Shannon/Whittaker/Kotelnikow)-Abtasttheorem mit mehr
als der doppelten Frequenz der höchsten Signalfrequenz.  Das kannst
du dadurch erreichen, dass du den ADC im auto-trigger-Modus laufen
lässt und als Triggerquelle ein Timer-Ereignis nimmst.  Da die
ADC-Wandlungszeit ab der 2. Wandlung konstant ist, erreichst du
damit eine äquidistante Abtastung.

Für den eigentlichen FFT-Algorithmus gibt es von Atmel eine Appnote,
hätte ich jetzt gesagt...  Hmm, finde ich nicht, möglicherweise
verwechsle ich das gerade mit der Appnote für digitale Filter.  Was
ich aber finden konnte ist:

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

Ich denke, damit solltest du weiter kommen können.

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.