¿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 ponerlo todo junto.

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

Probé 3 chips de amplificador diferentes:

  • LM386: recibí comentarios de 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 LM358

Seguí este esquema exactamente (excepto que jugué con los valores de resistencia para obtener una buena ganancia): usé 50k ohm para R5 y 10 ohm para R2.ingrese la descripción de la imagen aquí

El problema es que la salida de los dos últimos chips no está "limpia". El analogRead() en Arduino siempre lee un valor distinto de cero incluso cuando no hago ruido en el micrófono. La lectura reacciona correctamente cuando hago ruido, pero el valor "cero" no es cero. A veces, el valor "cero" incluso parpadea y arroja la lectura todo el tiempo. Ojalá eso tuviera sentido.

¿Puedes ayudarme a resolver esto?

Igual de importante, información adicional: estoy tratando de hacer algo como esto , eventualmente.

¿Estás seguro de que tienes C2 en su lugar? ¿Cuál es el voltaje de CC silencioso después de C2?
Sí, tengo C2 en su lugar. Son unos 2 voltios. No sé si esto tiene algún sentido: ¿podría ser que haya algo de corriente atrapada (?) En el bucle entre los pines 2 y 6, la salida y la entrada inversora?
¿Qué tal el voltaje de CC silencioso después de C2 desconectado del pin de entrada de Arduino?
La presencia de C2 significa que la salida del preamplificador oscilará alrededor de 0V, no 2.5V a los que está operando internamente.
Otra cosa: es posible que desee deslizar un pequeño diodo shottky entre el preamplificador C2 y la entrada de Arduino, deseche esos voltajes negativos que realmente no le importan. Una cosa más que hice fue agregar otro capacitor entre la entrada analógica y tierra para suavizar un poco la señal. Hace que el medidor VU parpadee un poco menos.
Ah, y cuando trate con el valor de entrada, tome la raíz cuadrada: representa más lo que está escuchando (logarítmico) que lo que se está muestreando (lineal). En lugar de hacer cálculos pesados, solo usé una pequeña tabla de búsqueda,
Solo una nota sobre el esquema dibujado en la primera imagen. Se utilizan resistencias de 27k para compensar 1/2 VDC y luego poner C3 en la salida. Esto es bueno para el preamplificador de micrófono, pero no es bueno para conectarse a ADC porque necesita la compensación que creó. Entonces, si alguien intenta conectar este circuito a ADC, elimine C3 si desea que el cero fluctúe ~ 512 o su cero fluctuará alrededor de GND.
@Majenko no obtendrá voltajes negativos; ese amplificador operacional funciona con un suministro unipolar.

Respuestas (3)

Deshazte del capacitor de salida. Ese circuito probablemente estaba destinado a producir una señal alrededor de cero, por lo que el capacitor 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 deshágase del capacitor.

Los micrófonos necesitan mucha ganancia. Los electretos pueden ser sensibles, pero es posible que aún necesite una ganancia de voltaje de 1000. La ganancia en su circuito es la relación de R5 a R2, pero esto solo funciona dentro de los límites de lo que puede hacer el opamp.

Los valores que mencionó anteriormente le darían una ganancia de 5000. Eso es mucho más de lo que debería tratar de obtener de una sola etapa de opamp. No solo el voltaje de compensación se multiplicará por esta ganancia, sino que el amplificador operacional no podrá proporcionar eso en todo el rango de frecuencia. Con un ancho de banda de ganancia de 1 MHz, solo obtendrá esa ganancia un poco por debajo de los 200 Hz. Incluso un desplazamiento de entrada de 1 mV se convierte en 5 V después de una amplificación de 5000.

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

Pruebe dos etapas con una ganancia de 30 o más para empezar y vea a dónde lo lleva. Esa es una ganancia que puede manejar en frecuencias razonables con suficiente espacio libre para que funcione la retroalimentación. También necesita acoplar capacitivamente las dos etapas para que el voltaje de compensación de entrada no se acumule en todas las etapas.

