Autor Tema: reproducir wav desde PIC  (Leído 28201 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
reproducir wav desde PIC
« en: 17 de Julio de 2011, 14:23:30 »
herramientas:
PIC 18F4550
Matlab
Proteus

Tengo eso, un monton de links que de nada me ha servido hasta ahora...
¿¿ Qué tengo que hacer para  reproducir un sonido wav ????

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re: reproducir wav desde PIC
« Respuesta #1 en: 17 de Julio de 2011, 14:28:07 »
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: reproducir wav desde PIC
« Respuesta #2 en: 17 de Julio de 2011, 16:10:41 »
pero si quiero reproducir el sonido desde una eprom en un formato estilo array ?
es que lo que pretendo es entender que me falta para que funcione el del link siguiente :

http://www.ikein.net/index.php/electronica/circuitos/56-sonidospic

lo tengo pasado a C18 ( pero al no entender bien lo que trata de hacer no está 100x100 traducido), y con el mismo CCS , he montado el circuito y no soy capaz de escuchar nada. Es un sonido muy corto, asi que la memoria interna del PIC no debería ser problema.

El link que me pasas está muy bien, si ( lo he visto antes ya), pero si no entiendo bien que es lo que pretende hacer en el link que yo he lanzado, probablemente será mas complicado entener links mas difíciles.
Respecto el link que he puesto, y que no me funciona a mi... la solución  ha de ser una cosa simple, pero me pierdo en algo que no pillo.

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: reproducir wav desde PIC
« Respuesta #3 en: 18 de Julio de 2011, 08:05:09 »
No estas trabajando con un cristal excesivamente alto que envía todas tus muestras en una fracción de segundo?

http://www.microchip.com/pagehandler/en-us/Microchip-Unveils-Audio-Dev-Board-for-PIC32-MCUs.html
Una jodita :lol:
« Última modificación: 18 de Julio de 2011, 08:08:35 por fabianjm »
@fabianjsm is on twitter

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: reproducir wav desde PIC
« Respuesta #4 en: 18 de Julio de 2011, 14:15:57 »
bueno estoy trabajando un poco a ciegas la verdad, pensando que aquel proyecto ha de ir perfecto. De echo es lo más adecuado que he visto para empezar. He cambiado el cristal ( por valores "raros") en el proteus ( sin poner un circuito de cristal, mas bien en opciones) y he debido bajar a unos 7 KHz o asi para escuchar algo. Ha sido un ruido ( nada de bocinas...) pero que al menos si se oye algo. Ahora probaré con la frecuencia del programa. Por cierto, el que me va es el que yo traducí a C18. Si te fijas ( os fijais) en el de CCS que estaá puesto el link usan el PWM como HALF BRIDGE, pero sólo usan una salida de PWM..no logro entender eso... asi que en mi C18 he usado un PWM normal ( no enhanced), sin doble puente.
Bueno voy a jugar con las frecuencias y a ver que saco de ello!
Por cierto..cada vez que veo circuitillos como este que me has enviado ( en link, claro...:P) se me cae la baba. Peo la gracia es hacerlo uno mismo :)
A ver si un dia de estos me saco una circuitaco asi! :D

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: reproducir wav desde PIC
« Respuesta #5 en: 21 de Julio de 2011, 12:42:25 »
Hola de nuevo!
He añadido algo al código, ya que no tengo seguro que cojiese mi configuración de oscilador. Respecto a la velocidad, si, creo que es muy elevada. En aquel proyecto lo hacian correr demasiado, pero bueno, me gustaría saber quien lo hizo para preguntarle directamente :D
he optado por la velocidad mas baja, con cristal de 4Mhz, tipo XT. Pondré el código ( en C18) y así se ve mas clara mi pregunta y lo que digo.
No se a que velocidad he de adaptar el PWM, es decir, cómo ha de leer y eso. Se que el dato de musica está grabado  o "sampleado" ( en forma de array) a 44100 HZ. Me he puesto a retocar el PWM, pero a conciencia, y me surje la duda ( es que he ido probando e iterando difererentes valores de Duty u de periodo y...puffff).

