TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: PICYO en 17 de Julio de 2011, 14:23:30

Título: reproducir wav desde PIC
Publicado por: PICYO 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 ????
Título: Re: reproducir wav desde PIC
Publicado por: PalitroqueZ en 17 de Julio de 2011, 14:28:07
mira un proyecto hecho por suky

http://www.micros-designs.com.ar/reproductor-de-archivos-wav-desde-sd-card-mas-analizador-de-espectro/

Título: Re: reproducir wav desde PIC
Publicado por: PICYO 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.
Título: Re: reproducir wav desde PIC
Publicado por: fabianjsm 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:
Título: Re: reproducir wav desde PIC
Publicado por: PICYO 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
Título: Re: reproducir wav desde PIC
Publicado por: PICYO 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:

(http://imageshack.us/photo/my-images/143/esquemave.jpg/)

Título: Re: reproducir wav desde PIC
Publicado por: NANO1985 en 21 de Julio de 2011, 16:14:31
muuuuuuy bueno y salvaje a la vez!!! mis felicitaciones!  ;-)
Título: Re: reproducir wav desde PIC
Publicado por: PICYO 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!
Título: Re: reproducir wav desde PIC
Publicado por: NANO1985 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
Título: Re: reproducir wav desde PIC
Publicado por: Suky 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
Título: Re: reproducir wav desde PIC
Publicado por: PICYO 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...:)
Título: Re: reproducir wav desde PIC
Publicado por: Suky 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:



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!
Título: Re: reproducir wav desde PIC
Publicado por: sal0m0n 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
Título: Re: reproducir wav desde PIC
Publicado por: Suky 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!
Título: Re: reproducir wav desde PIC
Publicado por: sal0m0n 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!
Título: Re: reproducir wav desde PIC
Publicado por: PICYO en 23 de Julio de 2011, 16:04:15
hola Suky!
He hecho ese resample, y la tabla me ha variado, es decir, en funcion del sample, claro, hay unos datos u otros. Ahora me ha quedado en const rom char datos2[2868]. Si hago el cálculo que tu hiciste, me queda el mismo tiempo, es decir:

2868/8000 =358,5 ms
15807/41000=385,5 ms
que para el caso es el mismo...

Al dcir resample, te refires al archivo wav original ? Con matlab me ha salido esa tabla, pongo el procedimiento, a ver si hay algo mal :
Citar
Primero digo cómo he resampleado
Con matlab:
Uso esta instrucción para cargar el wav original (44100Hz, 8 bits)
[datos,Fs,NBits,Opts]=wavread('E:\Proyectos_carpeta_seguridad\PIC\PWM en C18\bocina3.wav')
La instrucción directa para resamplear es esta:
datos =resample(datos,p,q)
donde “datos ” es el resultado del resample( se sobreescribe), datos el archivo del array ( aún no es un array en C propiamente dicho) , y p y q son dos parámetros del resampleo, p/q veces el sampleo original.
Como no sabemos qué números son esos, hay que usar una instrucción previa:
[p,q]=rat(8000/Fs,0.0001), donde  Fs es la frecuencia de sampleo original, del archivo bocina3 (44100Hz), 8000 es el resultado del sampleo que queremos, y el vector [p,q] como resultado para poner en la instrucción anterior.
datos=resample(datos,39,215)
Ahora queda adecuar esos datos, para ponerlos en una tabla y “migrarlos” a C, del modo siguiente:
datos = datos *127
datos = datos +127
datos = fix(datos)
csvwrite('E:\Proyectos_carpeta_seguridad\PIC\PWM en C18\datos.csv',datos);
Con Excel
Ahora  abrimos  el ficherocreado “ datos.csv “
Aparece una columna con el array de datos, en forma de columna. En opción “buscar y reemplazar”, en la casilla “buscar” la dejamos en blanco ( busca los espacios) y en reemplazar añadimos una coma “,”. Seleccionamos la columna ( entera) de la derecha de la columna de datos, y hacemos el cambio ( damos aceptar a buscar y reemplazar).
Con Notepad.
Ahora abrimos un archivo txt , previa copia de esas dos columnas de Excel, y cambiamos un poco para adecuarlo a C, es decir, poner al principio  const  char nombre[número de columnas de la columna en Excel] ={los números mas la coma añadida}. Ese archivo lo guardamos con extensión “.h” y ya tenemos el archivo de sonido resampleado a 8000 Hz y en forma de array de chars, para leerlo en C.
todo esto veo que es antes de iniciar nada con el PWM, que por cierto, n entiendo bien lo de combertir los 10 bits a 8bits, me suena una funcion en C estilo "(int)dato(byte)" de conversión, ??
Título: Re: reproducir wav desde PIC
Publicado por: Suky en 23 de Julio de 2011, 18:09:40
Hablo de la conversión sobre el archivo original. La idea es un audio de ~1.5 s muestrearlo a 8k. Sino no tiene sentido  ;-)

