¿Cuál es la forma más sencilla de generar PWM sin un microcontrolador?

¿Cuál es la forma rápida y elegante de generar PWM sin un microcontrolador para controlar un servomotor? Con potenciómetro u otras formas de controlar el ciclo de trabajo con período fijo.

  • perdón por el lío, quiero controlar un servo de hobby.
¿Realmente quiere decir controlar un motor como parte de un sistema de control de servo, o está preguntando sobre el control de un "servo de afición"? Ver adición a mi respuesta.
¿Por qué quieres PWM? PWM es a menudo solo una forma en que un micro se aproxima a una función de control analógico. Si lo que realmente desea es un voltaje o corriente analógicos, probablemente haya formas mucho mejores de hacerlo.
@ThePhoton Si está controlando un servo de hobby, PWM es lo que se requiere como señal de control.
Si elimina el requisito de período fijo, un oscilador delta-sigma sería una solución muy simple. He visto implementaciones con un solo opamp y un puñado de resistencias/condensadores. Esto supone que no estás hablando de RC-servo.
@jippie - ¿Qué es un oscilador delta-sigma? Sé que un ADC delta-sigma necesita un oscilador, pero siempre supuse que era algo común, ya que en realidad no es parte del convertidor en sí.
Francamente, la restricción de no usar un micro es una tontería. Un micro es definitivamente la forma más fácil y pequeña de resolver este problema. Un PIC 10F220 puede hacer esto. Todo lo que necesita es la olla, el 10F220 que viene en el paquete SOT-23 y una tapa de derivación. Dos partes y solo unos pocos mm cuadrados para hacer un convertidor de pulso de pot a servo hobby. Un micro es solo otro chip. Una vez que haya terminado, píntelo de negro y póngalo en una caja y nadie sabrá ni tendrá que preocuparse por lo que hay dentro.
@Olin: ¡esa habría sido mi respuesta, si se permitieran los microcontroladores! Y con el ATTiny5 en lugar del PIC, por supuesto :-)
Se pueden encontrar circuitos muy simples basados ​​en 555 en cualquiera de los primeros 4 hits para "555 servo" (no escuché más allá del 4to).
@Wouter - Vamos, Wouter, nos lo estás estropeando... ;-)
@stevenh - Me encantan los uControllers, pero el 555 es una leyenda (más que el 709 o el 741, tal vez el 723 se le acerca). Un día quiero construir una CPU usando 555 555 chips. La investigación preliminar muestra que esto es una locura pero aún es factible.
@Wouter: cuando estaba en la universidad, mi hermano y yo diseñamos planes para hacer una CPU mecánica, usando pequeñas bolas de metal para los bits. Nunca se construyó...
@stevenvh: lo siento, fue un error tipográfico que pensé que había corregido. Me refiero a un modulador delta-sigma . La en.wikipedia.org/wiki/Delta-sigma_modulation parece un poco complicada, pero en la práctica puede ser un circuito bastante sencillo.

Respuestas (5)

Recomiendo el (¡GASP!) 555 Timer en modo "astable" . Encontrarás todo lo que necesitas en el enlace, ¡pero los copié aquí solo para ti!

El modo Astable le brinda una frecuencia PWM variable y también permite un ciclo de trabajo ajustable (ecuaciones de tiempo alto y tiempo bajo en el enlace).

El circuito:

555 Temporizador, modo astable

Nota: Agregaría una tapa electrolítica a través de Vcc (cable positivo) y GND (cable negativo) para reducir el efecto de las caídas en el voltaje de la fuente de alimentación.

La frecuencia PWM:

Frecuencia de salida del temporizador 555 en modo astable

Alguna defensa de mi respuesta en comparación con otras en esta publicación. La mayoría de las otras respuestas requieren una forma de onda intermedia para generar una señal PWM variable, como el método de comparación/onda triangular común. No veo mucho sentido en construir un generador de ondas triangulares (un circuito significativo en sí mismo) solo como un paso intermedio para resolver su problema.

El 555 es un gran chip analógico y hace justo lo que necesitas. Ojalá la gente no los odiara tanto.