Qué velocidad debería llevar mi Duty?
la misma velocidad  de la que procede el sonido sampleado  (44100Hz) ?
Si es asi, entonces deberia jugar con el Periodo y el Duty pues.
Como eso es lo que pienso ( pero no estpy nada seguro ...) mi intención en el programa es hacerlo correr a la mínima velocidad ( de programa) que es 1Mhz con el cristal de 4Mhz.
Pongo el código, a ver si creeis que a parte del PWM faltaría algun plus.
Código: C
  1. #include <p18f4550.h>
  2. #include <adc.h>
  3. #include <delays.h>
  4. #include <pwm.h>
  5. #include <timers.h>
  6. #include "sonido.h"
  7.  
  8. //**************************CONFIGURACION*************************
  9. #pragma config CCP2MX = OFF
  10. #pragma config FOSC = XT_XT
  11. #pragma config CPUDIV = OSC4_PLL6  //  divido el cristal de 4MHz/4. NO quiro tocar el PLL
  12.                             // ( no hay mas opción en esta configuracion
  13.  
  14.  
  15. void main(void)
  16. {
  17.    unsigned int i;
  18.   //TRISB=0b00000000;
  19.   TRISA=0b10111111; // el bit MSB no existe en este puerto, se tomaría como 0bX011 1111
  20.   TRISC = 0b00000000;
  21.   TRISBbits.TRISB3 =0;
  22.   PORTA=0;
  23.   PORTB = 0;
  24.   PORTC = 0;
  25.   OpenTimer2( T2_PS_1_1 & T2_POST_1_1);
  26.   OpenPWM2(0x110); // Period - frequency
  27.   //void SetOutputPWM2 ( unsigned char output_config,unsigned char pwm_mode);  
  28.   //SetOutputPWM2 (  SINGLE_OUT,  PWM_MODE_2);
  29.  
  30.  while(1)
  31.  {
  32.    
  33.     //SetDCPWM1(255);
  34.  
  35.         for (i=0;i<15807;i++) {SetDCPWM2(datos[i]);}
  36.         for (i=0;i<15807;i++)  {SetDCPWM2(datos[i]);}
  37.         for (i=0;i<15807;i++)  {SetDCPWM2(datos[i]);}
  38.  
  39.  }
  40.        
  41.  
  42. }

Una parte importante es el DAC ( que para eso es el PWM) y el circuito. Es un filtro pasa bajos, con un añadido de aomplificador no inversor:




Desconectado NANO1985

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
    • Desarrollos Tecnologicos - Tucuman - Argentina
Re: reproducir wav desde PIC
« Respuesta #6 en: 21 de Julio de 2011, 16:14:31 »
muuuuuuy bueno y salvaje a la vez!!! mis felicitaciones!  ;-)
"La inquebrantable voluntad de vencer"
"hay dos cosas infinitas... El universo y la Estupidez humana" Albert Einstein
 "El sabio actua sin anhelos, permanece sosegado,... así no es afectado por el resultado de sus acciones sean éstas el triunfo o el fracaso"
- UNIVERSIDAD TECNOLOGICA NACIONAL - FACULTAD REGIONAL TUCUMAN -

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: reproducir wav desde PIC
« Respuesta #7 en: 21 de Julio de 2011, 17:01:09 »
hola nano...no entiendo muy bien eso de las felicitaciones...porqué no funciona este proyecto, por eso pido ayuda aqui :)
En cuanto funcione algo, te acepto esas felicitaciones ;)
saludos!

Desconectado NANO1985

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
    • Desarrollos Tecnologicos - Tucuman - Argentina
Re: reproducir wav desde PIC
« Respuesta #8 en: 21 de Julio de 2011, 18:08:08 »
hola nano...no entiendo muy bien eso de las felicitaciones...porqué no funciona este proyecto, por eso pido ayuda aqui :)
En cuanto funcione algo, te acepto esas felicitaciones ;)
saludos!

a mi me parece muy bueno que te hayas metido en este proyecto  y que le pongas ganas y actitud,..... en mi caso , siempre me gusto éste proyecto pero no le puse ganas, entonces es una cuestion de actitud nomas, por eso las felicitaciones. voy a seguirte de cerca
"La inquebrantable voluntad de vencer"
"hay dos cosas infinitas... El universo y la Estupidez humana" Albert Einstein
 "El sabio actua sin anhelos, permanece sosegado,... así no es afectado por el resultado de sus acciones sean éstas el triunfo o el fracaso"
