12 votos

¿Cómo hacer una conversión analógica a digital de un micrófono amplificado limpio?

He hecho un par de preguntas relacionadas con este proyecto en los últimos días, pero parece que no puedo juntarlas todas.

Conecté un micrófono electret en un opamp y le di salida a mi microcontrolador de arduino. El ADC del microcontrolador convierte un rango de 0 a 5 vV a un número de 10 bits (0 a 1023).

Probé con tres chips de amplificación diferentes:

  • LM386 - Me dijeron que este chip no era bueno para este propósito, ya que no es opamp, y no funcionó correctamente como se esperaba.
  • LM358 - funciona
  • UA741 - funciona, amplifica más que el LM358

Seguí este esquema exactamente (excepto porque me metí con los valores de resistencia para obtener una buena ganancia): Utilicé 50k ohm para R5 y 10 ohm para R2. enter image description here

El problema es que la salida de los dos últimos chips no está "limpia". El analogRead() del Arduino siempre lee un valor distinto de cero, incluso cuando no hago ruido en el micro. La lectura reacciona correctamente cuando hago ruido, pero el valor "cero" es distinto de cero. A veces el valor "cero" incluso parpadea, lo que hace que la lectura se pierda todo el tiempo. Esperemos que eso tenga sentido.

¿Puedes ayudarme a resolver esto?

Igual de importante, información extra: Estoy tratando de hacer algo como esto eventualmente.

0 votos

¿Está seguro de que tiene el C2 en su sitio? ¿Cuál es la tensión continua silenciosa después de C2?

0 votos

Sí, tengo el C2 en su lugar. Es de unos 2 voltios. No sé si esto tiene sentido: ¿podría ser que haya alguna corriente atrapada(?) en el bucle entre el pin 2 y el 6, la salida y la entrada inversora?

0 votos

¿Qué tal la tensión continua silenciosa después de C2 con ella desconectada del pin de entrada del Arduino?

17voto

RelaXNow Puntos 1164

Deshazte del condensador de salida. Ese circuito probablemente estaba destinado a producir una señal alrededor de cero, por lo que el condensador está ahí para bloquear el desplazamiento de 1/2 Vdd. Sin embargo, el microcontrolador quiere ver la señal centrada alrededor de 1/2 Vdd, así que simplemente deshazte del condensador.

Los micrófonos necesitan mucha ganancia. Los electretos pueden ser sensibles, pero aún así podrías necesitar una ganancia de voltaje de 1000. La ganancia en su circuito es la relación entre R5 y R2, pero esto sólo funciona dentro de los límites de lo que puede hacer el amplificador óptico.

Los valores que has mencionado te darían una ganancia de 5000. Eso es mucho más de lo que deberías intentar obtener de una sola etapa de opamp. No sólo la tensión de offset se multiplicará por esta ganancia, sino que el amplificador óptico no podrá proporcionarla en toda la gama de frecuencias. Con un ancho de banda de ganancia de 1 MHz, sólo obtendrás esa ganancia algo por debajo de los 200 Hz. Incluso un offset de entrada de 1 mV se convierte en 5 V después de la amplificación por 5000.

R2 es también la impedancia que ve el micrófono después del condensador de entrada. Es necesario que sea algo mayor que la impedancia del micrófono con su pullup y el condensador de entrada a la frecuencia más baja de interés. 10 Ω es demasiado pequeño para eso. 10 kΩ sería un valor mejor.

Prueba con dos etapas con una ganancia de 30 más o menos para empezar y mira a ver dónde te lleva eso. Esa es una ganancia que puede manejar en frecuencias razonables con suficiente espacio libre para que la retroalimentación funcione. También necesitas acoplar capacitivamente las dos etapas para que el voltaje de offset de entrada no se acumule a través de todas las etapas.

Editar: Se ha añadido el circuito

No tuve tiempo de dibujar un circuito anoche cuando escribí la respuesta anterior. Aquí hay un circuito que debería hacerlo:

Esto tiene una ganancia de voltaje de aproximadamente 1000, que debería ser suficiente para un micrófono electret razonable. Puede que sea demasiado, pero es fácil añadir algo de atenuación.

La topología es bastante diferente a la de tu circuito. Lo más importante es que no intenta producir toda la ganancia en una etapa. Cada etapa tiene una ganancia de aproximadamente 31. Esto deja mucho margen de ganancia en la frecuencia máxima de audio de 20 kHz para la retroalimentación, por lo que la ganancia será muy predecible y plana en todo el rango de frecuencia de audio, ya que el MCP6022 tiene un producto típico de ganancia-ancho de banda de 10 MHz. El factor limitante será probablemente el micrófono.

