Problème de lecture de fichier .wav avec ADC et µC
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

Problème de lecture de fichier .wav avec ADC et µC



  1. #1
    fdamien12

    Problème de lecture de fichier .wav avec ADC et µC


    ------

    Bonjour,
    J'ai besoin de jouer du son grâce à un microcontrôleur.
    J'ai encodé des fichiers .wav en PCM, échantillonné à 22050Hz, codé sur 8 bits non signés, mono.
    Je fais mes tests dans un premier temps sur un Arduino Duemilanove (pour la facilité de programmation), mais une fois que tout fonctionnera le programme sera embarqué sur un PIC18F4550.

    Le DAC que j'utilise est un TLC7226 : http://www.ti.com/lit/ds/symlink/tlc7226.pdf
    Le HP est pour l'instant un écouteur haute impédance.

    Je lis sans problème le fichier depuis la SD card, lorsque j'envoie les données sur le port série je vois bien les valeurs hexa défiler, autour de la valeur moyenne 0x80. Par contre le son en sortie n'est que des grésillements, avec éventuellement des petit "clac" parfois, mais la musique n'est absolument pas reconnaissable.

    Inversement, si j'envoie un signal carré au DAC je l'entends parfaitement, et les mesures de tension au multimètre sont bonnes.

    Voilà mon code :
    Code:
    #include <SD.h>
    
    /*
      Connexion SD Card :
       ** MOSI (Violet) - pin 11
       ** MISO (Violet) - pin 12
       ** CLK (Gris) - pin 13
       ** SS (Blanc) - pin 10	 
    */
    
    File fichier;
    byte octet;
    int i;
    
    int pin_Enable = 8;
    
    void Ecrire_DAC(byte valeur)
    {
        int i;
        
        PORTD = valeur;
        
        digitalWrite(pin_Enable, LOW);
        delayMicroseconds(1);
        digitalWrite(pin_Enable, HIGH);
        
        //Serial.print("Ecriture de ");
        //Serial.println(val, HEX);
    }
    
    
    void setup()
    {
        int i;
        
        // Configuration du port série
        //Serial.begin(115200);
        
        
        // RàZ du DAC
        Ecrire_DAC(0);
        
        // Initialisation de la carte SD
        pinMode(10, OUTPUT);
        if(SD.begin(10))
            Serial.println("Initialisation de la carte SD reussie.");
        else
            Serial.println("Echec de l'initialisation de la carte SD.");
        
        fichier = SD.open("22khz8b.wav");
        if(fichier)
            Serial.println("Ouverture du fichier reussie.");
        else
        {
            Serial.println("Echec de l'ouverture du fichier.");
            return;
        }
        
        fichier.seek(3000); // On se place après les en-têtes (peut importe où).
        
    }
    
    
    void loop()
    {
        Ecrire_DAC(fichier.read());
        
        delayMicroseconds(65); // Attente pour avoir environ 22kHz au final
        
        // Envoi d'un signal carré (debug)
        /*delayMicroseconds(500);
        Ecrire_DAC(0);
        delayMicroseconds(500);
        Ecrire_DAC(255);*/
      
    }
    Même si l'attente de 65µs est très approximative, je devrais au moins entendre le son accéléré ou ralenti.

    Une idée ?
    Merci d'avance.

    Le fichier est bien codé en 8 bits mono (en faisant le produit durée en s * 22050 j'obtiens bien la taille du fichier)

    -----
    Images attachées Images attachées  
    Dernière modification par fdamien12 ; 26/10/2011 à 17h55.

  2. #2
    RISC

    Re : Problème de lecture de fichier .wav avec ADC et µC

    Salut,

    Ton échantillonnage doit être fait proprement...
    La seule façon c'est d'utiliser les interruptions.

    Il existe des exemples sur internet et des notes d'applications pour écouter des fichiers WAV :
    * http://www.microchip.com/stellent/id...param=en535144
    * http://projectproto.blogspot.com/201...io-player.html
    * http://www.aix-mrs.iufm.fr/formation...ge/accueil.htm (voir le projet "faire parler un PIC18")


    a+

  3. #3
    ftorama

    Re : Problème de lecture de fichier .wav avec ADC et µC

    Tu as passé ton pin_Enable à l'oscillo pour vérifier la fréquence réelle de reproduction?

    Entre les digitalWrite et la lecture du fichier, il doit se passer un temps monstrueux entre deux échantillons.

    A mon avis, il faut bufferiser la lecture de la carte (lire un bloc de données, et recharger pendant le temps libre) et remplacer les digitalWrite par des accès directs aux ports. Tu vas gagner des centaines et des centaines de temps de cycle.

    Je crois me rappeler qu'un digitalWrite prend une centaine de temps de cycle (vérification de configs de broche et autres sécurités oblige). ça se réduit à un PORTA=(1<<3) (au hasard) qui se retrouve à 1 instruction asssembleur avec un compilateur configuré correctement (sbi PORTA,3).

    D'ailleurs, seuls les premiers ports (nombre exact à vérifier sur la datasheet) acceptent l'instruction sbi. Pour les autres il faut 3 instructions (un IN pour copier le PORT dans un registre de travail, le sbi ou le cbi sur le registre, puis l'écriture du port sur le PORT). 1 ou 3 instructions, ça ne fait pas une grosse différence sur un AVR, mais autant viser le plus rapide pour avoir moins d'incertitude sur les timings
    Quand un homme a faim, mieux vaut lui aprendre à pecher que de lui donner un poisson.

  4. #4
    fdamien12

    Re : Problème de lecture de fichier .wav avec ADC et µC

    Merci pour vos deux réponses.

    Naïvement, j'avais pensé que même avec un échantillonnage approximatif, j'arriverais quand même à reconnaître le son, même s'il était saccadé ou à la mauvaise vitesse.

    Je vais donc remplacer le digitalWrite() par un accès direct au port pour pin_Enable, gérer l'échantillonnage pas des interruptions et utiliser deux buffers (pendant que le premier contiendra les données à envoyer à l'ADC, l'autre sera en train de se remplir grâce à la carte).

    Merci de votre aide, je vous tiens au courant.

  5. A voir en vidéo sur Futura

Discussions similaires

  1. Lire un fichier .BIN avec Matlab converti d'un fichier .WAV
    Par invite45d1502e dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 03/05/2008, 16h13
  2. probleme avec vista -> lecture du son avec fichier .mpg
    Par invite7f1547ae dans le forum Logiciel - Software - Open Source
    Réponses: 7
    Dernier message: 23/01/2008, 22h28
  3. Fichier WAV avec simulink(matlab)
    Par invite531c33a8 dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 12/05/2006, 08h09
  4. probléme de lecture de fichier wav
    Par boardingman dans le forum Logiciel - Software - Open Source
    Réponses: 6
    Dernier message: 19/03/2005, 19h30
  5. Lecture d un fichier avec matlab
    Par invitee5e6851e dans le forum Logiciel - Software - Open Source
    Réponses: 6
    Dernier message: 05/07/2004, 15h03
Découvrez nos comparatifs produits sur l'informatique et les technologies.