# Audio y ADC del PIC



## Edwar09 (Abr 24, 2014)

Buen dia, me gustaria saber como se puede hacer para leer audio con el adc del pic
Lo que quiero hacer es esto

AUDIO - ADC(del pic) -  PIC(programacion) -DAC - AUDIO

Si eso usar el adcdel pic y sacar el audio con el dac y meterlo a un amplificador
Pero no se como acoplar el audio al adc para que no se dañe,¿con un capacitor basta no?
bueno pienso usar como audio la salida de mi telfono celular.Se acepta toda la ayuda haha


----------



## Daniel Meza (Abr 24, 2014)

¿De que PIC hablamos?, en cuanto a la interfaz sólo es necesario acoplar la entrada de tal manera que las fluctuaciones de la señal de audio queden comprendidas entre 0 y Vcc del PIC. Antes de eso creo que la dificultad sería la velocidad de muestreo que creo los PIC's normales no llegan a alcanzar.
¿que dices de un dsPIC?


----------



## Edwar09 (Abr 24, 2014)

Bueno el ADC de mi micro muestrea a 1000 Khz (ATmega328)
Si tenia entendido que se debe hacer un offset para que se adapte al voltaje que maneja el micro y evitar los valores negativos pero no se nada de audio haha
como que amplitud maxima de entrada o esas cosas


----------



## Daniel Meza (Abr 24, 2014)

Las señales de audio andan entre los 200 y 350mV (según algunas medidas que hice), lo que a mi me ha servido es poner a la entrada del micro un divisor de tensión con dos resistores iguales de forma que el voltaje de offset quedara en 2.5V. Luego sobre ese nodo monté la alterna con un capacitor de 10uF y funcionaba, pero aclaro que yo sólo procesaba la señal y no la volvía a reproducir por lo que no se que tanta distorsión genere la conexión que hice. Prueba


----------



## Dr. Zoidberg (Abr 24, 2014)

Edwar09 dijo:


> Bueno *el ADC de mi micro muestrea a 1000 Khz *(ATmega328)


*1000 Hz o 1000 kHz?*   
http://es.wikipedia.org/wiki/Frecuencia_de_muestreo#Frecuencias_de_muestreo_para_audio_y_v.C3.ADdeo


----------



## TRILO-BYTE (Abr 24, 2014)

yo hise ese proyecto para alguien que me lo encargo para pasar una materia 

usando 2 pic 18f2550 y el 18f4550 "los use por que los tenia a la mano no significa que asi debe ser"
usando el teorema de Nyquist dice que frecuencia de muestreo = 2Fmax
es decir si yo quiero muestrear 4khz "una frecuencia de audio aceptable".
debo muestrear minimo a 8khz .

ahora este proyecto lo use metiendo la señal de audio directo al ADC "no hay riesgo de quemar el micro" pues el audio standard es de 1Vpp un micro lee maximo 0 a 5v 

si el audio es muy bajo puedes multiplicar por 10 o por 100 tu lectura para evitar usar un amplificador si se te complica, o usar un preamplificador a transistor.

el DAC lo puedes hacer por PWM o con el tumbaburros DACR2R 
eso si, si vas a usar el DACR2R no vale la pena leer un ADC de 10 bits pues un puerto es de 8 bits
si haces por PWM pues tu ancho del pulso variara con 1024 eso es muy logico.

es posible, dificil al principio pero no tan imposible


----------



## Daniel Meza (Abr 24, 2014)

TRILO-BYTE dijo:


> yo hise ese proyecto para alguien que me lo encargo para pasar una materia
> 
> usando 2 pic 18f2550 y el 18f4550 "los use por que los tenia a la mano no significa que asi debe ser"
> usando el teorema de Nyquist dice que frecuencia de muestreo = 2Fmax
> ...



¿3 PIC's?, ¿que proyecto era?, y ¿el sonido muestreado era reproducido nuevamente?


----------



## papirrin (Abr 24, 2014)

y que opinan de alimentar el micro con una tension que comprenda de -2.5v en gnd y 2.5v en VDD, no debe haber ningun problema. no se en micros de atmel, pero en pic un 18f2550 puede llegar segun recuerdo a veintitantos Khertz.

seria un interesante proyecto, lastima que todavia no domino ASM, quizas en un futuro XD


----------



## Daniel Meza (Abr 24, 2014)

papirrin dijo:


> y que opinan de alimentar el micro con una tension que comprenda de -2.5v en gnd y 2.5v en VDD, no debe haber ningun problema. no se en micros de atmel, pero en pic un 18f2550 puede llegar segun recuerdo a veintitantos Khertz.
> 
> seria un interesante proyecto, lastima que todavia no domino ASM, quizas en un futuro XD



Se lograría el mismo efecto del divisor resistivo. Además sería más inconvenientes por las interfaces y demás, pero experimentar no cuesta


----------



## papirrin (Abr 24, 2014)

> Además sería más inconvenientes por las interfaces



a que interfaces te refieres?


----------



## Daniel Meza (Abr 24, 2014)

Pues si es que el amigo EDWAR quiera usar un DAC. Sobre todo por eso de las referencias de voltajes. Pero viéndolo bien, si todo el sistema funcionara con +-2.5V no creo haya inconveniente.
Esperemos a que diga que le convence


----------



## Edwar09 (Abr 24, 2014)

Bueno lei bien y dice que el clock del ADC es 1000.000 Khz 

Si exactamente eso me habian dicho Daniel Meza del divisor y el capacitor probare aver que tanta distorsion hay como comentas

TRYLO-BYTE  osea que puedo meter la señal directamente sin hacer offset???
Y si trabajare a 8 bits.

Tambien probare eso de +-2.5v para alimentar el pic


----------



## cosmefulanito04 (Abr 24, 2014)

No, tenés que meter el offset de 2,5v, que lo podés hacer como dice *Daniel*, usas un divisor con los valores adecuados y acoplás la señal con un capacitor.

Similar a esta entrada:







Antes de la base (como si el transistor fuera el ADC), pero R1 y R2 serán iguales; el valor del capacitor dependerá del paralelo R1//R2.

Sobre la frecuencia de muestreo, fijate que tan veloz es el uC para luego rearmar la señal, nyquist se aplica tanto para el ADC como para el DAC.


----------



## papirrin (Abr 24, 2014)

Daniel Meza dijo:


> Pues si es que el amigo EDWAR quiera usar un DAC. Sobre todo por eso de las referencias de voltajes. Pero viéndolo bien, si todo el sistema funcionara con +-2.5V no creo haya inconveniente.
> Esperemos a que diga que le convence



es lo que tenia en mente, incluso podria ser un Amplificador Clase PIC


----------



## TRILO-BYTE (Abr 24, 2014)

jaja no eran 3 pic solo eran 2 uno emitia y otro recivia por UART 
para eso configure el ADC como de 8 bits para que cupiera perfecto en un unsigned Char
los pic no se programan solo en ASM yo programo en C18  tambien en CCS pero hay bugs 

respecto al ofset pues como la señal de audio es tan baja pues si con un capacitor de 100nf basta

y como dice el colega Cosme el amplificador a transistor si funciona perfecto ese viejo proyecto lo hise con el mismo circuito del transistor "viene el el libro del Floyd si lo quieres calcular"

pero como mi cliente era un inepto en electronica no me arriesgue y lo hise multiplicando por 10 el valor que leia del reproctor  asi uno evita electronica pero resta velocidad al micro.

pero a 8Khz el audio se oye bastante bien almenos que tengas un super oido o seas muy exigente .


----------



## Edwar09 (Abr 24, 2014)

OK gracias por sus respuestas, realice la simulación del circuito y
y con una señal senoidal de 100Hz a la entrada con el acoplamiento por divisor y capacitor
el resultado fue satisfactorio pero a frecuencias mas altas, como 1 khz el resultado es muy malo les adjunto las imagenes de mis resultados, tal vez sea por la velocidad de muestreo 
¿Que puedo esperar si le pongo audio en lugar de senoidal con estos resultados?
Sonara aunque sea algo?

Haa y el micro lo que hace es leer el ADC y multiplicar el valor para hacer mas grande o mas chiquita la señal eso lo elijo con dos pulsadores


----------



## Daniel Meza (Abr 24, 2014)

Eso es debido a la frecuencia de muestreo. ¿cómo es tu programa que procesa esa parte?, quizá se pueda optimizar para elevar la velocidad (de preferencia hacerlo en ASM)


----------



## cosmefulanito04 (Abr 24, 2014)

También tené en cuenta que la red de acople funciona como un filtro pasa bajos cuya frecuencia la fija el capacitor y el paralelo de las resistencias.


----------



## Edwar09 (Abr 24, 2014)

Ok, verificare la frecuencia de corte del filtro