Respeto a la conversión, es bastante sencillo, si el dato de audio es de 8-bits entonces tenes que 0V son 0x00, y 5.0V es 0xFF. Ahora si tengo PWM de 10-bits, tengo que multiplicar por un k para que 0x00 sean 0V y 0x3FF sean 5.0V.

Si el PWM me diera de 10-bits, yo haría:

CicloTrabajoPWM=((unsigned int)DatoAudio<<2);   ;-)


Saludos!
Título: Re: reproducir wav desde PIC
Publicado por: PICYO en 24 de Julio de 2011, 08:35:17
esto se complica, la verdqad, no lo veo sencillo.
Dcies que use la velocidad a 48 MHz, y asi me olvido de temas del oscillador ( habilite el PLL). Cuando hago la simulacion por Proteus, siempre he de poner la velocidad en KHz, pero bueno, digo, deberé tocar el periodo de algun modo.
Pues bien, cambio la velocidad de programa a 48MHz, y ahora calculo el Periodo . Bueno. mas que el periodo el PR2 :
Código: C
  1. PWM Period = [(PR2) + 1]4 • TOSC •(TMR2 Prescale Value)
  2. Tal como dices  la frecuencia a 8KHz ( que ya no se llegar a esa conclusión yo solo)
  3. 8KHz=(PR2+1)*4*2083x10^-9        ( este ultimo tiempo es la inversa de la fecuencia de programa, que son 48MHz)
  4. PR2=960153623 o lo que es mi msimo, PR2=0x393AC817
vamos, ya no he seguido... ¿ por que no debería bajar la velocidad de programa? Si no lo hago, veo imposible llegar a esa frecuencia del PWM

Antes de cambiar la velocidad de programa ( me corria entonces a 1 Mhz, pero en Proteus no me funciona nada por menos de 7KHz) si que he hecho algo que me has dicho, pero no exactamente como decias:
Código: C
  1. for (i=0;i<2868;i++) {SetDCPWM2( datos2[i]<<2 );}
me ha sonado algo mejor, aunque nada bueno tampoco. ese desplazamiento de bits (<<2) no hace que pierda información ?
Bueno cada vez me entero de menos..ya empieza a haber demasiada información y pocos resultados
Título: Re: reproducir wav desde PIC
Publicado por: Suky en 24 de Julio de 2011, 10:30:53
Por lo que veo no tienes mucha practica usando microcontroladores, por ahi te conviene hacer proyectos mas sencillos para aprender a trabajar con los distintos modulos... en el calculo te falto el preescaler...
Despues, no es cuestion de colocarlo en un for, hay que respetar los tiempos de reproduccion...
Título: Re: reproducir wav desde PIC
Publicado por: PICYO en 24 de Julio de 2011, 12:10:27
claro, me falta la práctica por eso no me queda mas opcion que preguntar lo que no se. de todos modos, no entiendo como hicieron este proyecto otras personas con ese mismo for, y les funcionó. Es el mismo for que llevo arrastrando durante todo el post. Lo uncio que hecho hasta ahora es rectificar las cosas según aparecen aqui,
Título: Re: reproducir wav desde PIC
Publicado por: omix en 24 de Julio de 2011, 14:54:13
Hola,
 yo hice hace un tiempo una prueba basandome en ese mismo proyecto y tal como esta en la web no funciona correctamente, puesto que si los datos estan muestreados a 8Khz se deben de pasar al pwm a esa misma frecuencia o de lo contrario sonara mal y la frecuencia del PWM debe de ser al menos el doble de la maxima frecuencia que desees escuchar (teorema del muestreo).

El bucle for deberia de quedar algo parecido a esto:

Código: C
  1. //ejemplo para sonido muestreado a 8Khz
  2. for (i = 0; i <length; i++) {
  3.     SetPWMDuty(datos[i]);   //establece el duty cicle del pwm
  4.     delay_us(125);              //delay para sacar un dato cada 8KHz
  5. }

