class PWM – pulsbreedtemodulatie

De PWM-klasse geeft een pulsbreedte-gemoduleerd signaal uit op een Pin. Het is de moderne, port-overschrijdende API voor PWM; op STM32 OpenMV-cams omhult het de onderliggende pyb.Timer-kanaalmachinerie, zodat elke PWM-instantie één timerkanaal bezet.

Voorbeeldgebruik:

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

Constructors

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

Construeer een PWM-object dat dest aanstuurt (een Pin op OpenMV-cams). De keyword-argumenten zijn equivalent aan het aanroepen van init() direct na de constructie:

  • freq – PWM-frequentie in Hz.

  • duty_u16 – duty cycle als de verhouding duty_u16 / 65535.

  • duty_ns – pulsbreedte in nanoseconden.

  • invert – indien True, keer de uitvoerpolariteit om.

Er mag hooguit één van duty_u16 / duty_ns tegelijk worden doorgegeven. Het instellen van freq kan andere PWM-instanties beïnvloeden die dezelfde onderliggende timer delen (geldt op STM32 – elk kanaal van een gegeven TIM draait op dezelfde frequentie).

Methoden

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

Herconfigureer de PWM-uitvoer. Alleen de meegeleverde argumenten worden bijgewerkt; de andere behouden hun vorige waarden. Zie de constructor voor de betekenis van elk argument.

deinit() None

Schakel de PWM-uitvoer uit en geef het timerkanaal vrij dat het bezette.

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

Lees of stel de PWM-frequentie in.

Zonder argument wordt de huidige frequentie in Hz teruggegeven.

Met een enkel value-argument wordt de frequentie op die waarde in Hz ingesteld. Kan een ValueError opwerpen als de frequentie buiten het bereik valt dat de onderliggende timer kan bereiken.

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

Lees of stel de duty cycle in als een unsigned 16-bits waarde in het bereik 065535.

Zonder argument wordt de huidige duty teruggegeven.

Met een enkel value-argument wordt de duty cycle op value / 65535 van de periode ingesteld. 0 is altijd laag, 65535 is altijd hoog.

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

Lees of stel de pulsbreedte rechtstreeks in nanoseconden in.

Zonder argument wordt de huidige pulsbreedte teruggegeven.

Met een enkel value-argument wordt de hoog-tijd van elke cyclus ingesteld op value nanoseconden. Nuttig voor servo-achtige uitvoer waarbij de pulsbreedte de betekenisvolle grootheid is in plaats van de duty-verhouding.

Beperkingen

  • PWM-frequentie en duty-resolutie zijn op elke hardwaretimer onderling afhankelijk: bij hoge frequenties passen er minder tellerstappen in een periode en zijn er dus minder lage bits van duty_u16 betekenisvol.

  • De haalbare PWM-frequentie hangt af van de klokbron en prescaler van de timer. STM32 TIM2 / TIM5 zijn op de meeste onderdelen 32-bits (en TIM3 / TIM4 eveneens op de STM32N6), wat bredere frequentie- en duty-bereiken geeft; de overige timers zijn 16-bits. Zie de relevante MCU-referentiehandleiding voor de exacte bereiken.

  • Op STM32 delen meerdere PWM-kanalen op dezelfde TIM een frequentie. Het instellen van freq() op één instantie verandert de uitvoer van elk ander kanaal dat aan die TIM is gekoppeld.