y mi programa es en realidad solo una linea


```
PORTB = amplitud*read_adc(0) ;
```
Donde amplitud es una variable del tipo float que aumenta o decrementa mediante dos interrupciones del micro.La cambiare al tipo char .
Y la funcion read_adc trae un delay por defecto de 10 microsegundos que para estabilizar el voltaje.
Seria buena idea en ensamblador pero no conozco nada de eso


----------



## papirrin (Abr 24, 2014)

porque no lo haces por PWM? en lugar de R2R como entendi que lo haces no?


----------



## Edwar09 (Abr 24, 2014)

Ha, es que se trata de hacerlo solo con el DAC  y tratar de obtener el mejor resultado posible.


----------



## Daniel Meza (Abr 25, 2014)

Por cierto ¿usas un dac paralelo o serie?


----------



## chclau (Abr 25, 2014)

Edwar09 dijo:


> Ok, verificare la frecuencia de corte del filtro
> 
> y mi programa es en realidad solo una linea
> 
> ...



Yo probaria no haciendo ninguna operacion matematica en el medio (portB = read_adc(0)) para obtener el maximo de datos posibles a la salida, el procesamiento lo harias despues off-line. O es una aplicacion en tiempo real?


----------



## papirrin (Abr 25, 2014)

Daniel Meza dijo:


> Por cierto ¿usas un dac paralelo o serie?



si coloca el valor en todo el puerto es paralelo, casi puedo apostar que es R2R.

a nivel sofware y por ASM se puede hacer con mas eficiencia con PWM, y tengo entendido que haciendo un "hibrido" (PWM+R2R) se puede tener todavia mejor calidad.

ya hace tiempo habia leido y visto las mejores opciones para hacerlo, pero me detuvo y me sigue deteniendo mi falta de practica en programacion ASM.



@ Trilo-Byte



> yo hise ese proyecto para alguien que me lo encargo para pasar una materia



normalmete a mi no me gusta pedir los trabajos de otros, pero debido al interes que tengo en este tema me atrevo a pedirte si fuera posible que nos compartas el proyecto, a mi en realidad me gustaría saber como se escucha bajo esas condiciones tan "limitadas"


----------



## cosmefulanito04 (Abr 25, 2014)

En mi opinión, yo lo haría en assembler, hay tiempos que en C cuestan manejar ahí, limitás mucho la frecuencia máxima de muestreo.


----------



## Edwar09 (Abr 25, 2014)

Daniel Meza dijo:


> Por cierto ¿usas un dac paralelo o serie?


El DAC es paralelo.



chclau dijo:


> Yo probaria no haciendo ninguna operacion matematica en el medio (portB = read_adc(0)) para obtener el maximo de datos posibles a la salida, el procesamiento lo harias despues off-line. O es una aplicacion en tiempo real?



Si es en tiempo real y esa multiplicacion que hago controla la amplitud de la salida.

Suena interesante eso del hibrido que comentas papirrin. Pero para esta aplicacion no puedo usar PWM esa la condicion.
Lo haria en ASM pero no conosco elleguaje.


----------



## Daniel Meza (Abr 25, 2014)

Bueno, si no se puede por ese camino del ensamblador, ¿que dices de elevar la frecuencia de muestreo investigando si se puede acelerar el reloj del ADC?. El AT328 tiene un preescaler antes de la entrada de reloj al ADC. ¿Que ajustes tienes al configurar el ADC?


----------



## chclau (Abr 25, 2014)

Edwar09 dijo:


> El DAC es paralelo.
> 
> 
> 
> ...



En ese caso en lugar de multiplicacion yo lo limitaria a hacer shift obteniendo multiplicaciones y divisiones por multiplos de dos, mas limitado pero muchisimo mas rapido que una multiplicacion


----------



## cosmefulanito04 (Abr 25, 2014)

El tema es que al meter una señal tan chica (500mVp), está haciendo pelota la resolución del ADC, ya que su rango de entrada solo irá de 2 a 3v.

No cuesta nada hacer la amplificación en forma analógica que es bastante sencilla, se ahorra ese tiempo que menciona *chclau* y aprovechás al máximo el ADC.


----------



## papirrin (Abr 25, 2014)

Definitivamente no es el primer tema que veo de esto y no sera el ultimo, XD...

todos los que he visto mas o menos terminan en : "para que te la complicas compra un amplificador, un microcontrolador no fue diseñado para eso" 

