mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Audiosignal über ADC einlesen / AT90CAN128 / Bandbreite 10kHz


Autor: Mike G. (Firma: ixwyc) (balu1980)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

ich möchte ein Audiosignal am ADC des AT90CAN128 einlesen.
Dazu habe ich einen Tiefpassfilter 1. Ordnung mit einer Grenzfrequenz
von 10kHz vor den AD Wandlereingang gelegt. Nach dem Tiefpassfilter
habe ich mit Hilfe eines Spannungsteilers mit hilfe der Referenzspannung
das Signal in den positiven Bewreich verschoben um auch die negative 
Halbwelle mitzulesen.

Wenn ich an den Eingang eine Gleichspannung Anlege funktioniert es auch
soweit, bei

0V --> ADC_wert=0
2,56V --> ADC_wert = 1023

Ach ja, habe die interne Referenzspannung gewählt, und den Areff Pin mit
einem 100nF Kondensator an GND gehangen.

Wenn ich jetzt ein Audiosignal darauf gebe, lese ich verschiedene 
ADC_werte
Hierzu habe ich den ADC_wert über die USART ausgegeben. Gebe ich den 
ADC_wert über den DAC LTC1257 wieder aus, habe ich im Hintergrund ein 
Rauschen. Der LTC1257 funktioniert einwandfrei. Habe ich mehrfach 
getestet.

Ich denke mal, das der Fehler beim einlesen des Audiosignals liegt.

Anbei noch der Quelltextauschnitt für den ADC:

void ADC_init(void)
{
  uint8_t result;

  // Kanal AD0 gewählt
  ADMUX = 0;

  // Interne Referenzspannung verwenden
  ADMUX |= (1 << REFS0) | (1 << REFS1);

  // Ergebnis Linksbündig ausgeben
  //ADMUX |= (1 << ADLAR);

  // ADC aktivieren, Teilungsfaktor auf 64 // mit ADPS0 entspricht 128
  ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

  // Auto Triggering aktiviert
  //ADCSRA |= (1 << ADATE);

  ADCSRA |= (1 << ADSC);

  // Eine ADC Wandlung zum Warmlaufen ohne den Wert zu übergeben
  while (ADCSRA & (1 << ADSC))
  {
    ;
  }

  // Ergebnis muß einmal gelesen werden, da weiteren WAndlungen nicht 
ausgeführt
  // werden.
  result = ADCW;
}

//unsigned char ADC_read()
uint16_t ADC_read()
{
  // eine Wandlung
  ADCSRA |= (1<<ADSC);

  // auf Abschluss der Konvertierung warten
         while ( ADCSRA & (1<<ADSC) )
  {
         ;
         }

  // Wandlungsergebnisse zurückgeben
    return ADCW;

}

Gruß Mike

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.