Saludos.
Título: Re: reproducir wav desde PIC
Publicado por: Suky en 24 de Julio de 2011, 15:19:14
Cita de: omix link=topic=35508.msg296104#msg296104
y la frecuencia del PWM debe de ser al menos el doble de la maxima frecuencia que desees escuchar (teorema del muestreo).


La frecuencia del pwm no tiene nada ver con el teorema de muestreo, la minima debe ser igual a la de muestreo asi al cambiar el ciclo de trabajo se hace de forma correcta, o puede ser k veces, con k entero  ;-) es otro el concepto a aplicar
Título: Re: reproducir wav desde PIC
Publicado por: sal0m0n en 25 de Julio de 2011, 16:59:38
Buenas tardes amigos, ya resolví los problemas que tenia con mi DAC del dsPIC33FJ128GP802, ahora puedo reproducir música casi sin problemas, lo único es que a pesar de realizar los cálculos correctamente una y otra vez es evidente que la reproducción esta un poco mas lenta de lo normal....


como estoy reproduciendo el audio a 44.1kHz, el reloj del DAC debe ser 44100Hz * 256 = 11,289MHz, entonces, con una frecuencia FVCO de 160 MHz, en APSTSCLR debo colocar 2, para que lo divida entre 2, 160Mhz/2 = 80Mhz y luego, en el DACFDIV debo volver a dividir esa frecuencia (de 80mhz) a la que me sirva para obtener los 11,289Mhz del reloj del DAC, así que coloco en DACFDIV 6, para que divida los 80 Mhz entre 7, (DACFDIV=6  -> 80Mhz/7 = 11,428Mhz ), que supera por 139Hz la frecuencia del clock dek DAC requerida para 44,1kHz, asi que debería sonar algo mas rapido, pero en vez de eso, suena un poco mas lento!!, y se supone que a esa frecuencia del clock (11,428Mhz) del DAC, la reproduccion debería ir a 44,642Khz, ~540hz de mas de la frecuencia del audio original... entonces no entiendo por que en vez de sonar mas rapido, suena un poquito mas lento!!

se me ha ocurrido usar el oscilador FRC de este micro, para poder "tunearlo" a la frecuencia de trabajo ideal, o quizas un metodo para "resamplear" la frecuencia del audio a un valor personalizado... P.E. 44,8kHz o 43,9kHz pero no se de algun software que permita esos valores "no estandar"...



saludos.
Título: Re: reproducir wav desde PIC
Publicado por: PICYO en 31 de Julio de 2011, 18:55:56
hola omix, he probado ese delay, y no me funciona ( en ccs) tal como a ti, de hecho sigue igual.. Salomon, has probado con matlab ? si solo quieres hacer una conversion de frecuencia de sampleo, es matar moscas a cañonazos ( sirve para..casi todo, todo el mundo lo usa..pero nadie lo entiende :D), pero si te lo instalas, seguro que le darás mas usos postteriormente. En una de mis preguntas, pongo los pasos que hize para resamplear, prueba eso a ver si te va bien.

Seguire en unos dias el proyecto desde C18, a ver si consigo que suene. por cierto, salomon, podrías colgar tu proyecto ?
Título: Re: reproducir wav desde PIC
Publicado por: Suky en 31 de Julio de 2011, 20:10:54
Buenas! Toma como ejemplo el siguiente proyecto hecho en un 18F4620. El archivo está muestreado a 8kHz:

