www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega324P Frage zum Analog Comparator


Autor: Frank(d*m#m.) (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: Frank(d*m#m.) (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank(d*m#m.) (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.