Cómo generar una interrupción en una MCU cuando se produce un sonido de frecuencia específica

6

Me gustaría usar un micrófono para generar una interrupción en una MCU cuando se emite un sonido con una frecuencia determinada cerca.

Pensé que usar un filtro de banda de paso LRC, junto con un amplificador operacional cuyo voltaje de salida se conectaría al pin de interrupción de la MCU.

¿Crees que eso funcionaría? ¿Alguna idea mejor / más confiable?

Esta es una grabación de la FFT de nuestra señal. El registro se ha hecho en un ambiente ruidoso representativo. Nuestra señal tiene una frecuencia de 18.5 kHz. Lo ideal sería que la interrupción se activara dentro de unos pocos cientos de ms.

    
pregunta Vincz777

5 respuestas

3

Para resumir, desea detectar la presencia de una señal de 18.5 kHz en unos 100 ms.

Sí, puede hacer esto con un filtro resonante, un detector de amplitud y un comparador. Sin embargo, mi primera reacción es hacerlo digitalmente con un pequeño microcontrolador o DSP. Uno de los pequeños microchip serie dsPIC debería ser adecuado.

Las ventajas de hacer esto digitalmente son una precisión, una desviación, una variación de temperatura y un tiempo de respuesta mucho mejores. También puede ajustar el ancho de la banda de paso para rechazar la mayor cantidad de ruido posible y tener el tiempo de respuesta mínimo que necesita. Esto es mucho más difícil de modificar en analógico y dependerá bastante de las variaciones de las partes. Es probable que el procesador ocupe menos espacio y, al momento de pagar por piezas analógicas de precisión, probablemente también sea más barato.

Para detectar una sola frecuencia conocida digitalmente:

  1. Muestra la señal de entrada. La tasa de muestreo mínima teórica es el doble de la frecuencia de interés, pero en realidad necesita más que eso. Básicamente, la muestra tan rápido como el procesador y A / D puede tomar y procesar las muestras.

    Empezaría con tal vez 250 kHz. Eso te da 13.5 muestras por ciclo, lo cual es suficiente. Para un dsPIC de la serie EP de 70 MIPs, eso le da 280 ciclos de instrucción por muestra, lo que también es suficiente. Muchas de estas partes tienen A / D de 12 bits que pueden ejecutarse fácilmente a este ritmo.

    Hay una ventaja de tener un número entero de muestras por ciclo que es divisible por 4 (ver el siguiente punto), así que escogería 12x o 16x. 16x su frecuencia objetivo de 18.5 kHz es 296 kHz. Eso le da 236 ciclos de instrucción por muestra, que es significativamente más de lo que debería tomar.

  2. Genere el seno y el coseno de la frecuencia objetivo de 18.5 kHz para cada muestra de entrada. Aquí es donde el muestreo en un múltiplo entero de la frecuencia objetivo simplifica un poco las cosas. En ese caso, puede utilizar una tabla de valores precalculados. El número de entradas de la tabla es el número de muestras por ciclo. Se usa la misma tabla desde entonces y coseno, con los índices desplazados en una tabla de 1/4. De ahí es de donde proviene el múltiplo 4x de la frecuencia de muestreo.

  3. Cada muestra, calcula la muestra por el seno y por el coseno.

  4. Filtro de paso bajo de los dos productos. La banda de paso de su filtro general será el doble de la frecuencia de atenuación de este filtro. Por ejemplo, si pasa el filtro de paso bajo de los dos productos a 100 Hz, finalmente detectará 18.5 kHz ± 100 Hz.

    Este filtro también se convierte en la inmunidad al ruido frente al intercambio de tiempo de respuesta. Cuanto más estrecha sea la banda de paso alrededor de su frecuencia objetivo, más ruido se eliminará, pero más tardará la detección en establecerse. Comenzaría con dos polos simples a 100 Hz cada uno.

  5. Cuadrar los dos resultados filtrados y agregarlos.

  6. Compare ese resultado con un umbral predeterminado. Este resultado es la señal digital 18.5 kHz está presente . Un poco de histéresis podría ser útil aquí, dependiendo de los detalles que no nos haya dicho.

Consulte esta respuesta que contiene más detalles sobre esta técnica, incluidos ejemplos de detección de un tono DTMF.

    
respondido por el Olin Lathrop
1

Si la frecuencia (emisión de la señal deseada) dura muchos ciclos, esto se hace viable independientemente de la tecnología. Un circuito LCR (con bajas pérdidas) (también conocido como muy sintonizado) tomará muchos ciclos de la frecuencia para producir una salida en la que se pueda confiar.

Cuanto más alta sea la sintonización (más baja sea la pérdida), más confiable será para detectar la probabilidad de la frecuencia de transmisión correcta, pero, ¿dónde traza la línea? ¿Hace un filtro muy altamente sintonizado que demore 1 segundo (o 10 segundos) antes de que la amplitud alcance un punto donde un comparador pueda detectar la señal de manera confiable O tiene un circuito sintonizado en el que una frecuencia falsa podría ser "aceptada" por el circuitos de detección en 0,1 segundos.

No es negro o blanco, hay tonos de gris. Nadie que responda a esta pregunta conoce las señales que pueden estar presentes y que pueden hacer una detección falsa. ¿Sabes lo que son?

