mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Brummen im Audiosignal


Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe eine SD-Karte an einem Mega32 angeschlossen. An OC0 ist ein 
TBA820M angeschlossen.
Von der SD-Karte wird ein Wave file ausgelesen (8bit, 22khz) und dann 
mit dem  16Bit Timer ins OCR0 Register geschrieben. Wenn ich das 
Soundfile mit "PROGMEM" im Flash vom AVR speicher, dann kann ich auch 
1sek lang Musik ausgeben. Die Qualität ist dafür auch sehr gut.
Wenn ich die Daten aber von der SD-Karte lese, kommt immer ein Brummen 
mit in das Audiosignal.
Das ist mein Code:
/*
 Copyright:      Radig Ulrich  mailto: mail@ulrichradig.de
 Author:         Radig Ulrich
 Remarks:        
 known Problems: none
 Version:        28.05.2004
 Description:    Dieses Programm dient als Beispiel zur Ansteuerung einer MMC/SD-Memory-Card.
         Zum Zugriff auf eine MMC/SD-Karte, muß man nur die Datei mmc.c
         in sein eigenes Programm einfügen.
*/

#include <stdio.h>
#include <string.h>  
#include <avr/io.h>  
#include <avr/eeprom.h>  
  
#include "mmc.h"
#include "fat.h"
#include "usart.h"
volatile unsigned char Buffer[512];
volatile uint8_t next=0;
volatile uint16_t a=0;

//Timer1 Interrupt
ISR (TIMER1_OVF_vect)
//############################################################################
{
  TCNT1 = 65535 - (SYSCLK/8/22000);
  a++;
  if(a>=512)
  {
    next=1;
    a=0;
  }
  OCR0 = Buffer[a];
}



//Hauptprogramm
int main (void)
{
  //SYSCLK defined in usart.h
  //Initzialisierung der seriellen Schnittstelle
  usart_init(19200);
  
  //Set TIMER0 (PWM OC0 Pin)
  DDRB |= (1<<3);
  TCCR0 |= (1<<WGM01|1<<WGM00|1<<COM01|1<<CS00);
  OCR0 = 128;
  
  //Set TIMER1 
  TIMSK |= (1 << TOIE1);
  //Prescaler 8
  TCCR1B = (1<<CS11);
  //SYSCLK define in usart.h
  TCNT1 = 65535 - (SYSCLK/8/22000);
  
  //Globale Interrupts Enable
  sei();
  
  
  
  //Initialisierung der MMC/SD-Karte
  usart_write("System Ready!\r\n");  
  while ( mmc_init() !=0) //ist der Rückgabewert ungleich NULL ist ein Fehler aufgetreten
    {
    usart_write("** Keine MMC/SD Karte gefunden!! **\n");  
    }
  usart_write("Karte gefunden!!\n");
  
  fat_cluster_data_store();//laden Cluster OFFSET und Size ins EEPROM
  //Initialisierung der MMC/SD-Karte ENDE!

  
  unsigned int tmp;
  
  mmc_read_csd (Buffer);
  
  for (tmp = 0;tmp<16;tmp++)
    {
    usart_write("%x ",Buffer[tmp]);
    };


  //Ausgabe des Root Directory
  unsigned int Clustervar;
  unsigned char Dir_Attrib = 0;
  unsigned long Size = 0;
  usart_write("\nDirectory\n\n");
  for (char a = 1;a < 240;a++)
  {
    Clustervar = fat_read_dir_ent(0,a,&Size,&Dir_Attrib,Buffer);
      if (Clustervar == 0xffff)
      {
        break;
      }
    tmp = (Size & 0x0000FFFF);
    usart_write("Cluster = %4x DirA = %2x FileName = ",Clustervar,Dir_Attrib);
    usart_write(Buffer);
    usart_write("\n");
  }
  usart_write("\nDirectory Ende\n\n");

  //Lade Cluster für das index.htm File in den Speicher 
  Clustervar = 0;//suche im Root Verzeichnis
  if (fat_search_file("SONNE.WAV",&Clustervar,&Size,&Dir_Attrib,Buffer) == 1)
    {
    usart_write("\nFile Found!!\n\n");
    //Lese File und gibt es auf der seriellen Schnittstelle aus
    for (uint32_t b = 0;b<7372;b++)   //~7372 (3,6MB * 1024 * 1024 / 512)
      {
        fat_read_file (Clustervar,Buffer,b);
        while(next==0){};   //Warten bis die 512Bytes ausgegeben sind
        next=0;
      }
    }

  usart_write("FERTIG!!\n");
  //Hauptprogramm läuft ständig in einer schleife und macht nichts
  while (1)
    {
    }
return (1);
}