A diferencia de lo que dije antes, las dos etapas no necesitan estar acopladas capacitivamente para evitar que la tensión de offset se acumule junto con la ganancia. Esto se debe a que en este circuito, cada etapa tiene sólo una ganancia de CC de 1, por lo que el offset final es sólo el doble del offset del amplificador óptico. Estos opamps tienen sólo 500 µV de offset, por lo que el offset final es sólo 1 mV debido a los opamps. Habrá más debido al desajuste de R3 y R4. En cualquier caso, la CC de salida estará lo suficientemente cerca de la mitad de la alimentación como para no consumir el rango A/D de forma significativa.

La ganancia de CC de 1 por etapa se consigue acoplando capacitivamente la ruta del divisor de realimentación a tierra. El condensador bloquea la CC, por lo que cada etapa es sólo un seguidor de la unidad para la CC. La ganancia de CA completa se realiza cuando la impedancia del condensador (C3 en la primera etapa) se hace pequeña en comparación con la resistencia del divisor inferior (R7 en la primera etapa). Esto empieza a ocurrir a unos 16 Hz. Un inconveniente de este enfoque es que la constante de tiempo para asentarse es C3 por R7+R5, no sólo R7. Este circuito tardará un par de segundos más o menos en estabilizarse después de ser encendido.

0 votos

Cuando saco el cap de la salida, el arduino ve una entrada de unos 3 voltios. Lo siento, pero ¿podrías explicar a qué te refieres con tensión de offset? Para obtener una ganancia de 1000, siendo R2 de 10k Ohm, necesito 10M ohm para R5? ¿Estás seguro de esto? La ganancia es la relación entre R5 y R2 ¿verdad?

0 votos

@Shubham: Tu circuito trata de multiplicar el voltaje de offset del opamp por 5000, así que no es de extrañar que la salida esté pegada a un carril. Ningún opamp es perfecto. La tensión de offset de entrada es la tensión entre las dos entradas cuando la salida está en el rango medio. En teoría, las dos entradas deben ser iguales. La especificación de la tensión de offset de entrada indica lo lejos que está de este ideal.

0 votos

@Shubham: Necesitarías 10 MOhm para la resistencia de realimentación si intentaras que una etapa produjera toda la ganancia. Como he dicho, es una mala idea.

5voto

Lehane Puntos 6776

Como dices, el valor digital será de 0 a 1023. El centro de este rango no es 0, es 512 (que corresponde a una tensión de alrededor de 2,5). Para el silencio, deberías ver algo alrededor de la mitad del rango como esto. No tiene que ser 512 exactamente, pero debería estar cerca. Esto se llama "desplazamiento de CC". La señal se desplaza hacia arriba y se centra en torno a 2,5 V.

Si estás midiendo 2 V y viendo valores de ADC alrededor de 400, entonces está funcionando básicamente bien.

Las ondas sonoras pasan de la presión negativa a la positiva. Si el punto central fuera 0, y la señal sólo pudiera medirse entre 0 y 1023, los valores de presión negativa (-1023) se cortarían.

Además, siempre fluctuará un poco debido al ruido de fondo del ADC. (Y siempre habrá algo de ruido de audio en la habitación por muy silencioso que sea).

0 votos

Ohhh eso explica el "DC offset" que he visto en otras respuestas. Hay una manera de eliminar el desplazamiento de CC, pero poniendo una tapa en algún lugar?

0 votos

@Shubham: Tú QUIERO un desplazamiento de CC. El proceso ADC no funcionará sin uno. La tapa C2 es lo que asegura que tiene uno. Sin embargo, en este caso probablemente no hay mucha diferencia, porque la salida de U1 ya está compensada. ¿Puedes medir el valor de CC en cada lado de C2?

0 votos

@Shubham: Si te refieres a que quieres que tus mediciones digitales se centren en 0 en lugar de 512, puedes simplemente restar el desplazamiento en tu software, o mejor, implementar un filtro digital de paso alto en el software.

3voto

Jon Ericson Puntos 9703

¿Puedes publicar la hoja de especificaciones de ese micrófono? No hay ninguna razón para necesitar una ganancia de 5000 con un micrófono electret a menos que tengas una unidad desnuda sin FET interno. Si ese es el caso, el preamplificador tiene que ser muy diferente.

Además, el circuito que has utilizado no es muy adecuado para ser utilizado como preamplificador de un micrófono electret.

Yo recomendaría:

enter image description here

R5/R4 ajusta la ganancia y puede ser ajustada sin joder la impedancia de entrada del circuito. R3 puede ser de 2k -> 10k ish. 10k tenderá a mejorar el rendimiento de la distorsión, si lo ajustas demasiado bajo deberías repensar los valores de R1 y R2 para fijar la impedancia de entrada.

También es muy importante que la fuente de alimentación esté adecuadamente desacoplada, ya que cualquier ruido llegará al micrófono.

Como mencionaron las otras respuestas tu punto "cero" será ~512 cuando leas el ADC y fluctuará un poco sin importar lo que hagas.

Si tu objetivo es que las luces parpadeen en respuesta al nivel, no deberías tomar lecturas instantáneas con un arduino de todos modos, ya que dudo que vayas a ser capaz de muestrear lo suficientemente rápido para que responda bien. En lugar de eso, haz una detección de pico o de nivel medio en el dominio analógico y establece el período de promedio proporcionalmente a la velocidad de muestreo.