Editar: circuito agregado

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, lo que debería ser suficiente para un micrófono electret razonable. Puede que sea un poco demasiado, pero es fácil agregar algo de atenuación.

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

A diferencia de lo que dije antes, las dos etapas no necesitan acoplarse capacitivamente para evitar que el voltaje de compensación se acumule junto con la ganancia. Esto se debe a que en este circuito, cada etapa tiene solo una ganancia de CC de 1, por lo que la compensación final es solo el doble de la compensación del opamp. Estos amplificadores operacionales solo tienen una compensación de 500 µV, por lo que la compensación final es de solo 1 mV debido a los amplificadores operacionales. Habrá más debido a la falta de coincidencia de R3 y R4. En cualquier caso, la CC de salida estará lo suficientemente cerca de la mitad del suministro como para no consumir el rango A/D de manera significativa.

La ganancia de CC de 1 por etapa se logra acoplando capacitivamente la ruta del divisor de retroalimentación a tierra. El capacitor bloquea la CC, por lo que cada etapa es solo un seguidor de unidad para la CC. La ganancia total de CA se realiza cuando la impedancia del condensador (C3 en la primera etapa) se vuelve pequeña en comparación con la resistencia divisora ​​inferior (R7 en la primera etapa). Esto comienza a suceder alrededor de los 16 Hz. Un inconveniente de este enfoque es que la constante de tiempo para establecerse es C3 por R7+R5, no solo R7. Este circuito tardará un par de segundos en estabilizarse después de encenderse.

Cuando saco la tapa de la salida, el arduino ve una entrada de unos 3 voltios. Lo siento, pero ¿puede explicar qué quiere decir con voltaje de compensación? Para obtener una ganancia de 1000, con R2 siendo 10k Ohm, ¿necesito 10M ohm para R5? ¿Estas seguro acerca de esto? La ganancia es la relación entre R5 y R2, ¿verdad?
@Shubham: su circuito intenta multiplicar el voltaje de compensación del amplificador operacional por 5000, por lo que no sorprende que la salida esté vinculada a un riel. Ningún opamp es perfecto. El voltaje de compensación de entrada es el voltaje entre las dos entradas cuando la salida está en el rango medio. En teoría, las dos entradas serían iguales entonces. La especificación de voltaje de compensación de entrada le indica qué tan lejos está de este ideal.
@Shubham: necesitaría 10 MOhm para la resistencia de retroalimentación si intentara que una etapa produjera toda la ganancia. Como dije, es una mala idea.
Gracias por toda la ayuda, aprendiendo mucho aquí. Entonces, tener dos etapas de 30 de ganancia cada una me da una ganancia total de 900, ¿verdad? Intentaré esto usando un LM358 (eso es lo que tengo por ahí) e informaré
¡Finalmente funcionó! ¡Gracias por darme ese esquema! Pero solo obtengo un rango de ADC de alrededor de 200. El valor de ADC silencioso estará un poco por encima del punto medio (512), pero no importa cuánto ruido haga en el micrófono, el valor de ADC no superará los 200 por encima. el valor silencioso. Probablemente sea mi configuración de tapas y resistencias lo que limita esto.
Así que tengo 2 preguntas: no usé los valores exactos que tienes en tu esquema, pero traté de acercarme lo más que pude. ¿Puedo aumentar o disminuir un límite o una resistencia para aumentar el rango de ADC? Además, ¿el ADC SIEMPRE obtendrá una entrada más alta que el punto medio (512)?
También tengo curiosidad: ¿Qué hace exactamente C5? Lo siento, me encanta hacer preguntas, espero que no te moleste que te envíe spam... jaja.
C5 es un condensador de desacoplamiento. Está pasando por alto las entradas Vcc y Vee del amplificador operacional.
@Shubham: Parece que necesitas más ganancia. 1000 suele ser suficiente para un electret, pero tal vez el tuyo necesite más. O tal vez los valores de las partes sustituidas no le están dando a su circuito la ganancia deseada. Muestre el esquema tal como lo construyó para que podamos comentarlo. 512 debería ser el nivel silencioso. La lectura debe ir tanto por encima como por debajo de eso cuando el micrófono capta el sonido. Ajs410 es correcto, C5 es una tapa de desacoplamiento. No intentes jugar y dejarlo solo porque no entiendes lo que hace.
@Olin Aquí hay un esquema exacto de lo que hice: enlace Oh, está bien, sí, dejé el condensador de desacoplamiento allí. Por cierto, ¿qué software esquemático usas? Usé TinyCad, pero me gusta tu esquema.
@Shubham: Cambiaste un montón de valores, por lo que habrá problemas. Ahora está pidiendo una ganancia de 101 desde la primera etapa. No creo que sea una buena idea, pero no he buscado su opamp. Esto también hará que el circuito se asiente durante 3 veces más desde el encendido. La segunda etapa está configurada para una ganancia de 11, pero la atenuación de baja frecuencia ahora es mucho mayor desde que cambió las impedancias.
@Olin: Sí, hice todo lo posible para igualar sus valores, pero tengo una caja de piezas variadas en las que no pude encontrar exactamente lo que necesitaba. ¿Significa eso que estoy amplificando por 101x11 = 1111? ¿Por qué es 101 y 11, y no 100 y 10?
@Shubham: Sí, y la ganancia es (R1 + R2)/R2 = R1/R2 + 1, no solo R1/R2. Piense en el circuito, comprenda cómo funciona y esto tendrá sentido.

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

