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
PWMque controladest(unPinen las cámaras OpenMV). Los argumentos por palabra clave equivalen a llamar ainit()inmediatamente después de la construcción:freq– frecuencia del PWM en Hz.duty_u16– ciclo de trabajo como una proporciónduty_u16 / 65535.duty_ns– ancho de pulso en nanosegundos.invert– si esTrue, invierte la polaridad de la salida.
Como máximo se puede pasar uno de
duty_u16/duty_nsa la vez. Establecerfreqpuede afectar a otras instancias dePWMque 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.
- 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 lanzarValueErrorsi 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
0–65535.Sin argumento, devuelve el ciclo de trabajo actual.
Con un único argumento
value, establece el ciclo de trabajo envalue / 65535del periodo.0siempre es bajo,65535siempre 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 envaluenanosegundos. Ú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_u16resultan 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
PWMdel mismo TIM comparten una frecuencia. Establecerfreq()en una instancia cambia la salida de todos los demás canales conectados a ese TIM.