3 votos

¿Cómo hacer PWM con el menor ripple en software?

Estoy interesado en generar una señal PWM por software en un micro (no es posible utilizar PWM por hardware en este caso). Es simple usar (por ejemplo) un bucle con un contador que cuenta hasta 255 y se envuelve, y transiciones alto-bajo cuando el contador llega a N y bajo-alto cuando se envuelve, para un pulso N de 255.

Sin embargo, debido a que este PWM es bastante lento, me gustaría suavizarlo, de la siguiente manera: si la salida es (por ejemplo) alta durante 2 de 255 cuentas, me gustaría que la salida fuera alta durante la cuenta 0 y 127, no la 0 y la 1. Si la salida es 127 de 255, me gustaría que la transición fuera alta-alta y alta-baja en cada cuenta, en lugar de permanecer alta durante los primeros 127 y baja durante los últimos 128.

En otras palabras, las bajas y las altas deben estar lo más repartidas posible. Me doy cuenta de que cuando el PWM está cerca de cualquiera de los extremos del rango todavía tendría una gran ondulación, pero esto reducirá mucho la ondulación cerca del medio del rango. ¿Cómo hacer esto de una manera eficiente?

EDITAR: Parece que he redescubierto Modulación de la densidad de impulsos . Todavía no estoy seguro de cómo hacer esto en la práctica, especialmente en un bucle rápido.

5voto

Glauco Vinicius Puntos 270

El siguiente algoritmo hará lo que usted desea:

period = 256;
on_time = 34; // Or whatever you want
off_time = period-on_time;
count = 0;
while (1);
{
    if (count >= 0) {
        count -= off_time;
        output_high();
    } else {
        count += on_time;
        output_low();
    }
    wait_for_next_cycle();
}

Hice algo así para generar un reloj de muestreo de 44100 Hz con una relación no simple a partir del reloj maestro, pero tu pregunta me motivó a generalizarlo, gracias.

4voto

user4245 Puntos 324

Lo que describes, si lo piensas un momento, es bastante sencillo. Mientras que normalmente en PWM mantienes la misma frecuencia pero varías el ancho de pulso, lo que estás describiendo es efectivamente mantener el ancho de pulso igual pero variar la frecuencia.

Para un ciclo de trabajo de 1/256 tienes un pulso cada 256 cuentas.

Para un ciclo de trabajo de 2/256 tienes dos pulsos (tradicionalmente unidos en un pulso de 2x de ancho) cada 256 cuentas.

2/256 puede reducirse a 1/128 (matemáticas sencillas, ¿no?), por lo que 2 pulsos cada 256 es lo mismo que 1 pulso cada 128 cuentas.

128/256 (50% de servicio) puede reducirse a 1/2, que es un pulso cada 2 cuentas, o una onda cuadrada rápida de encendido y apagado.

Así que mantén tu ancho de pulso en sólo 1 cuenta (enciéndelo en 0 y apágalo en 1) y sólo cambia el valor hasta el que estás contando.

3voto

silverbolt Puntos 18

Parece que quieres un modulador delta-sigma en lugar de un PWM "normal". Un modulador delta-sigma emite una salida modulada por densidad de impulsos, desplazando el ruido principalmente a las frecuencias altas para que sea más fácil de filtrar. Por lo general, esto se hace con hardware dedicado para obtener una tasa de salida muy alta, aunque supongo que no hay ninguna razón por la que no se pueda construir uno en software.

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