Detecta la señal de llamada usando un filtro de paso bajo

Creé 2 tableros que se comunican entre sí como un sistema de intercomunicación. Uno de ellos tiene un botón para enviar una señal de llamada al otro. La señal de timbre consta de señales PWM creadas por una MCU. Quiero detectar el tono de llamada por la MCU del lado del receptor.

Mi tono de llamada contiene 4 pulsos externos con un período de 300 ms:

vista exterior

200ms de esta señal contienen los pulsos internos con un periodo de 1.25ms:

ingrese la descripción de la imagen aquí

Entonces, quiero agregar un circuito de filtro al lado del receptor del tono de llamada y convertir la señal externa en una señal PWM directa. A continuación se muestra un ejemplo de salida

ingrese la descripción de la imagen aquí:

Hasta ahora, he intentado agregar un filtro de paso bajo RC con un corte de frecuencia de la señal externa (1/300ms = 3.33Hz ). Pero ni siquiera pude acercarme a la salida del ejemplo. ¿Hay algo que no entienda bien sobre el concepto ya que no tengo mucha experiencia en el diseño de circuitos?

Con respecto a mi circuito: acabo de agregar una resistencia en serie y un capacitor paralelo al nodo:

ingrese la descripción de la imagen aquí

Editar: no quería hablar sobre el circuito que maneja la conversión de la señal de la línea de audio a PWM, ya que este no es el tema de esta pregunta. Pero sospecho que mi filtro RC no funciona correctamente por esa parte. Probé las soluciones en la respuesta pero no funcionaron como se esperaba.

A continuación se muestra el esquema de mi lado del optoacoplador, la entrada de línea contiene la señal de audio del PWM. La señal de audio convertida nuevamente a PWM por el optoacoplador, luego obtengo la señal PWM que di en las capturas de pantalla anteriores. Pero cuando agrego las partes RC al nodo OPTO_OUTPUT , la señal PWM también cambia en términos de voltios. ¿Crees que tengo un error al agregar las partes de RC?

ingrese la descripción de la imagen aquí

¿Está conectando la señal de entrada a otro microcontrolador? ¿Está interesado en una solución de software que tenga una mayor precisión y no requiera componentes externos?
@Damien Por supuesto, me gustaría escucharlo. Estoy probando las soluciones en las respuestas, pero diferentes ideas también pueden ser buenas. Para su información, envío estas señales de audio mediante un controlador de línea (TEA1062).

Respuestas (4)

Si desea que se reciba la señal de 300 ms, mientras filtra la de 1,25 ms, entonces es la señal de alta frecuencia la que necesita filtrar, no la otra. Lo que significa que la constante de tiempo elegida es demasiado grande y afecta a la de 300 ms. La señal de alta frecuencia tiene un período de 1,25 ms, así que elija una constante de tiempo que sea más de 10 veces mayor, digamos 25 ms, que también sea más de 10 veces menor que los 300 ms. Aquí hay una prueba rápida en LTspice:

prueba

V(a)muestra la salida modulada, V(b)muestra la salida filtrada con una constante de tiempo de 22 ms y V(c)muestra la señal recuperada con una histéresis menor de 10 mV para contrarrestar el filtrado no ideal del RC. Tenga en cuenta que la señal filtrada tiene un trazo algo más grueso, eso se debe al residuo. Podría usar un filtro Bessel o Gaussiano para obtener mejores resultados, pero eso solo aumentaría la complejidad y, además, aún necesitará la recuperación de la señal, lo que significa que puede simplificar las cosas.


Si Vccel valor de su es 5V, entonces la resistencia del colector es demasiado, recuerde que los optoaisladores tienen una fuerte dependencia de Ic. Si es así, intente con una resistencia de 2k2, que solo usará Ic ~ 2.2mA, y podría renunciar al extra Ry colocarlo Cdirectamente a través del colector (10uF, valor adaptado para la constante de tiempo). Sin embargo , esto hará que Ic sea más alto cuando Cse descargue. De lo contrario, haga R=2k7y C=3u9(por ejemplo). No olvide que la señal ahora está invertida, por lo que he usado un comparador de histéresis inversor (el disparador Schmitt). No tengo TLPopto, así que solo he usado lo que ves, adaptarlo a tus necesidades. No estoy en casa en este momento, pero aquí hay un intento de ejemplificar ( V(n004)es la señal de 300 ms):

bla