- UNIVERSIDAD TECNOLOGICA NACIONAL - FACULTAD REGIONAL TUCUMAN -

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: reproducir wav desde PIC
« Respuesta #9 en: 21 de Julio de 2011, 20:29:36 »
Un par de consultas, que veoocidad de muestreo tienen ls datos a reproducir?  Que cantidad de datos tienes almacenados a reproducir?  Si la velocidad de mustreo es elevada y hay pocos datos no se escucha nada coherente... poco tiene que ver la velocidad del microcontralador, solo tiene que ser adecuada para colocar el valor analogico leido a la salida a la misma velocidad de muestreo, sino se escuchará mas lento...
Luego, la frecuencia del pwm debe ser igual o k veces la frecuencia de sampleo, igual hay que tener presente la resolucion que tendra el pwm para la frecuencia elegida, para cargar el ciclo de trabajo de forma correcta

Saludos
No contesto mensajes privados, las consultas en el foro

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: reproducir wav desde PIC
« Respuesta #10 en: 22 de Julio de 2011, 14:26:17 »
Hola nano! Pues si, casi todo es la actitud..pero no nos olvidemos de la aptitud..y eso me falla :D la verdad es que si, tengo una motivación personal para hacer este proyecto ( y quien no  con el suyo?! ;), ya que mezcla múscia, electrónica y programación, ¡todo en uno!

Hola Suky! He visto un link tuyo, y no se si tuyo a  atyravés de ti...o desde aqui..bueno, resumiendo, me he bajado 3 proyectos en C18 que son para reproduccion de wav y uno de grabación, epro desde tarjetas SD. Claro, se lia mucho el tema con los protocolos de comunicación, y me es imposible ( por el momento) seguir esos proyectos. Así que  voy copn este. Bueno, esas preguntas creo que son la clave d todo, realmente no sabia bien cómo realizarlas y mas las has puesto en bandeja. Pues ahi va:

Citar
velocidad de muestreo tienen ls datos a reproducir?   

Bueno, es un archivo muestreado a 44100hz, 16 bits y mono. Con Matlab se pasa a 8 bits y se quitan el signo negativo. 
Citar
Que cantidad de datos tienes almacenados a reproducir?
Bueno el array consta de 15807 bytes, bueno esta es la expresion del array:
Código: C
  1. const rom char datos[15807]={127        ,
  2. 127........................hasta el total......127      };


Citar
frecuencia del pwm debe ser igual o k veces la frecuencia de sampleo, igual hay que tener presente la resolucion que tendra el pwm para la frecuencia elegida, para cargar el ciclo de trabajo de forma correcta
la resolucion del pwm, si mal no recuerdo, es de 10 bits, ya que uso el pwm del PIC18F4550 ( creo que usa 2 bytes, pero no enteros). Respecto a la velocifad de muestreo, se que según el Teorema de Nyquist, ha de ser como mínimo 5 veces más rápida, pero por aqui ( por internet me refiero) he leído 10. Asi que esa "x" veces...no se cual es la adiente. he probado hacer todo esto a base de pruebas e iteraciones..pero son demasiadas..es mas fácil ganar con la loteria...:)

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: reproducir wav desde PIC
« Respuesta #11 en: 22 de Julio de 2011, 15:13:01 »
Si las 15807 muestras corresponden a un muestreo de 44100Hz, quiere decir que tienes ~360ms de sonido almacenado, que me parece realmente poco. Por ahí lo ideal para este tipo de proyecto es disminuir la frecuencia de muestreo de estas muestras, 8000Hz puede ser adecuado y tendrías cerca de 1.6s de sonido. Hay programitas que permiten hacer esa conversión a nivel de archivo wav, y seguramente MATLAB también lo permite, habría que estudiarlo.

Teniendo ...datos[15807]... a una velocidad de muestreo a 8000Hz, hay que establecer la frecuencia del PWM, que puede ser 8kHz, 16kHz, etc... La resolución en bits depende de la frecuencia del PWM y de la frecuencia del oscilador, en el datasheet hay una ecuación como para calcularla. Esto es importante, porque de los 8-bits de la muestra almacenada del sonido hay que transformalos a 10-bits o lo que sea que resulte el PWM.

