1 votos

No se ha utilizado un filtro de paso bajo para convertir la entrada PWM en salida digital

Quiero convertir una señal de control de un servo en una salida digital de 5V o 0V.

Este es el formato de mi señal PWM:

enter image description here

La diferencia es que mi ancho de pulso de entrada será de 1ms (mínimo) o 2ms (máximo). Sólo 1 o 2.

He intentado crear un circuito que haga esto:

enter image description here

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ó. Esperaba esto:

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

¿Sabéis por qué no ha funcionado y qué puedo hacer para mejorarlo?

0 votos

Su filtro le da más o menos la media de su señal. La media 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 sigue dando un valor distinto de cero.

0 votos

Creo que asumí que este era el caso, pero aún así el límite superior es de sólo 295 mV mientras el circuito es alimentado por 5v. ¿Sabe usted por qué es eso? Sólo quiero conseguir niveles lógicos para que la lógica baja < 0,3 V y la lógica alta > 2,7 V sea suficiente. ¿Qué debo hacer para conseguirlo?

2 votos

No se trata de una forma de onda PWM normal, sino de una señal de control "PWM" para un servo de aficionado. Un filtro de paso bajo muy por debajo de la frecuencia de cuadro (como 5 Hz) "funcionará" pero dará resultados decepcionantes, como oscilar entre el 5% y el 10% de la tensión del pulso. Necesitas algo que pueda distinguir entre pulsos de 1 ms y 2 ms : podrías hacerlo con un par de 555s y puertas, o en software en un Arduino.

2voto

ianb Puntos 659

¿Sabéis por qué no ha funcionado y qué puedo hacer para mejorar?

El filtro sólo puede promediar su señal en un valor DC. Si conectaras directamente un multímetro de tensión continua a tu señal pulsante, obtendrías exactamente el mismo valor de CC.

$$\boxed{\text{In other words, the filter isn't bringing any magic to the party}}$$

Si quieres hacerlo de forma más efectiva podrías utilizar un circuito monoestable. El monoestable se activaría con el flanco ascendente positivo de tu señal de control del servo digital. Producirá un pulso de duración de alrededor de 1,5 ms (es decir, se agotará a mitad de camino entre los dos tiempos de nivel lógico).

Y, cuando ese pulso se agote, utilizarías ese evento para muestrear la señal digital de control del servo. Es probable que utilice un flip-flop de tipo D para esto y la salida se resolvería a 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 yo lo haría de todos modos.

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

0 votos

Gracias por su respuesta, señor. Es muy informativa. Actualmente no lo entiendo, pero voy a investigar sobre lo que ha dicho. Espero poder hacerlo.

2voto

Desde el enlace en el diagrama, supongo que está utilizando un microcontrolador, posiblemente un Arduino.

En ese caso, conectaría la entrada PWM a un pin de interrupción y utilizaría la interrupción de cambio de pin para activar una Rutina de Servicio de Interrupción (ISR) para medir el tiempo de encendido del pulso. La ISR establecería/restablecería una bandera para indicar si fue 1 ms o 2 ms.

0 votos

Actualmente estoy manejando la situación exactamente como la has descrito. Sin embargo, en realidad estoy diseñando este circuito como un tipo de seguridad del microcontrolador. Sé que los microcontroladores son fiables pero tengo algunos problemas de software que pueden atascar el hilo principal. Estoy depurando esos problemas, pero todavía quiero resolver este problema particular independiente del microcontrolador. Pero gracias por su respuesta.

0 votos

Parece que puedes buscar el uso del temporizador de vigilancia de la MCU.

1voto

Spehro Pefhany Puntos 90994

Un enfoque de Rube Goldberg (Reino Unido: Heath Robinson) sería diseccionar un servo RC y sustituir el motor por un optoacoplador de entrada DC + resistencia en serie, por ejemplo, PC817 + 330 ohmios. Poner el potenciómetro de realimentación a aproximadamente el 50% del recorrido o (más fiable) sustituirlo por dos resistencias de 2,49K.

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

En el extremo receptor sólo necesitas una resistencia pullup como la de 10K.

Es posible que puedas encontrar los ASICs de los servos como componentes, pero no conozco los números de parte de antemano y la mayoría son aparentemente hechos por oscuros proveedores chinos.

0 votos

Soy un principiante, así que sólo estoy confirmando. Dices que debo desmontar un micro servo y obtener la salida de donde estaba el motor, de esta manera debería obtener una señal lógica de 5 o 0 v

0 votos

Sí. Sugiero poner un optoaislador como el PC817 con la entrada del LED + la resistencia en serie donde estaba el motor. El motor se acciona con un puente H. También podrías obtener una señal de 0V/5V por un lado del driver del motor, pero estoy sugiriendo algo que debería funcionar a la primera. Puedes medir y ver si necesitas el optoaislador. También estará la cuestión de qué estado pasa la salida cuando se pierde la señal, y elegir un lado o el otro del controlador del motor puede o no cambiar eso, y puede o no requerir una resistencia de pullup o pulldown.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X