classe PWM – modulação por largura de pulso

A classe PWM emite um sinal modulado por largura de pulso em um Pin. É a API moderna e multiplataforma para PWM; em câmeras OpenMV STM32 ela encapsula a maquinaria de canais subjacente de pyb.Timer, de modo que cada instância de PWM ocupa um canal de timer.

Exemplo 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()

Construtores

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

Constrói um objeto PWM controlando dest (um Pin em câmeras OpenMV). Os argumentos por palavra-chave são equivalentes a chamar init() imediatamente após a construção:

  • freq – frequência do PWM em Hz.

  • duty_u16 – ciclo de trabalho como a razão duty_u16 / 65535.

  • duty_ns – largura de pulso em nanossegundos.

  • invert – se True, inverte a polaridade da saída.

No máximo um entre duty_u16 / duty_ns pode ser passado de cada vez. Definir freq pode afetar outras instâncias de PWM que compartilham o mesmo timer subjacente (verdadeiro no STM32 – cada canal de um dado TIM funciona na mesma frequência).

Métodos

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

Reconfigura a saída do PWM. Apenas os argumentos fornecidos são atualizados; os demais mantêm seus valores anteriores. Veja o construtor para o significado de cada argumento.

deinit() None

Desabilita a saída do PWM e libera o canal de timer que ele ocupava.

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

Obtém ou define a frequência do PWM.

Sem argumento, retorna a frequência atual em Hz.

Com um único argumento value, define a frequência para esse valor em Hz. Pode levantar ValueError se a frequência estiver fora da faixa alcançável pelo timer subjacente.

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

Obtém ou define o ciclo de trabalho como um valor de 16 bits sem sinal na faixa 065535.

Sem argumento, retorna o ciclo de trabalho atual.

Com um único argumento value, define o ciclo de trabalho para value / 65535 do período. 0 é sempre baixo, 65535 é sempre alto.

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

Obtém ou define a largura de pulso diretamente em nanossegundos.

Sem argumento, retorna a largura de pulso atual.

Com um único argumento value, define o tempo alto de cada ciclo para value nanossegundos. Útil para saídas estilo servo, onde a largura de pulso é a quantidade significativa, em vez da razão do ciclo de trabalho.

Limitações

  • A frequência do PWM e a resolução do ciclo de trabalho são interdependentes em todo timer de hardware: em frequências altas, menos passos do contador cabem em um período e, portanto, menos bits baixos de duty_u16 são significativos.

  • A frequência de PWM alcançável depende da fonte de clock do timer e do prescaler. STM32 TIM2 / TIM5 são de 32 bits na maioria das peças (e TIM3 / TIM4 também no STM32N6), oferecendo faixas mais amplas de frequência e ciclo de trabalho; os demais timers são de 16 bits. Veja o manual de referência do MCU correspondente para as faixas exatas.

  • No STM32, vários canais PWM no mesmo TIM compartilham uma frequência. Definir freq() em uma instância altera a saída de todos os outros canais conectados a esse TIM.