Si está midiendo 2 V y ve valores de ADC alrededor de 400, entonces básicamente funciona bien.

Las ondas sonoras van de presión negativa a positiva. Si el punto central fuera 0 y la señal solo 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 sin importar qué tan silencioso esté).

Ohhh, eso explica el "desplazamiento de CC" que seguí viendo en otras respuestas. ¿Hay alguna manera de eliminar el desplazamiento de CC pero colocando un límite en alguna parte?
@Shubham: QUIERES una compensación de DC. El proceso ADC no funcionará sin uno. La tapa C2 es lo que asegura que tienes uno. Sin embargo, en este caso probablemente no haya mucha diferencia, porque la salida de U1 ya está compensada. ¿Puedes medir el valor de CC en cada lado de C2?
@Shubham: si quiere decir que desea que sus medidas digitales se centren en 0 en lugar de 512, simplemente puede restar la compensación en su software, o mejor, implementar un filtro digital de paso alto en el software.

¿Puedes publicar la hoja de especificaciones de ese micrófono? No hay ninguna razón por la que necesite una ganancia de 5000 con un micrófono electret a menos que tenga una unidad sin FET interno. Si ese es el caso, el preamplificador debe tener un aspecto muy diferente.

Además, el circuito que usó no es muy propicio para usarse como preamplificador para un micrófono electret.

Yo lo recomiendo:

ingrese la descripción de la imagen aquí

R5/R4 establece la ganancia y se puede ajustar sin atornillar con 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 ajusta demasiado bajo, debería reconsiderar los valores de R1 y R2 para corregir la impedancia de entrada.

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

Como mencionaron las otras respuestas, su punto "cero" será ~ 512 cuando lea el ADC y fluctuará un poco sin importar lo que haga.

Si su objetivo es parpadear las luces en respuesta al nivel, no debería tomar lecturas instantáneas con un arduino de todos modos, ya que dudo que pueda muestrear lo suficientemente rápido como para que responda bien. En su lugar, realice una detección de nivel pico o promedio en el dominio analógico y establezca el período promedio proporcionalmente a la tasa de muestreo que sea.

EDITAR: Más información sobre cómo hacer esto con un detector de picos