Me gustan los 555, pero creo que @supercat tiene razón en que un solo 555 no podrá darte una señal de frecuencia fija y relación de trabajo variable. C se carga a través de R1+R2 y se descarga a través de R2. Si aumenta R2, aumentará los tiempos de encendido y apagado y, por lo tanto, el período. Si aumenta R1, solo aumenta el tiempo, pero también el período. Si aumenta C, aumentará todos los tiempos, incluido el período. Necesitas dos 555. Uno, en modo astable, que determinará el periodo, disparando un segundo, en modo monoestable, que determinará el duty ratio.
"Encontrarás todo lo que necesitas en el enlace". No. Esa no es la forma correcta de responder. Proporcione los detalles aquí.
No odio el 555, solo deseo que la gente no se refiera a él como la mejor solución para todo . Un solo 555 no es la mejor manera de controlar un servo de hobby.
Un servo de hobby no necesita una señal de frecuencia fija, 20-30 Hz funcionará bien.
Así es como puede tener un tiempo de inactividad más prolongado que el de activación.
@stevenvh No voy a tomarme el tiempo para dibujar el circuito del temporizador 555 y escribir la ecuación para la frecuencia PWM en términos de valores de los componentes cuando ambos están MUY claramente definidos en ese enlace. En ningún foro de Stackexchange, nunca se ha considerado de mala educación "enlazar" a alguien a la respuesta en otro lugar de la web, siempre que se proporcione una explicación simple de lo que dice el enlace. Mencioné el modo del 555 y que proporciona una frecuencia PWM variable. No veo nada malo en mi respuesta.
@Telaclavo - Tienes razón; no puede variar el ciclo de trabajo y mantener constante la frecuencia. Sin embargo, como menciona WoutervanOoijen, no necesita una frecuencia rígidamente fija para ejecutar un servo. Variar el ciclo de trabajo probablemente crea una oscilación del 10-20% (estimación aproximada) en la frecuencia del pulso, lo que debería ser lo suficientemente preciso para la mayoría de los servos. Y, de todos modos, realmente no necesita ajustar el ciclo de trabajo para controlar un servo.
He visto muchas respuestas cortas, dejando el resto en un enlace, eliminado. Las razones se han explicado a menudo: los enlaces mueren y este sitio quiere ser autosuficiente. No debería tener que seguir un enlace, la información debería estar aquí. Copiar una imagen aquí puede hacer ya un mundo de diferencia.
@stevenvh Me avisas cuando muere Wikipedia. Incluso si lo hace, como Dean mostró con su comentario anterior, el 555 es (era) tan omnipresente que sería difícil no encontrar un libro antiguo, un pequeño blog o un sitio web de pasatiempos con información sobre ellos.
Ese no es el punto. No hay forma de saber qué enlaces morirán y cuáles no. Supongamos que nadie es inmune a ella. En el tiempo que dedicaste a publicar tus últimos comentarios podrías haber publicado una imagen. Lo hago en mis respuestas muy a menudo, y del representante me dice que sé que los usuarios lo aprecian mucho. (85 insignias de "buena respuesta")
Ahí tienes @stevenvh. Solo para ti.
Bien. Creo que también debería agregar la ecuación para el ciclo de trabajo, para que los usuarios sepan qué resistencia debe ser un potenciómetro.

Onda triangular. Comparador. Umbral de control. Esa es la forma básica de hacerlo.

Sin embargo, si desea controlar un servo de hobby, esta no es la mejor manera. El ciclo de trabajo varía entre el 5 % y el 10 % (ancho de pulso de 1 ms a 2 ms en un período de 20 ms), que es corto y lo más probable es que desee controlarlo con cierta precisión. En un 5V PAG PAG triángulo hay que variar el umbral del comparador entre 4,5V y 4,75V. Cualquier desviación y no podrá controlar el servo en todo su rango. Eso requiere componentes de precisión. Además, el generador de ondas triangulares necesita 2 amplificadores operacionales, y luego está el comparador. Hay una mejor manera.

