Forum: Mikrocontroller und Digitale Elektronik Brummen im Audiosignal


von Jörn (Gast)


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:
1
/*
2
 Copyright:      Radig Ulrich  mailto: mail@ulrichradig.de
3
 Author:         Radig Ulrich
4
 Remarks:        
5
 known Problems: none
6
 Version:        28.05.2004
7
 Description:    Dieses Programm dient als Beispiel zur Ansteuerung einer MMC/SD-Memory-Card.
8
         Zum Zugriff auf eine MMC/SD-Karte, muß man nur die Datei mmc.c
9
         in sein eigenes Programm einfügen.
10
*/
11
12
#include <stdio.h>
13
#include <string.h>  
14
#include <avr/io.h>  
15
#include <avr/eeprom.h>  
16
  
17
#include "mmc.h"
18
#include "fat.h"
19
#include "usart.h"
20
volatile unsigned char Buffer[512];
21
volatile uint8_t next=0;
22
volatile uint16_t a=0;
23
24
//Timer1 Interrupt
25
ISR (TIMER1_OVF_vect)
26
//############################################################################
27
{
28
  TCNT1 = 65535 - (SYSCLK/8/22000);
29
  a++;
30
  if(a>=512)
31
  {
32
    next=1;
33
    a=0;
34
  }
35
  OCR0 = Buffer[a];
36
}
37
38
39
40
//Hauptprogramm
41
int main (void)
42
{
43
  //SYSCLK defined in usart.h
44
  //Initzialisierung der seriellen Schnittstelle
45
  usart_init(19200);
46
  
47
  //Set TIMER0 (PWM OC0 Pin)
48
  DDRB |= (1<<3);
49
  TCCR0 |= (1<<WGM01|1<<WGM00|1<<COM01|1<<CS00);
50
  OCR0 = 128;
51
  
52
  //Set TIMER1 
53
  TIMSK |= (1 << TOIE1);
54
  //Prescaler 8
55
  TCCR1B = (1<<CS11);
56
  //SYSCLK define in usart.h
57
  TCNT1 = 65535 - (SYSCLK/8/22000);
58
  
59
  //Globale Interrupts Enable
60
  sei();
61
  
62
  
63
  
64
  //Initialisierung der MMC/SD-Karte
65
  usart_write("System Ready!\r\n");  
66
  while ( mmc_init() !=0) //ist der Rückgabewert ungleich NULL ist ein Fehler aufgetreten
67
    {
68
    usart_write("** Keine MMC/SD Karte gefunden!! **\n");  
69
    }
70
  usart_write("Karte gefunden!!\n");
71
  
72
  fat_cluster_data_store();//laden Cluster OFFSET und Size ins EEPROM
73
  //Initialisierung der MMC/SD-Karte ENDE!
74
75
  
76
  unsigned int tmp;
77
  
78
  mmc_read_csd (Buffer);
79
  
80
  for (tmp = 0;tmp<16;tmp++)
81
    {
82
    usart_write("%x ",Buffer[tmp]);
83
    };
84
85
86
  //Ausgabe des Root Directory
87
  unsigned int Clustervar;
88
  unsigned char Dir_Attrib = 0;
89
  unsigned long Size = 0;
90
  usart_write("\nDirectory\n\n");
91
  for (char a = 1;a < 240;a++)
92
  {
93
    Clustervar = fat_read_dir_ent(0,a,&Size,&Dir_Attrib,Buffer);
94
      if (Clustervar == 0xffff)
95
      {
96
        break;
97
      }
98
    tmp = (Size & 0x0000FFFF);
99
    usart_write("Cluster = %4x DirA = %2x FileName = ",Clustervar,Dir_Attrib);
100
    usart_write(Buffer);
101
    usart_write("\n");
102
  }
103
  usart_write("\nDirectory Ende\n\n");
104
105
  //Lade Cluster für das index.htm File in den Speicher 
106
  Clustervar = 0;//suche im Root Verzeichnis
107
  if (fat_search_file("SONNE.WAV",&Clustervar,&Size,&Dir_Attrib,Buffer) == 1)
108
    {
109
    usart_write("\nFile Found!!\n\n");
110
    //Lese File und gibt es auf der seriellen Schnittstelle aus
111
    for (uint32_t b = 0;b<7372;b++)   //~7372 (3,6MB * 1024 * 1024 / 512)
112
      {
113
        fat_read_file (Clustervar,Buffer,b);
114
        while(next==0){};   //Warten bis die 512Bytes ausgegeben sind
115
        next=0;
116
      }
117
    }
118
119
  usart_write("FERTIG!!\n");
120
  //Hauptprogramm läuft ständig in einer schleife und macht nichts
121
  while (1)
122
    {
123
    }
124
return (1);
125
}

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

MfG Jörn

von Jörn (Gast)


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.

von Paul Baumann (Gast)


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

von Paul Baumann (Gast)


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

von Jörn (Gast)


Lesenswert?

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

von Magnus Müller (Gast)


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.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

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

von Jörn (Gast)


Angehängte Dateien:

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.

von Magnus Müller (Gast)


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

von Magnus Müller (Gast)


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.

von Jörn (Gast)


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

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.