EDIT: Más sobre cómo hacer esto con un detector de picos

El problema que tendrás aquí es que el arduino tiene una velocidad de muestreo relativamente limitada, creo que tu máximo va a ser de unos 10khz lo que significa que sólo puedes resolver una señal de audio de 5khz como máximo. Eso es con el arduino haciendo muy poco, excepto el funcionamiento del ADC, si usted necesita hacer cualquier trabajo real (y usted hace algunos para obtener el nivel) la velocidad de muestreo será menor.

Recuerde que su toma muestras discretas de la señal sin procesar, sólo porque tengas una onda sinusoidal de rango completo alimentando el ADC no significa que no obtendrás lecturas de 0 del ADC, obtendrás muestras en varios puntos de la onda. Con la música real, la señal resultante será bastante compleja y tendrás muestras por todas partes.

Ahora bien, si lo único que quieres medir es el nivel de la señal de entrada, y no te importa obtener una representación digital de la señal, entonces puedes utilizar un simple detector de picos después de este preamplificador para hacerlo.

Lo que hace esto es convertir la señal de audio en un voltaje que representa su nivel máximo. Cuando midas este voltaje con el ADC tendrás un valor inmediato que representa el nivel de la señal en el momento en que se tomó la lectura. Todavía tendrás un poco de bamboleo ya que el sonido es una forma de onda compleja y siempre variable, pero esto debería ser fácil de tratar en el software.

Un detector de picos sin retención es en realidad un rectificador con un filtro en la salida. En este caso tenemos que tratar con señales de bajo nivel y mantener la precisión, por lo que tenemos que hacer un poco más de lo que se haría para su circuito rectificador promedio. Esta familia de circuitos se llama "rectificadores de precisión".

enter image description here

Hay un billón de maneras diferentes de hacer esto, pero yo iría con este circuito, parece que funciona mejor cuando se utiliza una sola fuente. Esto iría después del circuito de preamplificación ya discutido y la entrada podría estar acoplada a la CA o no, a pesar de que se ejecuta a partir de una sola fuente de alimentación que en realidad va a funcionar muy bien con voltajes de entrada negativos, siempre y cuando no se exceda el voltaje disponible de pico a pico de los amplificadores operacionales.

OP1 actúa como un diodo (casi) ideal que evita el problema habitual de la caída de tensión a través del diodo cuando se rectifica. Casi cualquier diodo de pequeña señal funcionará para D1, algo con una menor caída de voltaje hacia adelante aumentaría la precisión, pero dudo que sea importante para su uso.

C1 y R4 actúan como un filtro de paso bajo para suavizar la salida, puedes jugar con sus valores para adecuar el rendimiento a lo que intentas hacer (y a tu frecuencia de muestreo).

Probablemente puedes usar el mismo modelo de amplificador operacional que usas en el preamplificador, pero el Rail-to-Rail y la alta velocidad de giro son ideales para este circuito. Si tienes un problema de estabilidad, aumenta R1, R2 y R3 a 100k ohm.

0 votos

El micrófono es un micrófono de condensador electret estándar. Haré que R3 sea de 10K, mi Vcc es de 5,9V así que ¿estará bien si R1 y R2 son de 10K también? ¿Qué amplificador óptico me recomiendas? ¿LM358 o 741? ¿Hay alguna manera de llevar el punto "cero" a 0 o cerca de 0? "En su lugar, haz la detección de nivel de pico o de media en el dominio analógico y ajusta el periodo de media proporcionalmente a lo que será tu frecuencia de muestreo." - ¿Puedes darme un poco más de detalle sobre esto? suena interesante y realmente quiero investigarlo. Lo siento, tengo muchas preguntas... Soy un estudiante de EE en la universidad que todavía está aprendiendo.

0 votos

Probé tu circuito recomendado (es mucho más limpio que lo que estaba usando, menos aleatoriedad en la salida). Usé 1M Ohm para R5 y 1k Ohm para R4, dando una amplificación de 1000. Cuando hice algunas mediciones con un DMM, el opamp da una salida silenciosa de unos 3 voltios, y C3 lo reduce a unos 1,5 voltios. También cuando quito R5, no hay ninguna diferencia en la salida... ¿está seguro de que la ganancia es R4/R5?

1 votos

R3 establece el punto de polarización del FET dentro del micrófono, (R1 || R2) || R3 establece la impedancia de entrada de CA vista por el micrófono. Ajustar el punto "cero" a 0 no puede ser resuelto por nada en el dominio analógico, eso es una función del ADC en el arduino que tiene una sola fuente de alimentación. Todo lo que tienes que hacer es restar ~512 de cada muestra si quieres que ningún sonido sea cero (asegúrate de usar un tipo de datos con signo ya que esto significa que los valores negativos son posibles)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X