ingrese la descripción de la imagen aquí

Primero genere una onda cuadrada de 50Hz. La forma más sencilla:

ingrese la descripción de la imagen aquí

Para el 74HC1G14 a 250k Ω resistencia y un capacitor de 100nF le darán un período de 20ms.

Alimente la onda cuadrada en un MMV (multivibrador monoestable). Puede hacer esto con un LM555 o usar un dispositivo lógico como el 74HC123A . Si usa este último, el tiempo de pulso está definido por R mi X T y C mi X T :

T = R mi X T × C mi X T

Tiempo en m s, R en k Ω , y C en nF.

Para obtener un ancho de pulso que varíe entre 1 ms y 2 ms, use C = 100nF y R = 10k Ω en serie con un 10k Ω potómetro.

Podría haber hecho esto con dos LM555, pero necesitaría más componentes externos.

editar (sobre microcontroladores)
Estoy de acuerdo con Olin (ver comentarios) en que excluir un microcontrolador es miope (Olin dijo "tonto"). Hubo un tiempo en que desarrollar para un microcontrolador era complicado, pero hoy eso ya no es así. También puedes tener una interfaz de programación por unos pocos euros. Entonces, la solución parecería tan fácil que ninguna solución sin controlador puede competir con ella: toma un ATTiny5 (Olin toma un PIC10F220) en un SOT23-6. Conecte un condensador de desacoplamiento a las conexiones de alimentación y el potenciómetro a la entrada del ADC. ¡Eso es! 3 (tres) componentes. Convertir la lectura del ADC en una salida de ancho de pulso es tan fácil que es casi ridículo, incluso para un programador principiante.

Una vez que comience con ellos, encontrará que los microcontroladores a menudo ofrecen una solución más simple y flexible que con otros circuitos integrados o componentes discretos.

una nota
De su otra pregunta, veo que usa microcontroladores. ¿Por qué quieres evitarlos aquí?

¿Cuál es la manera de obtener una onda triangular?
@m.Alin: si quieres un triángulo muy limpio, esta es la forma correcta. Pero la entrada del inversor en mi oscilador también se aproxima a un triángulo, aunque las pendientes son realmente exponenciales.
localmente hablando, 555 es más barato que 74HCT1G14 aquí. +1 por cierto.\
@sandun: ¿también contaste los componentes externos?
Sí, lo hice. Es cierto cuando se trata de un proyecto de hobby especialmente. Hay muchas posibilidades de que 74HCT1G esté completamente ausente en NUESTRO mercado local.
@sandun: la lógica de puerta única se introdujo recientemente, por lo que es posible que aún no haya penetrado en todas partes, especialmente en el mercado de pasatiempos. Se necesitaba una lógica que fuera mucho más pequeña que los dispositivos comunes de 14 o 16 pines. Piense en los teléfonos inteligentes. Muchos dispositivos existen en paquetes de menos de 1 mm 2 .
@stevenvh "Si quieres un triángulo muy limpio, esta es la forma correcta". Según su lógica, esto es completamente inaceptable. Incluya esto en su respuesta muy informativa y completa.
@ kevlar1818 - de acuerdo. Fijado.
@stevenvh Perdón por ser tonto. Uso mucho uC y me pregunto cómo la gente genera PWM antes de que tengamos uC.
@pstan: si sus especificaciones no son demasiado altas, probablemente usaría el circuito 555. Está lejos de ser perfecto: la frecuencia varía con el ciclo de trabajo y el control no es lineal. El generador de triángulos + comparador soluciona esos inconvenientes.

La forma Ye Olde Phashioned de hacer PWM con ciclo de trabajo controlado analógico es comparar la señal de control analógico con una onda triangular. Haces un generador de ondas triangulares que funciona a la frecuencia PWM deseada. Esto se alimenta a la entrada negativa de un comparador y la señal de control analógica a la entrada positiva. El resultado es completamente alto o completamente bajo, pero el ciclo de trabajo es linealmente proporcional a la señal de control. Los primeros amplificadores de audio de clase D funcionaban según este principio, por ejemplo.

