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:
200ms de esta señal contienen los pulsos internos con un periodo de 1.25ms:
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
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:
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?
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:
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 Vcc
el 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 R
y colocarlo C
directamente a través del colector (10uF, valor adaptado para la constante de tiempo). Sin embargo , esto hará que Ic sea más alto cuando C
se descargue. De lo contrario, haga R=2k7
y 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 TLP
opto, 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):
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.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.
Puede lograr esto directamente con el microcontrolador.
Hacerlo tiene algunas ventajas:
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.
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.
Damián
abdullah cinar