Por lo tanto, indique las amplitudes potenciales, la duración y las frecuencias de las señales no deseadas que deben rechazarse y también el rango de amplitudes, duraciones y frecuencias que deben detectarse. Esta suele ser la parte más difícil: diseñar es la parte fácil una vez que te dan una especificación definitiva y eso es lo que te pido que creas.

EDITAR las siguientes divulgaciones de OP:

Vale la pena investigar el decodificador de tono LM567.

    
respondido por el Andy aka
1

Si la señal se puede transformar en una onda cuadrada, podría alimentarla en una entrada de temporizador / contador y cada 100 ms leerá la cuenta de tics para ver si la cantidad de cruces coincide con su frecuencia de interés +/- tolerancia. Muy simple, muy eficiente energéticamente, pero la señal debe ser relativamente libre de ruido. También puede usar un comparador integrado en muchas MCU para alimentar el temporizador / contador.

    
respondido por el filo
0

Suponiendo que el ruido ambiental podría exceder la señal de 18.5 kHz por un amplio margen, uno puede diseñar con precisión el filtro adaptado óptimo si conoce la ganancia de banda de paso exacta necesaria para rectificar y detectar mientras atenúa la banda de parada en X dB, si se conoce. Esto puede tomar 1 o 2 etapas de RC BPF dependiendo de la precisión de la frecuencia central y la ganancia. la tercera etapa sería un amplificador operacional de precisión de media onda y el tiempo de subida sería inverso al ancho de banda, por lo que con un BW de 1 kHz se espera un tiempo de detección de < 1 ms. La 4ª etapa es un comparador de amplitud con alguna histéresis. p.ej. 10%

El desafío es ofrecer una alta Q, alta ganancia estable con ancho de banda plano en el rango de la señal para que el umbral de detección sea estable.

Hasta que defina la cantidad de ruido y rechazo requerido, no es posible un diseño completo.

Pero puede comenzar con algo como esto. usando una fuente de amplificación operativa modificada para cambiar gnd a Vcc / 2. Los requisitos de GBW superan los 50MHz para lograr alguna ganancia.

  

El uso de un PLL con un control muy estricto en el error de frecuencia puede lograr el tiempo de bloqueo, pero puede haber algunas incógnitas para que el rechazo de ruido afecte el tiempo de detección. Con una señal a -50dB, este filtro podría usarse para amplificar la señal en 30dB antes de ingresar a un LMC567 PLL en lugar de los detectores sugeridos anteriormente.

    
respondido por el Tony EE rocketscientist
0
  

¿Alguna idea mejor / más confiable?

al menos algunas maneras:

1) use un filtro de paso de banda y luego agregue la salida para detectar la presencia de ciertas frecuencias. es rápido pero tiene una mayor cantidad de partes y necesita más bienes raíces;

2) uso del procesamiento digital: fft podría ser un enfoque. La precisión / velocidad depende de muchos factores. Pero sobre todo, lo que quieres hacer es factible.

3) en algún lugar intermedio. por ejemplo, hay un algoritmo que puede detectar la amplitud de una frecuencia en particular - > Básicamente fft a una frecuencia fija. hay un algoritmo iterativo, vs en modo por lotes, para acelerar la ejecución, etc.

Creo que el panorama general es que es factible. pero hay desafíos y atajos con los que lidiar.

editar: aquí hay un ejemplo del tercer enfoque.

se basa en un simple hecho de que si integra, durante un largo período de tiempo, el producto de la señal de entrada y una señal de referencia (de una frecuencia conocida), el producto se aproxima a una constante * el número de puntos de datos.

entonces, lo que podría hacer es decir muestra a una frecuencia conocida y multiplicar los resultados de adc con una tabla sinusoidal sincronizada con la frecuencia de muestreo. Si esa suma del producto es sustancial, la frecuencia conocida está presente en la señal de entrada.

Aquí hay un ejemplo numérico. dos señales de entrada,

sig1 = -123 + 1000 * sin(2pi*f*0.5+phase) + 100 * sin(2pi*f+phase) + 1000 * sin(2pi*f*2+phase) + 10000 * sin(2pi*f*3+phase) + noise;
sig2 = -123 + 1000 * sin(2pi*f*0.5+phase) + 000 * sin(2pi*f+phase) + 1000 * sin(2pi*f*2+phase) + 10000 * sin(2pi*f*3+phase) + noise;

note la diferencia entre sig1 y sig2: a sig2 le falta la frecuencia base - > su magnitud se establece en 0 para simular la ausencia de la frecuencia base.

también, tanto sig1 como sig2 contienen muchos armónicos, incluso en una magnitud mucho mayor que la señal base. nuestro trabajo es identificar la señal base entre todo el ruido.

los siguientes gráficos de diagramas dat1 = sig1 * sin (2pif) y dat2 = sig2 * sin (2pif).

Compruébelo usted mismo :)

el gráfico se normaliza al número de muestras integradas en.

después de aproximadamente 20K muestras, la diferencia entre las dos se vuelve bastante clara.

también existe otro algoritmo más sofisticado, como ieee1057 o 1241. ambos pueden ser mucho más rápidos que fft si se conoce la frecuencia de la señal que desea detectar.

    
respondido por el dannyf

Lea otras preguntas en las etiquetas