En muchos casos, el PWM no necesitaba ser súper lineal, por lo que la onda triangular no tiene que tener bordes perfectamente rectos. Permitirles que sean un poco exponenciales puede simplificar el circuito.

Agregado:

Mark Rages señaló que cuando dice "servomotor", podría estar refiriéndose a los pequeños motores de pasatiempo controlados por posición que se usan en modelos de aviones y similares. Mi respuesta se aplica al control de un motor, suponiendo que tenga un voltaje analógico proporcional a la fuerza con la que desea impulsar el motor. No se aplica a estos "servos de hobby". Esos no están controlados por PWM en el sentido común de ese término, sino por el ancho de los pulsos que generalmente deben ser de 1 a 2 ms repetidos cada 20 a 50 ms aproximadamente. Si esta pregunta es realmente sobre servos de hobby, entonces debería solucionarse para dejarlo claro.

Si bien esto cumple la tarea, es importante tener en cuenta que @pstan quiere controlar un servo, por lo que tener un generador de funciones en su implementación probablemente no sea muy portátil.
Los ciclos de trabajo del servomotor son generalmente bastante bajos, como 10% o menos. Y el servo usa el ancho de pulso directamente, no el valor promedio, por lo que es mejor usar un circuito que desacople el ancho de pulso de la tasa de repetición.
@kevlar: volví a verificar mi respuesta y todavía no veo la mención de un generador de funciones allí. Todo lo que dije fue que necesitas una onda triangular o algo lo suficientemente cerca. Ciertamente no necesita un generador de funciones para hacer uno de esos.
@Markrages: ¿Eh? Los motores ven el promedio de un tren de pulsos si es lo suficientemente rápido. Unos pocos 100 Hz son lo suficientemente buenos en ese sentido para la mayoría de los motores. La parte del servo se logra mediante el esquema de control, sobre el cual el OP no preguntó. Parece que ya tiene un nivel analógico proporcional a la fuerza con la que se acciona el motor.
@Markrages: Se me acaba de ocurrir que estás hablando de servos de hobby, que quieren un pulso de 1-2 ms cada 20 ms más o menos. Su comentario tiene sentido en ese sentido, pero el OP no mencionó en absoluto los servos de hobby.
@OlinLathrop El OP dijo especialmente "servo", y seguramente puede asumir que alguien que hace una pregunta como esa es un aficionado, por lo que probablemente pueda poner hobby delante del nombre del servo.
@OlinLathrop Hice una suposición sobre los servos de hobby. Sería mejor pedir aclaraciones cuando "servo" se usa solo.
@Kellen: En realidad, no se me ocurrió nada hasta el comentario de Mark. "Servo" tiene un significado en ingeniería eléctrica, que se relaciona con un sistema de control. Me doy cuenta de que algunos motores de pasatiempo con servocontrol incorporado se denominan incorrectamente "servomotores", pero eso no es lo primero que pienso. La gente necesita usar el término correcto.
"no están controlados por PWM en el sentido común". ¿Cómo es diferente? Es solo el rango de control que está limitado a un ciclo de trabajo del 5% al ​​10%. No es PPM, por ejemplo.
@steven: puede argumentar que los servos de pasatiempo requieren PWM, pero generalmente cuando habla de PWM, el nivel promedio de la señal es la parte significativa. En los servos de hobby, solo el ancho del pulso positivo es significativo. El ancho de pulso negativo puede variar ampliamente y no tiene efecto mientras esté dentro de algún rango.
Sí, vi "20 a 50 ms más o menos" en su respuesta. Leí que 20 ms es un valor típico (¿recomendado?). No sé cómo se ve el circuito dentro de un servo, así que no tengo idea de lo que tolera. Pero tiene razón, si el período puede variar tanto, no es PWM adecuado.
@OlinLathrop y, sin embargo, una búsqueda en Google de "Servo" arroja toneladas de resultados y recomendaciones de productos para el llamado "servo de pasatiempo". Tal como dije en mi meta respuesta, no debemos limitar los términos que usan las personas si son términos comunes. Puede que no creas que es el término adecuado, pero Google parece pensar que se usa comúnmente. meta.electronics.stackexchange.com/a/1139/319

