¿Por qué mi circuito MSGEQ7 da lecturas analógicas de Arduino que son tan altas?

3

He construido el siguiente circuito basado en un probado diseño de circuito basado en MSGEQ7 , que viene De la hoja de datos y en otros lugares en internet. He construido y codificado este circuito anteriormente, con una fuente de alimentación de 5V, no hay problema.

Laentradadeaudioesuna placa de desconexión del micrófono del electret sparkfun con un circuito de amplificación basado en amplificador operacional integrado. Esto también lo he utilizado con éxito en un proyecto anterior conectado al MSGEQ7. Funcionó bien allí, pero en ese momento usé un pin Arduino 3.3v para alimentar esto (aquí, tanto el MIC BoB como el MSGEQ7 están en rieles de 3.3V).

La única diferencia entre este circuito y el último que construí (que puedo decir de todos modos) es el hecho de que ahora estoy ejecutando el MSGEQ7 y el BOB en un riel 3.3V .

El circuito "un poco" funciona, pero las lecturas analógicas no parecen calibradas correctamente.

Aquí hay una muestra de la salida que estoy obteniendo:

RAW EQ      392 406 630 803 842 973 886 
RAW EQ      341 818 936 1022    1022    1022    1021    
RAW EQ      590 812 950 860 1023    1023    1021    
RAW EQ      550 894 1022    1022    1023    1022    1020    
RAW EQ      561 926 953 1023    1023    1022    1006    
RAW EQ      565 805 918 966 1022    1023    1013    
RAW EQ      525 835 1013    999 1023    1023    1022    
RAW EQ      611 862 884 1015    1022    1023    1012    
RAW EQ      541 794 802 849 1023    1023    1012    
RAW EQ      449 759 993 928 1023    1022    1002    
RAW EQ      400 858 1006    1013    1023    1022    1015    
RAW EQ      460 876 934 1023    1022    1023    1013    
RAW EQ      617 845 869 976 1023    1022    1022    
RAW EQ      729 814 981 1023    1023    1022    1015    

¡Como puedes ver, las últimas 3/4 bandas están casi al máximo!

Aquí está el código Arduino relevante:

Rutina de inicio

//initialise MSGEQ7 chip
void initMSGEQ7(int analog, int strobe, int reset)
{
#if defined DEBUG
    Serial.println("MSGEQ init");

    Serial.print("Analog Pin");
    Serial.println(analog);

    Serial.print("Strobbe Pin");
    Serial.println(strobe);

    Serial.print("Reset Pin");
    Serial.println(reset);

#endif
//set up MSGEQ7 pins
pinMode(analog, INPUT);
pinMode(strobe, OUTPUT);
pinMode(reset, OUTPUT);
analogReference(DEFAULT);

//turn off comms to MSGEQ7 to start with
digitalWrite(reset, LOW);
digitalWrite(strobe, HIGH);
//prep the MSGEQ7 to read in the frequency bands
digitalWrite(reset, HIGH);
digitalWrite(reset, LOW);   
}

Código de lectura

//read the EQ
void readEQ(int strobe, int analog, int (&bands)[7])
{
#if defined DEBUG
    Serial.print("RAW EQ\t\t");
#endif

//read in the bands
for (int i = 0; i < 7; i++)
{
    digitalWrite(strobe, LOW);
    bands[i] = analogRead(analog);
    delay(5);
    #if defined DEBUG
        Serial.print(bands[i]);
        Serial.print("\t");
    #endif
    digitalWrite(strobe, HIGH);
}
#if defined DEBUG
    Serial.println();
#endif
}

La pregunta: ¿Cómo puedo hacer que esto me dé lecturas en una mejor propagación de 0 a 1023 a través de las entradas analógicas de Arduino.

He reconstruido el circuito varias veces, usando componentes completamente nuevos (pasivos, IC, cable y BoB), los resultados son los mismos.

También tengo un riel de 3.7V no regulado (de una batería LIPO) que puedo usar. La fuente regulada de 3.3V proviene de una edición de 3.3V Arduino Pro Mini 8MHz que toma la fuente de alimentación no regulada de 3.7V LIPO.

    
pregunta Brad

1 respuesta

5

Observaciones a partir de los datos:

  • La primera fila de datos parece ser un valor atípico estadístico y puede rechazarse: todas las lecturas son inferiores al perfil para las filas subsiguientes, probablemente debido al comportamiento de inicio.
  • La última banda no se está saturando, varía de 1002 a 1022, por lo que está capturando datos válidos
  • Las bandas 4, 5 y 6 están casi saturadas, pero no están "pegadas al riel", sí muestran alguna variación, por lo que no están en un estado fallido, pegado a Vcc

Esto indica que la señal generada por el micrófono electret preamplificado es muy alta en las bandas de frecuencia representadas por las salidas 4, 5 y 6. Esto se puede verificar utilizando un diodo de avalancha polarizado o un diodo Zener (V zener > 7 Volts) como una fuente de ruido blanco que reemplaza el micrófono electret en el preamplificador del BoB y verifica la salida usando un osciloscopio en el modo de análisis de espectro.

Esto no es sorprendente en absoluto, ya que los micrófonos electret no son muy lineales, y el preamplificador en el tablero de ruptura no tiene ninguna ecualización incorporada, según el esquema de SparkFun. Por lo tanto, se espera que el resultado neto sea un perfil de salida más bien no lineal.

La respuesta de frecuencia MSGEQ7 , por otro lado, es bastante lineal en todas las bandas:

Sielproblemasoloimplicalograrquelosnivelesdeseñaldetodaslasbandasseencuentrenenunrangoutilizable,un divisor de voltaje de resistencia para atenuar la señal entrante a quizás 50 o 75% debería hacer el truco, en todas las bandas. El 50% dejará suficiente espacio para capturar picos de señal en cualquier banda, como ocurre invariablemente con el audio normal.

simular este circuito : esquema creado usando CircuitLab

Si también es necesario igualar la señal de modo que las bandas de rango medio y de tweeter se atenúen mientras que las bandas de woofer relativamente débiles no se vean afectadas, entonces un circuito como a filtro de parada de banda , con una muy baja Q , y la frecuencia de polos entre la banda 5 (~ 2200 Hz) y la banda -6 (~ 6000 Hz) frecuencias. En efecto, esto será más bien un filtro de "atenuación de banda", para las bandas problemáticas, con algún efecto también en las bandas inferior y superior:

(

respondido por el Anindo Ghosh

Lea otras preguntas en las etiquetas