Puedo entender que su respuesta debería funcionar muy bien, pero aún no pude hacerlo funcionar. Supongo que el problema podría ser el circuito entre la MCU y la entrada de línea. ¿Puedes mirar mi edición?
@abdullahcinar He actualizado mi respuesta, mira si responde a tu edición. Olvidé agregar, pero la resistencia de entrada ( R1) puede ser demasiado baja para sus necesidades, ya que consume ~ 20 mA, pero solo lo hice para asegurarme de que el colector no salte pulsos. Como dije, siéntase libre de ajustar para satisfacer sus necesidades.
¡Muchas gracias por la respuesta detallada, eres muy amable! Estoy tratando de probarlo en mi configuración, pero es un poco difícil para mí hacerlo cuando no tengo este esquema en mi PCB. Pero como dijiste, creo que solo tendré que volver a calcular las resistencias de acuerdo con mi opto (tal vez no sea necesario) y debería funcionar. Añadiré los resultados.
¡Funciona muy bien!
El uso de un filtro de paso bajo introduce un retraso que no tiene por qué existir y crea flancos ascendentes/descendentes lentos que requieren disparadores Schmitt o comparadores para generar flancos rápidos para la lógica digital. No es que nada de lo anterior tenga que ser un problema (no parece ser para el OP), pero podría ser para alguien que intente aplicar esta idea a una situación similar.
@DmitryGrigoryev Cierto, es por eso que dije que, para este caso, ya sea que use un RC simple o Bessel/Gaussian/etc, aún necesita condicionar la señal (comp/Schmitt/etc). El RC podría apretarse con menos retraso, a costa de una mayor histéresis.

Según la precisión con la que desee detectar la señal de timbre, es posible que deba filtrar la señal recibida con un filtro de paso de banda (a F = 800 Hz) y luego detectarla con envolvente. Alternativamente (y esto puede ser preferible) podría usar un circuito monoestable reactivable que producirá una salida alta constante cuando se active la "señal interna". Dado su perfil de timbre, esta señal desaparecerá durante aproximadamente 100 ms cada 300 ms. Esto detecta el "envolvente" de su señal de llamada. Entonces necesitaría algo de lógica para determinar que la forma del sobre era aproximadamente correcta.

Hay otras cosas que buscar. Hay circuitos integrados decodificadores de tonos que me vienen a la mente: el LM567 se ha utilizado en aplicaciones como esta muchas veces. O puede cambiar su señal básica de 800 Hz incorporando dos tonos y usar un chip decodificador DTMF.

Yo usaría un detector de sobres:

ingrese la descripción de la imagen aquí

Si elige la constante de tiempo RC en algún lugar entre la frecuencia de la portadora y la frecuencia de la señal, obtendrá la salida con este aspecto:

ingrese la descripción de la imagen aquí

Puede lograr esto directamente con el microcontrolador.

Hacerlo tiene algunas ventajas:

  • Sin necesidad de componentes externos.
  • Sin tiempo de respuesta / retraso causado por el filtrado.
  • Mayor precisión.

Básicamente, entiendo que desea conocer el ciclo de trabajo de la señal PWM.

Hacer eso con un microcontrolador es bastante simple, dado que su frecuencia es relativamente baja, no debería ser un problema para el uC manejarlo.

Solo necesitas un temporizador y una interrupción.

  • Conecte la señal directamente a su entrada uC.
  • Configure una interrupción impulsada por pin tanto en el borde bajo como en el alto.
  • Configure un temporizador con un período de tiempo conocido.

Cuando se llama a la interrupción, primero lea el valor del temporizador, luego lea el estado del pin (bajo o alto).

En la próxima interrupción, haga lo mismo, luego sabrá cuánto tiempo estuvo el alfiler alto o bajo, haga lo mismo con el otro borde.

Después de que ocurrieron 4 cambios de borde, sabrá con precisión cuánto tiempo estuvo alto y bajo, luego simplemente necesita calcular la relación.

Puede repetir esto para toda la señal de 200 ms, registrar todos los tiempos y hacer un promedio para mejorar aún más la estabilidad.


Consideraciones:

La interrupción introducirá algún retraso, por eso es importante leer el temporizador primero, para que tenga un retraso mínimo. Puede usar la interrupción de alta prioridad para evitar tener otro bloqueo de interrupción.

Consideramos que el retardo de interrupción (con alta prioridad) siempre será relativamente similar y con pequeñas diferencias promediadas sobre la señal de 200 ms.

También estamos considerando detectar la señal por el software, pero comenzaremos con la solución de hardware. Lo que dijiste es una buena manera, consideraré usar este enfoque. Pero dependerá de lo complejo que sea nuestro software. No queremos que interrumpa nuestras otras rutinas importantes cada 1,25 ms. Pero como dije, este es un buen enfoque que consideraré si decidimos usar una rutina de software para detectar el anillo. ¡Gracias!
@abdullahcinar Para ser honesto, esto es algo que evitaría, a menos que ya tenga interrupciones rápidas en su sistema. No podrá deshabilitar las interrupciones durante más de 1,25 ms sin correr el riesgo de obtener resultados falsos del algoritmo de detección, y deberá tener más cuidado al escribir cualquier código de tiempo crítico.