El problema que tendrá aquí es que el arduino tiene una frecuencia de muestreo relativamente limitada, creo que su máximo será de aproximadamente 10 khz, lo que significa que solo puede resolver una señal de audio de 5 khz como máximo. Es decir, con el arduino haciendo muy poco, excepto ejecutar el ADC, si necesita hacer algún trabajo real (y hace algo para obtener el nivel), la frecuencia de muestreo será menor.

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

Ahora, si todo lo que está tratando de medir es el nivel de la señal de entrada y no le importa obtener una representación digital de la señal, entonces puede usar un detector de pico simple después de este preamplificador para hacerlo.

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

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

ingrese la descripción de la imagen aquí

Hay alrededor de mil millones de formas diferentes de hacer esto, pero yo elegiría este circuito, parece funcionar mejor cuando se usa un solo suministro. Esto iría después del circuito de preamplificador ya discutido y la entrada podría estar acoplada a CA o no, a pesar de que se ejecuta desde un solo suministro, en realidad funcionará bien con voltajes de entrada negativos siempre que no exceda el pico disponible. a la tensión de pico de los amplificadores operacionales.

OP1 actúa como un diodo (casi) ideal que evita el problema habitual de la caída de voltaje en el diodo cuando se rectifica. Casi cualquier diodo de señal pequeña funcionará para D1, algo con una caída de voltaje directa más baja 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, puede jugar con sus valores para hacer coincidir el rendimiento con lo que intenta hacer (y su frecuencia de muestreo).

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

El micrófono es un micrófono de condensador electret estándar. Haré R3 10K, mi Vcc es 5.9V, ¿estará bien si R1 y R2 también tienen 10K? ¿Qué opamp recomendaría: LM358 o 741? ¿Hay alguna manera de que pueda bajar el punto "cero" a 0 o cerca de 0? "En su lugar, realice una detección de nivel pico o promedio en el dominio analógico y establezca el período promedio proporcionalmente a la tasa de muestreo que sea". - ¿Me puede dar un poco más de detalle sobre esto? Suena interesante y tengo muchas ganas de investigarlo. Lo siento, tengo muchas preguntas... Soy un estudiante de EE en la universidad que todavía está aprendiendo.
Probé su 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 está dando una salida silenciosa de alrededor de 3 voltios, y C3 la reduce a alrededor de 1,5 voltios. Además, cuando elimino R5, no hay ninguna diferencia en la salida... ¿estás seguro de que la ganancia es R4/R5?
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. Establecer el punto "cero" en 0 no puede resolverse con nada en el dominio analógico, esa es una función del ADC en el arduino que tiene una sola fuente de alimentación. Todo lo que tiene que hacer es restar ~512 de cada muestra si no quiere que ningún sonido sea cero (asegúrese de usar un tipo de datos con signo, ya que esto significa que los valores negativos son posibles)
R4/R5 es la ganancia, sin embargo, una ganancia de 1000 puede estar más allá de los límites del amplificador operacional en la frecuencia que probó. C2 en el circuito solo está ahí para ayudar a mitigar cualquier compensación de CC en la salida de la retroalimentación y no afecta la ganancia.
Mark, C1 contra R1//R2 tiene una frecuencia de atenuación de filtro de paso alto de 1,3 kHz. Eso está muy por encima de una buena fracción de las frecuencias de voz y 6 octavas por encima del límite inferior de "HiFi". Esto puede estar bien si solo quiere hacer un disparador activado por sonido, pero no es bueno si quiere un sonido digitalizado normal.
@Olin, es posible que desee verificar sus matemáticas en eso, 1/(2*pi*13,500*2.2e-6) = 5.35 Hz.
@Mark: ahora no tengo idea de cómo obtuve ese valor de 1.3 kHz. Tengo 5,4 Hz ahora también. Debo haber presionado la tecla equivocada en alguna parte. Perdón por la confusion.
@Shubham Agregué más sobre el uso de un circuito de detección de picos para lo que intentas hacer.