Código: C
  1. #include <p18f4620.h>
  2.  
  3. /** CONFIGURATION **************************************************/
  4. #pragma config OSC=HSPLL
  5. #pragma config IESO=OFF
  6. #pragma config PWRT=ON
  7. #pragma config WDT=OFF
  8. #pragma config MCLRE=ON
  9. #pragma config XINST=OFF
  10. #pragma config DEBUG=OFF
  11. #pragma config FCMEN = OFF
  12. #pragma config LVP=OFF
  13. #pragma config BOREN=OFF
  14. #pragma config PBADEN = OFF
  15. #pragma config CCP2MX = PORTC
  16. /** END CONFIGURATION **************************************************/
  17. #include <pwm.h>
  18. #include <timers.h>
  19. #include "WavFile.c"
  20. extern rom const unsigned char Buffer[8395];
  21. /*-----------------------------------------------------------*/
  22. void main( void ){
  23.         unsigned int k=0;
  24.  
  25.         // Fijo F PWM a ~32kHz  Fosc = 40 MHz -> 10Mhz x 4 PLL
  26.         OpenTimer2(TIMER_INT_OFF & T2_PS_1_4 & T2_POST_1_1);
  27.         OpenPWM1(77);
  28.         OpenPWM2(77);
  29.         // Para 32kHz, resolución 8.3 bits
  30.         // Seteo un valor medio.. (~)
  31.         SetDCPWM1(0x80);
  32.         SetDCPWM2(0x80);
  33.         while(1){
  34.                 // Borro flag. Los datos del archivo wav están muestreado a 8kHz y como F PWM es 32kHz..
  35.                 // ..para reproducir a mismo tiempo debo esperar que ocurran 4 overflow de Timer2:
  36.                 PIR1bits.TMR2IF=0;
  37.                 for(k=0;k<8395;k++){
  38.                         // Cargo dato de archivo en ambos canales:
  39.                         SetDCPWM1(Buffer[k]);
  40.                         SetDCPWM2(Buffer[k]);
  41.                         while(PIR1bits.TMR2IF==0);
  42.                         PIR1bits.TMR2IF=0;
  43.                         while(PIR1bits.TMR2IF==0);
  44.                         PIR1bits.TMR2IF=0;
  45.                         while(PIR1bits.TMR2IF==0);
  46.                         PIR1bits.TMR2IF=0;
  47.                         while(PIR1bits.TMR2IF==0);
  48.                         PIR1bits.TMR2IF=0;
  49.                 }
  50.         }
  51. }

Adjunto WavFile.c.


Saludos!
Título: Re: reproducir wav desde PIC
Publicado por: PICYO en 01 de Agosto de 2011, 10:55:58
Hola Suky! Estoy realizando un proyecto aparte, con este material que me has dado, para ver directamente su funcionamiento, pero no me compila C18. Estoy compilando individualmnente cada fichero, pero al final me sale lo siguiente :

Error - symbol 'Buffer' has multiple definitions.

he cambiado el nombre a la variable, creyendo que habria conflicto con alguna variable en el proyecto, y la rebautizado como MiBuffer, y el error es el mismo.
el linker no consigo que me compile ( si lo compilo individualmente)  pero lo mismo me pasa  con todos los proyectos y al final el programa me corre.
Título: Re: reproducir wav desde PIC
Publicado por: Suky en 01 de Agosto de 2011, 13:02:23
WavFile.c no se debe incluir en el proyecto.


Saludos!
Título: Re: reproducir wav desde PIC
Publicado por: omix en 01 de Agosto de 2011, 13:25:01
Hola PICYO,
te adjunto uno de los proyectos que yo he probado y que funcionan, esta hecho en CCS para el PIC18F452 con un oscilador de 10Mhz. Si todo va bien deberias de escuchar el sonido de una cabra  :D, no intentes simularlo ya que yo no tuve exito tuve que realizar el montaje en una protoboard, puesto que en el proteus no me iba (no se el motivo).

Saludos y ya contarás.
Título: Re: reproducir wav desde PIC
Publicado por: PICYO en 01 de Agosto de 2011, 13:54:49
Hola Suky! Bueno, a no ser que el sonido sea el de una metralleta de un juego de Spectrum... tampoco me va bien :D pero como dice Omix, quizas el fallo resida en el Proteus. En la ventana de avisos se me llena, que no carga ciertos ficheros .asm y la velocidad de simulación no es real..bueno, qu eno va bien. otra cosa Suky, en el que me has mandado, usas las dos salidas del PWM, en vez de una, ¿ has hecho un ejemplo estilo a aquel de CCS que puse yo? Es decir,¿ colocas 2 speackers?

Omix! En cuanto pueda monto un circuito, pero de momento no lo puedo probar, no tengo speacker y componentes y me voy de vacaciones, os dejo aqui "solicos". De momento me lo bajo ! Lo que podrias decir como has montado la salida? si has puesto un filtro, o  como lo has hecho
Título: Re: reproducir wav desde PIC
Publicado por: Suky en 01 de Agosto de 2011, 15:43:26
Hola Suky! Bueno, a no ser que el sonido sea el de una metralleta de un juego de Spectrum... tampoco me va bien :D pero como dice Omix, quizas el fallo resida en el Proteus. En la ventana de avisos se me llena, que no carga ciertos ficheros .asm y la velocidad de simulación no es real..bueno, qu eno va bien. otra cosa Suky, en el que me has mandado, usas las dos salidas del PWM, en vez de una, ¿ has hecho un ejemplo estilo a aquel de CCS que puse yo? Es decir,¿ colocas 2 speackers?

Seguramente en proteus no funcione para nada bien. Yo lo hice de esa manera para usar el siguiente circuito que tenia armado:

(http://www.micros-designs.com.ar/wp-content/uploads/2010/10/EsquemaAudio.png)

del proyecto que anteriormente te mencionaron: http://www.micros-designs.com.ar/reproductor-de-archivos-wav-desde-sd-card-mas-analizador-de-espectro/

Saludos!
Título: Re: reproducir wav desde PIC
Publicado por: omix en 01 de Agosto de 2011, 16:06:08
Omix! En cuanto pueda monto un circuito, pero de momento no lo puedo probar, no tengo speacker y componentes y me voy de vacaciones, os dejo aqui "solicos". De momento me lo bajo ! Lo que podrias decir como has montado la salida? si has puesto un filtro, o  como lo has hecho
Pues el circuito es bastante simple solamente conecte una red RC al pin de PWM (RC2), la resistencia que puse es de unos 470R y el condensador de 100nF y directo ahi conecte un minispeaker puesto que no disponia de un amplificador. Se oye bien, pero muy flojillo, a ver si puedo conseguir un ampli y relizo la prueba definitiva.

Un saludo.
Título: Re: reproducir wav desde PIC
Publicado por: Suky en 01 de Agosto de 2011, 16:08:23
Omix! En cuanto pueda monto un circuito, pero de momento no lo puedo probar, no tengo speacker y componentes y me voy de vacaciones, os dejo aqui "solicos". De momento me lo bajo ! Lo que podrias decir como has montado la salida? si has puesto un filtro, o  como lo has hecho
Pues el circuito es bastante simple solamente conecte una red RC al pin de PWM (RC2), la resistencia que puse es de unos 470R y el condensador de 100nF y directo ahi conecte un minispeaker puesto que no disponia de un amplificador. Se oye bien, pero muy flojillo, a ver si puedo conseguir un ampli y relizo la prueba definitiva.

Un saludo.

Sin filtro pasa-alto?
Título: Re: reproducir wav desde PIC
Publicado por: sal0m0n en 02 de Agosto de 2011, 10:00:02
Lo de mi problema de la lentitud en la reproduccion se debía al delay de la transferencia de los datos desde la memoria a los buffer de audio, esto lo solucioné usando DMA!! (dsPIC33FJ128GP802).

Sin embargo, no logré hacer de modo automático el intercambio de los buffers A y B (modo ping pong) porque cuando se completaban los 512 bytes del BufferA, y entraba en la interrupcion por alguna extraña razón el micro seguía enviando clocks a la SD ocasionando problemas al solicitar mas datos de la SD (El DMA estaba configurado como one shot, asi que suponía que al terminar de recibir la cantidad establecida de bytes, debía parar de enviar clocks a la SD), entonces tuve que deshabilitar el canal DMA dentro de la interrupción para eliminar este comportamiento, trayendo como consecuencia que cada vez que lo iniciaba de nuevo, el micro trataba de llenar el buffer A solamente.... por lo que no pude aprovechar la función ping pong hasta el momento...

Por otra parte se que hay un comando de la SD para que ésta envíe de forma contínua bloques de 512 bytes desde una dirección dada con auto-incremento, hasta recibir el comando STOP (por llamarlo de alguna manera), lo cual probablemente sea un modo de aprovechar mas eficientemente el DMA, pero de momento estoy mas que satisfecho... el sonido aún tiene un pequeño delay pero es imperceptible al oido puesto que no cambia el tono del audio, mas o menos lo calculo entre 30ms de retraso por cada  segundo.

Lo que queda es buscarme un buen opamp, para ver si mejora un poco la reproducción de los bajos, aun le falta algo de calidad al audio por esa parte, no se si las características mas importantes es que sea rail-to-rail y con ancho de banda de 20hz hasta por lo menos 15mhz...


mas adelante les doy mas detalles! cualquier duda puntual que crean que pueda ayudar con mucho gusto les ayudaré.


salu2

Título: Re: reproducir wav desde PIC
Publicado por: omix en 02 de Agosto de 2011, 18:06:43
Omix! En cuanto pueda monto un circuito, pero de momento no lo puedo probar, no tengo speacker y componentes y me voy de vacaciones, os dejo aqui "solicos". De momento me lo bajo ! Lo que podrias decir como has montado la salida? si has puesto un filtro, o  como lo has hecho
Pues el circuito es bastante simple solamente conecte una red RC al pin de PWM (RC2), la resistencia que puse es de unos 470R y el condensador de 100nF y directo ahi conecte un minispeaker puesto que no disponia de un amplificador. Se oye bien, pero muy flojillo, a ver si puedo conseguir un ampli y relizo la prueba definitiva.

Un saludo.

Sin filtro pasa-alto?
Si, solamente el filtro pasa bajo, tal como indica una nota de aplicación de microchip (no recuerdo ahora mismo cual es). Tambien he visto en alguna revista electronica que ni siquiera usan filtro alguno, atacan directamente con el pin del micro el altavoz.

Saludos.
Título: Re: reproducir wav desde PIC
Publicado por: ppyote en 24 de Marzo de 2014, 16:13:09
hace una semana me han pedido un excompañero mio, que ahora mismo esta trabajado de psicologo en el hospital provincial de Castellon, una cosa un tanto especial....
Se trata de un sistema de habla robotica tipo la de stephen hawking.Lo primero que me vino a la cabeza es un circuito que lea una uSD y reproduzca el texto visualizado desde un lcd de 4x16
pues bueno, yo estoy utilizando la libreria del gran Suky, la SDCard_hard.c.... estoy reproduciendo audio a 8khz de sampleo, 8 bits con un 18F2550 a 48Mhz
la frecuencia del PWM esta en 46875hz, y 10 bits de resolucion... he de decir que suena bastante bien y estoy pensando subir el muestreo a 44Khz
mi gran duda, es como reprodicir tan rapido sin que la carga del buffer distorsione el audio
Título: Re: reproducir wav desde PIC
Publicado por: Suky en 24 de Marzo de 2014, 17:15:49
Podes utilizar doble buffer, así mientras se reproduce el audio con uno de ellos cargas el otro.


Saludos!
Título: Re: reproducir wav desde PIC
Publicado por: ppyote en 24 de Marzo de 2014, 18:03:33
Podes utilizar doble buffer, así mientras se reproduce el audio con uno de ellos cargas el otro.


Saludos!

hola Suky, ya había pensado en el doble buffer, pero a 44khz de muestreo creo que me dará problemas
lo que voy a probar es aumentar la velocidad de comunicación spi y probar
también quiero probar un archvo wav estéreo y dos salidas pwm
Título: Re: reproducir wav desde PIC
Publicado por: ppyote en 09 de Abril de 2014, 16:59:59
bueno, aqui un video del pequeño prototipo para adaptar un sistema de habla digital para un tetraplejico, el audio reproducido es wav a 44khz y 8 bits...
de momento, como una voz digital no me anima  :D, estoy probando con musica....
Título: Re: reproducir wav desde PIC
Publicado por: Suky en 09 de Abril de 2014, 21:03:57
Y el vídeo?  :shock:  :mrgreen:
Título: Re: reproducir wav desde PIC
Publicado por: ppyote en 10 de Abril de 2014, 00:43:19
Y el vídeo?  :shock:  :mrgreen:
eso me pregunto yo también, no se el motivo por el cual no lo muestra, imagino que algún moderador podrá arreglar el link de youtube para que se vea en el foro
Título: Re: reproducir wav desde PIC
Publicado por: Suky en 10 de Abril de 2014, 19:38:27
 :( Bueno, pongamos el link:

Y esta por muy buen camino ese proyecto!  ((:-))

Saludos!
Título: Re: reproducir wav desde PIC
Publicado por: ppyote en 11 de Abril de 2014, 04:14:09
Gracias Suky, aunque el 95% del trabajo está basado en tus librerías de la SD y fat16
ahora sólo me falta hacer la búsqueda de los archivos de audio más rápido,por sí se ha modificado el contenido de la tarjeta, cosa que ya casi lo tengo, y mostrar en el lcd el nombre del archivo a reproducir, así cuando guarde frases con voz, sólo con ponerle el título del archivo igual que la frase que tenía el archivo de audio, el pic se encargará de localizarlo, mostrar el texto de la frase y reproducirlo sí es lo deseado
Título: Re: reproducir wav desde PIC
Publicado por: sal0m0n en 19 de Mayo de 2014, 17:59:17


A principios de año le hice un proyecto a un cliente con archivos wav,  ->ACA<- (http://youtu.be/1OeSon7_feA) estaba probando la calidad del sonido.



saludos
Título: Re: reproducir wav desde PIC
Publicado por: ppyote en 19 de Mayo de 2014, 19:12:52
A 44khz de muestreo suenda muy bien.... lo malo es que mis samples son de 8bits de resolucion.... si fuera de 16 ya seria la leche... mas adelante ya me hare con un pic24 y probare si mejora mucho el audio con 16bits de resolucion