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

12

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

Conecté un micrófono electret a un opamp y le di salida a mi microcontrolador Arduino. El ADC en el 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 opaco 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 ohmios para R5 y 10 ohmios 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 el 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 arrojando la lectura todo el tiempo. Espero que eso tenga sentido.

¿Me pueden ayudar a resolver esto?

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

Shubham
fuente
¿Estás seguro de que tienes C2 en su lugar? ¿Cuál es el voltaje de CC silencioso después de C2?
Majenko
Sí, tengo C2 en su lugar. Se trata de 2 voltios. No sé si esto tiene 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?
Shubham
¿Qué tal el voltaje de CC silencioso después de C2 con él desconectado del pin de entrada Arduino?
Majenko
La presencia de C2 significa que la salida del preamplificador oscilará alrededor de 0 V, no 2.5 V, que está operando internamente.
Majenko
Otra cosa, es posible que desee deslizar un pequeño diodo shottky entre el preamplificador C2 y la entrada Arduino, deseche esos voltajes negativos que realmente no le importan. Una cosa más que hice fue agregar otro condensador entre la entrada analógica y tierra para suavizar un poco la señal. Hace que el medidor de VU sea un poco menos parpadeante.
Majenko

Respuestas:

17

Deshágase del condensador de salida. Ese circuito probablemente estaba destinado a producir una señal alrededor de cero, por lo que el condensador está allí 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 elimine el condensador.

Los micrófonos necesitan mucha ganancia. Los electrets pueden ser sensibles, pero aún puede necesitar 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 opamp. No solo se multiplicará el voltaje de compensación por esta ganancia, sino que el opamp no podrá proporcionarlo 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 200 Hz. Incluso un desplazamiento de entrada de 1 mV se convierte en 5 V después de la amplificación en 5000.

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

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

Editar: circuito agregado

Anoche no tuve tiempo de dibujar un circuito 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 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 intenta producir la ganancia completa en una etapa. Cada etapa tiene una ganancia de aproximadamente 31. Eso deja bastante margen de ganancia a la frecuencia de audio máxima 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 ancho de banda de ganancia típico producto de 10 MHz. El factor limitante probablemente sea el micrófono.

A diferencia de lo que dije antes, las dos etapas no necesitan estar acopladas 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 solo tiene una ganancia de CC de 1, por lo que el desplazamiento final es solo el doble del desplazamiento de amplificador operacional. Estos opamps tienen un desplazamiento de solo 500 µV, por lo que el offset final es de solo 1 mV debido a los opamps. Habrá más debido a la falta de coincidencia de R3 y R4. En cualquier caso, la salida DC estará lo suficientemente cerca de la mitad del suministro como para no comer en el rango A / D de manera significativa.

La ganancia de CC de 1 por etapa se logra mediante el acoplamiento capacitivo de la ruta del divisor de retroalimentación a tierra. El condensador bloquea CC, por lo que cada etapa es solo un seguidor de unidad para CC. La ganancia de CA completa se realiza cuando la impedancia del condensador (C3 en la primera etapa) se reduce en comparación con la resistencia del divisor inferior (R7 en la primera etapa). Esto comienza a suceder a unos 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á unos segundos en estabilizarse después de encenderse.

Olin Lathrop
fuente
Cuando saco la tapa de la salida, el arduino ve una entrada de aproximadamente 3 voltios. Lo siento, pero ¿puedes explicar qué quieres decir con voltaje de compensación? Para obtener una ganancia de 1000, con R2 siendo 10k Ohm, necesito 10M ohmios para R5. ¿Estas seguro acerca de esto? La ganancia es la relación entre R5 y R2 ¿verdad?
Shubham
@Shubham: su circuito intenta multiplicar el voltaje de compensación del opamp por 5000, por lo que no sorprende que la salida esté vinculada a un riel. No opamp es perfecto. El voltaje de compensación de entrada es el voltaje entre las dos entradas cuando la salida es de rango medio. En teoría, las dos entradas serían iguales entonces. La especificación de voltaje de compensación de entrada le dice qué tan lejos está de este ideal.
Olin Lathrop
@Shubham: Necesitaría 10 MOhm para la resistencia de retroalimentación si intenta que una etapa produzca toda la ganancia. Como dije, esa es una mala idea.
Olin Lathrop
Gracias por toda la ayuda, aprendiendo mucho aquí. Entonces tener dos etapas de ganancia de 30 me da una ganancia total de 900, ¿verdad? Probaré esto usando un LM358 (eso es lo que tengo por ahí), e informaré de nuevo
Shubham
Finalmente funcionó! ¡Gracias por darme ese esquema! Pero solo obtengo un rango de ADC de aproximadamente 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 está limitando esto.
Shubham
5

Como usted dice, 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 alrededor del medio del rango como este. No tiene que ser 512 exactamente, pero debe estar cerca. Esto se llama "DC offset". 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 está funcionando bien.

Las ondas sonoras van de presión negativa a positiva. Si el punto central fuera 0, y la señal solo se pudiera medir 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, no importa cuán callado esté).

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

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

Además, el circuito que usó no es muy propicio para ser utilizado 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 ajusta esto demasiado bajo, debería 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é desacoplada adecuadamente, ya que cualquier ruido se introducirá en el micrófono.

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

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

EDITAR: más sobre hacer esto con un detector de pico

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. Eso es con el arduino haciendo muy poco, excepto ejecutar el ADC, si necesita hacer un trabajo real (y hace algo para nivelarlo), 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 que alimenta al 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 hace esto convierte 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 bamboleo 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 pico sin retención es realmente solo un rectificador con un filtro en la salida. En este caso, debemos tratar 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 para su circuito rectificador promedio. Esta familia de circuitos se llama "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 seguiría con 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 funciona desde una sola fuente, en realidad funcionará bien con voltajes de entrada negativos siempre que no exceda el pico disponible. tensión máxima de los amplificadores operacionales.

OP1 actúa como un diodo (casi) ideal que evita el problema habitual de la caída de voltaje a través del diodo al rectificar. Casi cualquier diodo de señal pequeño 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 rotación son ideales para este circuito. Si tiene un problema de estabilidad, aumente R1, R2 y R3 a 100k ohm.

marca
fuente
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 son 10K? ¿Qué opamp recomendarías: LM358 o 741? ¿Hay alguna manera de que pueda llevar el punto "cero" a 0 o cerca de 0? "En su lugar, realice la detección de nivel máximo o promedio en el dominio analógico y establezca el período promedio proporcionalmente a la 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 estoy aprendiendo.
Shubham
Probé su circuito recomendado (es mucho más limpio de 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 aproximadamente 3 voltios, y C3 lo reduce a aproximadamente 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?
Shubham
1
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 se puede resolver 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 desea que el sonido sea cero (asegúrese de usar un tipo de datos con signo, ya que esto significa que los valores negativos son posibles)
Marque el
R4 / R5 es la ganancia, sin embargo, una ganancia de 1000 puede superar los límites del opamp a la frecuencia que probó. C2 en el circuito está ahí para ayudar a mitigar cualquier compensación de CC en la salida de la retroalimentación y no afecta la ganancia.
Mark
Mark, C1 contra R1 // R2 tiene una frecuencia de caída 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 "HiFi". Esto puede estar bien si solo quiere hacer un disparo activado por sonido, pero no es bueno si quiere un sonido digitalizado normal.
Olin Lathrop