la alternativa es hacerlo como el compañero trilo-byte  sin importar para nada la calidad y no preocuparse de nada mientras parezca que se escucha XD


----------



## cosmefulanito04 (Abr 25, 2014)

Es que en realidad un uC asi a secas como amplificador no se que tan buena idea sea. 

Supongo que el ADC es de 10bits, a 5v son casi 5mV (poco menos), por lo tanto tu rango de entrada será de solo 200 cuentas .

La digitalización la veo útil cuando se:

- Quiere transmitir.
- Quiere procesar en algo mucho más complejo, por ej. algún filtro digital que pueda variar sus frecuencias de corte.


----------



## Dr. Zoidberg (Abr 25, 2014)

Por que no ponemos cuales son los requerimientos reales de la conversión AD, empezando con el ancho de banda de la señal de entrada y siguiendo con algun datasheet del micro que se va a usar????

Tal como dice cosme, *es un desastre* usar la quinta parte de la resolución del ADC para hacer la conversión y luego multiplicar por software (en punto flotante!  ) para creerse que se ahorraron un amplificador analógico y que el resultado obtenido es el real.

Por otra parte, hace falta información del micro+adc, por que están suponiendo que la conversión es secuencial con el resto del procesamiento, pero bien puede ser concurrente y que el ADC soporte dispararse automáticamente a tiempos prediefinidos y guardar los resultados en posiciones de memoria contiguas (eso lo hacía el Intel 80196KB hace más de 20 años), con lo cual solo informa con una interrupción al final de la adquisición... y si no lo hace así, puede escribirse un poco de código para que resulte en el mismo efecto.

De todas formas, sin requerimientos claros esto ya lleva dos hojas de adivinanzas...


----------



## cosmefulanito04 (Abr 25, 2014)

Comparto con lo que dice el *Dr*.

De la lista anterior me faltó el caso más importante, almacenamiento y reproducción .


----------



## analogico (Abr 25, 2014)

que sentido tienen este invento??


----------



## Edwar09 (Abr 25, 2014)

Daniel Meza dijo:


> Bueno, si no se puede por ese camino del ensamblador, ¿que dices de elevar la frecuencia de muestreo investigando si se puede acelerar el reloj del ADC?. El AT328 tiene un preescaler antes de la entrada de reloj al ADC. ¿Que ajustes tienes al configurar el ADC?
> Ver el archivo adjunto 109158



Si mira lo tengo configurado así:

ADCSRA=0xA3;

Ahora veo que el factor de division del reloj es 8.
Lo modificare para que divida por 2 .



chclau dijo:


> En ese caso en lugar de multiplicacion yo lo limitaria a hacer shift obteniendo multiplicaciones y divisiones por multiplos de dos, mas limitado pero muchisimo mas rapido que una multiplicacion



Bien probare tambien esa opcion.



cosmefulanito04 dijo:


> El tema es que al meter una señal tan chica (500mVp), está haciendo pelota la resolución del ADC, ya que su rango de entrada solo irá de 2 a 3v.
> 
> No cuesta nada hacer la amplificación en forma analógica que es bastante sencilla, se ahorra ese tiempo que menciona *chclau* y aprovechás al máximo el ADC.



Entonces haré la amplificación analógica antes de meterlo al ADC para que lo aproveche al máximo.




analogico dijo:


> que sentido tienen este invento??



Solo entra al micro la señal de un mp3 o un celular y sale por un puerto hacia el DAC pero mas grande . No es invento .


----------



## Daniel Meza (Abr 25, 2014)

Siendo así manos a la obra, por mera experimentación pero a menos que proceses la señal digitalmente con el micro no creo viable amplificar con el uC, pero como te digo... experimenta


----------



## Edwar09 (Abr 25, 2014)

Bueno si se nota una leve mejoría cambiando la velocidad del reloj del ADC
y con una señal senoidal a la entrada del ADC de 1 Khz y 5 Vpp.
Pero a 10 Khz no se ve nada bien.
Aqui adjunto las fotos de mis resultados, no habra algun otro registro del ATmega que pudiera modificar haha? O que frecuencia debe de ser nesesaria alcanzar para que se escuche bien.


----------



## Daniel Meza (Abr 25, 2014)

Puedes intentar con otro cristal de mayor frecuencia pero siempre respetando las consideraciónes del fabricante cobre el tiempo de adquisición del ADC (lee en la hoja de datos), por demás, si sólo quieres reproducir voz con esa frecuencia es suficiente


----------