Wo kann das brummen entstehen? Eigentlich muss es ja etwas mit der 
SD-Karte zu tun haben.

MfG Jörn

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch ein kleiner Nachtrag:
Die Spannungsversorgung ist ein 7,2V Racingpack.
+5V kommen aus einen 78S05 und +3,3V aus einem LD33V

Die SD-Karte ist mit 3 Spannungsteilern wie auf der Homepage von Ulrich 
Radig angeschlossen.

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du mal versucht, den Mega 32 aus der Fassung zu nehmen und ein 
anderes
NF-Signal einzuspeisen, um zu sehen, ob das Brummen nicht vom Eingang 
des
TBA820 kommt, oder dessen Betriebsspannug nicht "brummfrei" ist?

MfG Paul

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach so, Du speist aus Batterien, da fällt das Brummen auf der 
Betriebsspannung erst mal weg. Hör Dir doch mal die "Musik" von der 
SD-Karte über einen Kartenleser und den Rechner an, nicht das es von 
vornherein schon in der .wav-Datei drinsitzt.

Paul

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
An der Audiodatei liegt es nicht. Am Pc hört sie sich ganz normal an.

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst du mal eben ein paar Sekunden des "verbrummten" Audiosignals hier 
als Anhang (.mp3) posten? Vielleicht hilft es ja bei der Fehlersuche.

Gruß,
Magnetus

P.S.: Ich tippe vorerst mal auf ein Hardwareproblem.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also wenn dann als Wave wie es ist... wenn Du das in MP3 wandelst 
bekommen wir hier alle Ohrenkrebs.

Autor: Jörn (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Einmal das Brummen im Anhang. Das quietschen am Anfang kann man glaube 
ich ignorieren, da es nur einmal ertönt. Vermutlich bevor die SD-Karte 
initialisiert ist und die ersten 512 Bytes geladen hat.

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab die Ursache schon entdeckt (denke ich):

Du liest 512 Bytes aus der Karte aus, gibst diese 512 Bytes nach und 
nach als PWM aus und liest erst danach die nächsten 512 Bytes aus. 
Während des Auslesens hängt deine PWM-Ausgabe, was dann das "Brummen" 
zur Folge hat.

Du solltest also lieber 2 Puffer a 512 Bytes anlegen, und diese 
abwechselnd nutzen.

1. Beschreiben Puffer 1

2. Ausgabe Puffer 1 / gleichzeitiges Beschreiben Puffer 2
3. Ausgabe Puffer 2 / gleichzeitiges Beschreiben Puffer 1

Punkt 2 und 3 müssen halt solange wiederholt werden, bis die gesamte 
Datei ausgelesen wurde.

Gruß,
Magnetus

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Einmal das Brummen im Anhang. Das quietschen am Anfang kann man glaube
> ich ignorieren, da es nur einmal ertönt. Vermutlich bevor die SD-Karte

Lass doch den Timerinterrupt erst laufen, sobald der erste Block in den 
Puffer geladen wurde.

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Magnetus das wars!
Jetzt läufts auch in "top" qualität.
Hab ihr erfahrungswerte wie die Datenrate von SD->AVR ist?
MfG Jörn

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.