classe PWM – modulação por largura de pulso

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

Exemplo de utilização:

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 que controla dest (um Pin em câmaras OpenMV). Os argumentos por palavra-chave são equivalentes a chamar init() imediatamente após a construção:

  • freq – frequência PWM em Hz.

  • duty_u16 – ciclo de trabalho como rácio duty_u16 / 65535.

  • duty_ns – largura de pulso em nanossegundos.

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

No máximo um de duty_u16 / duty_ns pode ser passado de cada vez. Definir freq pode afetar outras instâncias de PWM que partilham o mesmo temporizador subjacente (verdadeiro em STM32 – todos os canais de um determinado TIM funcionam à 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 PWM. Apenas os argumentos fornecidos são atualizados; os restantes retêm os seus valores anteriores. Consulte o construtor para o significado de cada argumento.

deinit() None

Desativa a saída PWM e liberta o canal do temporizador que ocupava.

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

Obtém ou define a frequência 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 lançar ValueError se a frequência estiver fora do intervalo atingível pelo temporizador subjacente.

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

Obtém ou define o ciclo de trabalho como um valor sem sinal de 16 bits no intervalo 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 no estilo servo, onde a largura de pulso é a grandeza significativa em vez do rácio de ciclo de trabalho.

Limitações

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

  • A frequência PWM atingível depende da fonte de relógio e do prescaler do temporizador. Os TIM2 / TIM5 do STM32 são de 32 bits na maioria das variantes (e também TIM3 / TIM4 no STM32N6), proporcionando intervalos mais amplos de frequência e ciclo de trabalho; os temporizadores restantes são de 16 bits. Consulte o manual de referência do MCU relevante para os intervalos exatos.

  • Em STM32, múltiplos canais PWM no mesmo TIM partilham uma frequência. Definir freq() numa instância altera a saída de todos os outros canais associados a esse TIM.