La forma más sencilla de generar una señal PWM es alimentar una onda de diente de sierra o una onda triangular en una entrada de un comparador analógico y un voltaje de control en la otra. Si no se puede obtener una onda triangular pura, se puede aproximar razonablemente a una pasando una onda cuadrada a través de un filtro RC de modo que la salida del filtro oscile entre aproximadamente 1/4VDD y 3/4VDD, y luego escalando el voltaje de control en el comparador de modo que el voltaje de control que debería producir un ciclo de trabajo del 0,01 % se traducirá al voltaje más bajo de la onda cuadrada filtrada, y el voltaje de control que debería producir un ciclo de trabajo del 99,99 % se traducirá al voltaje más alto de la onda filtrada ola cuadrada. Esto producirá un ancho de pulso que no es del todo linealmente proporcional a la amplitud, pero es lo suficientemente cercano para muchos propósitos.

Y esto es exactamente lo que hace el circuito NE555 propuesto por kevlar1818...
@CeesMeijer: El cartel pedía un ciclo de trabajo variable y un período fijo. No conozco ninguna forma de usar un solo 555 para convertir un voltaje de control en una onda de ciclo de trabajo variable de frecuencia fija. Sin embargo, podría servir muy bien para generar una onda triangular para alimentar un comparador.
Han pasado 20 años desde que construí este circuito, así que tuve que buscarlo. Y de hecho tienes razón. Usé un disparador externo para obtener una frecuencia constante. Sin embargo, podría usar un segundo 555 para eso.

Recomiendo usar un IC de control de fuente de alimentación de bajo voltaje (BiCMOS) como el UCC3803 . La frecuencia de funcionamiento se puede configurar fácilmente con un simple R y C, y el control del ciclo de trabajo se realiza fácilmente con un potenciómetro. Funcionará en un carril de 5V.

extracto de la hoja de datos TI UC3842

El UCC3803 es compatible con pines con la serie UCx84x de controladores PWM. Si desea hacer un PWM fácil, puede usar el esquema anterior, omitiendo R1, el 2N2222 y el potenciómetro de ajuste ISENSE de 5k (solo ate el pin 3 a tierra). Probablemente también pueda omitir las dos resistencias de 4.7k en serie con el potenciómetro de ajuste de amplificador de error e ir directamente a Vref y Gnd, o usar un divisor de voltaje explícito si no es necesario el ajuste. (No especificó si necesita cambiar fácilmente el ciclo de trabajo).

El IC es capaz de conducir alrededor de 1A de corriente. (Si su servomotor tiene una entrada PWM, este es un punto discutible).

"puede necesitar un controlador externo para alimentar el motor". ¿Está seguro? Siempre pensé que la entrada PWM es solo un nivel de señal de baja corriente. Para poder un servo tiene una tercera conexión.
Además, solo recuerdo que el ciclo de trabajo es solo del 5 al 10%. Esa puede ser la forma correcta de suministrar energía.
Esto es bonito. Pero todavía cuenta con muchos componentes externos.
Se parece más a un UEMIG: Generador EMI innecesario. :-(
También parece necesitar una entrada mínima de 10V. Tal vez no sea la mejor opción...
@stevenvh OP no especificó nada sobre su motor: PWM, rango de voltaje de entrada, nada. Mi solución no es más que una manera fácil de hacer una salida PWM ajustable que se usa en millones de fuentes de alimentación conmutadas.
En primer lugar, agradezco que piense fuera de la caja para encontrar soluciones originales. Pero OP agregó que es para un servo de pasatiempo, y si aún no lo sabía, puede leer en las otras respuestas qué tipo de señal necesitan. Dudo que esta sea una muy buena solución.
@stevenvh El OP debe ser explícito con sus requisitos (voltios y PWM), esa no debería ser la carga de los respondedores. He revisado mi respuesta para que sea compatible con un motor (supuesto) de 5V.