clase PWM – modulación por ancho de pulso

La clase PWM emite una señal modulada por ancho de pulso en un Pin. Es la API moderna y multiplataforma para PWM; en las cámaras OpenMV STM32 envuelve la maquinaria subyacente de canales de pyb.Timer, por lo que cada instancia de PWM ocupa un canal de temporizador.

Ejemplo de uso:

from machine import PWM, Pin

# 50 Hz PWM on a header pin with a 12.5 % duty.
pwm = PWM(Pin("P7"), freq=50, duty_u16=8192)

pwm.duty_u16(32768)            # change duty to 50 %
pwm.init(freq=5000, duty_ns=5000)  # re-init at 5 kHz, 5 us pulse
pwm.duty_ns(3000)              # 3 us pulse

pwm.deinit()

Constructores

class machine.PWM(dest: Pin | int, *, freq: int | None = None, duty_u16: int | None = None, duty_ns: int | None = None, invert: bool = False)

Construye un objeto PWM que controla dest (un Pin en las cámaras OpenMV). Los argumentos por palabra clave equivalen a llamar a init() inmediatamente después de la construcción:

  • freq – frecuencia del PWM en Hz.

  • duty_u16 – ciclo de trabajo como una proporción duty_u16 / 65535.

  • duty_ns – ancho de pulso en nanosegundos.

  • invert – si es True, invierte la polaridad de la salida.

Como máximo se puede pasar uno de duty_u16 / duty_ns a la vez. Establecer freq puede afectar a otras instancias de PWM que compartan el mismo temporizador subyacente (cierto en STM32: todos los canales de un mismo TIM funcionan a la misma frecuencia).

Métodos

init(*, freq: int | None = None, duty_u16: int | None = None, duty_ns: int | None = None) None

Reconfigura la salida PWM. Solo se actualizan los argumentos proporcionados; los demás conservan sus valores previos. Consulta el constructor para conocer el significado de cada argumento.

deinit() None

Deshabilita la salida PWM y libera el canal de temporizador que ocupaba.

freq() int
freq(value: int, /) None

Obtiene o establece la frecuencia del PWM.

Sin argumento, devuelve la frecuencia actual en Hz.

Con un único argumento value, establece la frecuencia en ese valor en Hz. Puede lanzar ValueError si la frecuencia está fuera del rango alcanzable por el temporizador subyacente.

duty_u16() int
duty_u16(value: int, /) None

Obtiene o establece el ciclo de trabajo como un valor de 16 bits sin signo en el rango 065535.

Sin argumento, devuelve el ciclo de trabajo actual.

Con un único argumento value, establece el ciclo de trabajo en value / 65535 del periodo. 0 siempre es bajo, 65535 siempre es alto.

duty_ns() int
duty_ns(value: int, /) None

Obtiene o establece el ancho de pulso directamente en nanosegundos.

Sin argumento, devuelve el ancho de pulso actual.

Con un único argumento value, establece el tiempo en alto de cada ciclo en value nanosegundos. Útil para salidas de tipo servo, donde el ancho de pulso es la magnitud relevante en lugar de la proporción del ciclo de trabajo.

Limitaciones

  • La frecuencia del PWM y la resolución del ciclo de trabajo son interdependientes en todos los temporizadores de hardware: a frecuencias altas, caben menos pasos del contador en un periodo y, por tanto, menos bits bajos de duty_u16 resultan significativos.

  • La frecuencia de PWM alcanzable depende de la fuente de reloj y del divisor (prescaler) del temporizador. Los STM32 TIM2 / TIM5 son de 32 bits en la mayoría de los chips (y también TIM3 / TIM4 en el STM32N6), lo que ofrece rangos más amplios de frecuencia y ciclo de trabajo; los temporizadores restantes son de 16 bits. Consulta el manual de referencia del MCU correspondiente para conocer los rangos exactos.

  • En STM32, varios canales PWM del mismo TIM comparten una frecuencia. Establecer freq() en una instancia cambia la salida de todos los demás canales conectados a ese TIM.