Para la reproducción hay que:

  • Leer el byte del muestreo,
  • adecuarlo a la resolución de la señal PWM resultante (Para que el ciclo de trabajo sea ~ 0% a 100% ),
  • actualizar el ciclo de trabajo de la señal PWM,
  • esperar un tiempo para cumplir los 1/8000 Hz, periodo con el cual se ha muestreado el audio.


Esto ultimo yo lo haría fijando la frecuencia del PWM en ~8kHz, y utilizando la interrupción del Timer2 para realizar la actualización del ciclo de trabajo. Y guarda con esto, porque utilizar un cristal de 4 MHz sin PLL puede ser poco, yo lo aprovecharía y habiltaría el PLL para trabajar a 48MHz y olvidarme de eso.

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado sal0m0n

  • PIC12
  • **
  • Mensajes: 54
    • Sobre Mí
Re: reproducir wav desde PIC
« Respuesta #12 en: 22 de Julio de 2011, 15:59:19 »
No se si abrir otro hilo o comentar aca, yo estoy en un proyecto similar con un dsPIC33F con modulo DAC incorporado (dsPIC33FJ128GP802), hace unos días pedí ayuda con el SPI (que utilizo para leer la memoria SD), pero ya esta parte esta solucionada, leo los datos desde la SD sin problemas...

En cuanto al sonido es de 16bits @44100hz, uso solo el canal derecho, pero el sonido tiene demasiado ruido (white noise), no se si es por el opamp que estoy usando ya que como no encontré el MCP6022 del datasheet del DAC, agarre el primero que me consegui :P (un LM311), cuya salida de momento conecto a unas cornetas de PC que tienen su propio amplificador, para despues de eliminar el ruido usar un lm386 o algo similar.


ademas de otros detalles con los buffers que debo solucionar me preocupa lo ruidoso del modulo DAC, y en mi caso me gustaría saber que es mas efectivo, usar PWM o el DAC interno del PIC?


salu2
Mis herramientas!
PicKit 3, MPLAB REAL ICE, OWON SDS6062, Zeroplus LAP-C 16128, Weller WES51, Probotix Fireball Meteor,  Altium Designer y otras mas!

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: reproducir wav desde PIC
« Respuesta #13 en: 22 de Julio de 2011, 17:57:13 »
Por mi experiencia el ruido viene de 2 cosas, mala implementación de la lectura del archivo y traducción al valor analógico. A mi me pasaba en archivos de audio estéreo de 16-bits, al utilizar 2 buffer tomaba mal los datos al intercambiarlos  :mrgreen: Y después el amplificador, sino es rail-to-rail vas a tener saturación.

Respecto a que es más efectivo, mmm.. creo que depende de la resolución, sin duda un DAC de 16-bits es mejor que un PWM de 10-bits. Yo lo implementé con PWM y se escuchaba muy bien.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado sal0m0n

  • PIC12
  • **
  • Mensajes: 54
    • Sobre Mí
Re: reproducir wav desde PIC
« Respuesta #14 en: 22 de Julio de 2011, 21:46:31 »
efectivamente Suky, el problema estaba en los datos que metia en el buffer DAC1RDAT, se embasuraba de vez en cuando el nibble alto (h) de la palabra de 16bits que generaba a partir de la concatenación de dos bytes y me ocasionaba el ruido, una vez mas contar con un depurador es imprescindible al trabajar con estos Micros!



El lunes les hago otra consulta, primero tratare de solucionar por mi cuenta, pero hay un comportamiento muy extraño en el audio, es como si el "CD" (de música) estuviera rayado!! (leo desde una SD, y el flujo de datos se ve normal), creo que al entrar y salir de las interrupciones me restaura el contenido de los buffers (de audio) a su valor previo a la interrupción! y eso hace que el sonido sea como comenté..


luego les comento, saludos y muchas gracias!
Mis herramientas!
PicKit 3, MPLAB REAL ICE, OWON SDS6062, Zeroplus LAP-C 16128, Weller WES51, Probotix Fireball Meteor,  Altium Designer y otras mas!


 

anything