No se pudo usar un filtro de paso bajo para convertir la entrada PWM en salida digital

Quiero convertir una señal de servocontrol en una salida digital de 5V o 0V.

Este es el formato de mi señal PWM:

ingrese la descripción de la imagen aquí

La diferencia es que el ancho de mi pulso de entrada será de 1 ms (mínimo) o 2 ms (máximo). Puede haber un ligero ruido, pero no hay valores como 1,5 ms. Solo 1 o 2.

Traté de crear un circuito que hace esto:

ingrese la descripción de la imagen aquí

Cuando mido Vout:

  • Ancho de pulso de 1 ms: 170 mV
  • Ancho de pulso de 2 ms: 295 mV

Realmente no sé por qué no funcionó. Estaba esperando esto:

  • Ancho de pulso de 1 ms: 0V
  • Ancho de pulso de 2ms: 5V

¿Saben por qué no funcionó y qué puedo hacer para mejorarlo?

Su filtro le da más o menos el promedio de su señal. El promedio de una señal PWM que va de 0 a 5v no puede ser cero, ya que cualquier cosa mayor que cero promediada con cero todavía da un valor distinto de cero.
Creo que asumí que este era el caso, pero aún así el límite superior es de solo 295 mV, mientras que el circuito funciona con 5v. ¿Sabes por qué es eso? Solo quiero obtener niveles lógicos, por lo que la lógica baja <0.3 V y la lógica alta> 2.7 V serán suficientes. ¿Qué debo hacer para lograr eso?
Esa no es una forma de onda PWM normal, sino una señal de control "PWM" para un servo de hobby. Un filtro de paso bajo muy por debajo de la velocidad de fotogramas (como 5 Hz) "funcionará" pero dará resultados decepcionantes, como oscilar entre el 5% y el 10% del voltaje del pulso. Necesita algo que pueda distinguir entre pulsos de 1 ms y 2 ms: puede hacerlo con un par de 555 y puertas, o en software en un Arduino.
¿Qué quiere decir con "resultados decepcionantes". Estoy planeando usar el voltaje de CC de salida para encender y apagar un transistor
El voltaje promedio que debe dar su filtro para un pulso de 1 ms es 5 V * 1/20 = 0,25 V. Para un pulso de 2 ms es 5 V para 2/20 = 0,5 V.
Gracias @Transistor, creo que ahora entiendo el cálculo básico. Sin embargo, requiero que mi circuito emita valores lógicos bajos y altos donde el bajo es menor a 0.3V y el alto mayor a 2.7V. ¿Hay alguna forma de amplificar la salida o controlar el transistor de voltaje base específico para lograr lo que estoy tratando de hacer? ¿Hay alguna manera básicamente?
Hay una respuesta que muestra cómo hacerlo. También puede comprar tales interruptores RC listos para usar.
Me encantaría un enlace a un interruptor listo para usar, por favor, señor.
¡Use un servoaccionador para accionar un interruptor de palanca!
Es posible que desee buscar en Google 'salida digital del interruptor rc'. No es tan divertido como construir uno propio, por supuesto, y ni mucho menos tan divertido como lo que propone @Transistor.
¿Hay alguna manera de que pueda copiar este esquema publicado en mi propio esquema de pcb y usar los componentes allí? Estoy planeando aplicar ingeniería inversa al interruptor después de pedir uno. es robar??
¿Por qué esperabas que fuera 0V o 5V? Los electrones están haciendo exactamente lo que les dijiste.

Respuestas (3)

Desde el enlace en el diagrama, supongo que está usando un microcontrolador, ¿posiblemente un Arduino?

En ese caso, conectaría la entrada PWM a un pin de interrupción y usaría la interrupción de cambio de pin para activar una rutina de servicio de interrupción (ISR) para medir el tiempo de activación del pulso. El ISR establecería/restablecería una bandera para indicar si era 1 ms o 2 ms.

Actualmente estoy manejando la situación exactamente como lo describiste. Sin embargo, en realidad estoy diseñando este circuito como un microcontrolador a prueba de fallas. Sé que los microcontroladores son confiables, pero tengo un software que puede bloquear el hilo principal. Estoy depurando esos problemas, pero aún quiero resolver este problema en particular independientemente del microcontrolador. Pero gracias por tu respuesta.
Parece que es posible que desee considerar el uso del temporizador de vigilancia de la MCU.

¿Saben por qué no funcionó y qué puedo hacer para mejorar?

El filtro solo puede promediar su señal en un valor de CC. Si conecta directamente un multímetro de voltaje de CC a su señal pulsante, obtendrá exactamente el mismo valor de CC.

En otras palabras, el filtro no está aportando magia a la fiesta.

Si desea hacerlo de manera más efectiva, puede usar un circuito monoestable. El monoestable se activaría por el flanco ascendente positivo de su señal de control de servo digital. Produciría un pulso de duración de alrededor de 1,5 ms (es decir, se agotaría el tiempo de espera a mitad de camino entre los dos tiempos de nivel lógico).

Y, cuando ese pulso se agote, usaría ese evento para muestrear la señal de control del servo digital. Probablemente usaría un flip-flop tipo D para esto y la salida se resolvería en un 0 o un 1 que representa el nivel lógico detrás de la salida de la señal de control del servo digital.

Así es como lo haría de todos modos.

Puede usar un comparador después de que su señal filtrada haga la salida lógica, pero luego hay otras cosas a considerar, como cuánta histéresis se necesita, cuánto filtrado RC se necesita y cuánto tiempo de retraso se puede tolerar debido al filtro. El monoestable/flip-flop resolverá el valor digital en un ciclo (20 ms) como máximo.

Gracias por su respuesta señor. Es muy informativo. No lo entiendo actualmente, pero haré mi investigación sobre las cosas que dijiste. Con suerte, lo haré.

Un enfoque de Rube Goldberg (Reino Unido: Heath Robinson) sería diseccionar un servo RC y reemplazar el motor con un optoacoplador de entrada de CC + resistencia en serie, por ejemplo. PC817 + 330 ohmios. Establezca el potenciómetro de retroalimentación en aproximadamente el 50 % del recorrido o (más confiable) reemplácelo con dos resistencias de 2,49 K.

Cuando los pulsos que llegan son inferiores a ~1,5 ms, el servo ASIC intentará impulsar el motor en una dirección y el LED del optoacoplador conducirá. Cuando son superiores a 1,5 ms, el ASIC intentará impulsar el motor en dirección inversa y el LED se bloqueará.

En el extremo receptor, solo necesita una resistencia pullup como 10K.

Es posible que pueda encontrar los servo ASIC como componentes, pero no sé los números de pieza de antemano y aparentemente la mayoría están fabricados por oscuros proveedores chinos.

Soy un principiante, así que solo confirmo. Usted está diciendo que debería desmontar un micro servo y obtener la salida de donde solía estar el motor, de esta manera debería obtener una señal lógica de 5 o 0 v
Sí. Sugiero poner un optoaislador como PC817 con la entrada de LED + resistencia en serie donde estaba el motor. El motor es accionado con un puente H. También es posible que pueda obtener una señal de 0V/5V directamente desde un lado del controlador del motor, pero sugiero algo que debería funcionar la primera vez. Puede medir y ver si necesita el optoaislador. También estará la cuestión de en qué estado entra la salida cuando se pierde la señal, y elegir un lado u otro del controlador del motor puede o no cambiar eso, y puede o no requerir una resistencia pullup o pulldown.