Jak definovat frekvenci PWM v Klipperu?

TL;DR: V Klipperu je frekvence PWM nastavována nepřímo přes parametr cycle time (doba cyklu). Frekvence je 1 / cycle_time. Přesná konfigurační volba závisí na tom, co ovládáte.

Který konfigurační parametr použít

Klipper nemá jedinou volbu pwm_frequency. Místo toho konfigurujete periodu jednoho PWM cyklu a Klipper z toho odvodí frekvenci.

Ventilátory a výstupní piny: cycle_time

Pro ventilátory, generické výstupní piny, LED kanály a podobné použijte cycle_time:

example.ini
[fan]
pin: PA8
cycle_time: 0.010
hardware_pwm: False
  • Výchozí pro [fan]: 0.010 s → 100 Hz.
  • Výchozí pro [output_pin]: 0.100 s → 10 Hz.
  • Výchozí pro [neopixel] / [dotstar] LED kanály: 0.010 s → 100 Hz.

Parametr je dokumentován v docs/Config_Reference.md pro [fan] (řádky 3239-3242) a [output_pin] (řádky 3678-3681).

Topení: pwm_cycle_time

Pro topení (extruder, vyhřívaná podložka atd.) se parametr nazývá pwm_cycle_time:

example.ini
[extruder]
heater_pin: PA2
pwm_cycle_time: 0.100
  • Výchozí: 0.100 s → 10 Hz.
  • Dokumentace uvádí, že “nedoporučuje se to nastavovat, pokud neexistuje elektrický požadavek na přepínání topení rychleji než 10x za sekundu” (Config_Reference.md).

Doba cyklu konfigurovatelná za běhu: [pwm_cycle_time]

Pokud potřebujete změnit dobu PWM cyklu za běhu přes G-code, použijte sekci [pwm_cycle_time]:

example.ini
[pwm_cycle_time my_pin]
pin: PB0

Pak za běhu:

example.txt
SET_PIN PIN=my_pin VALUE=0.5 CYCLE_TIME=0.001

To je dokumentováno v docs/Config_Reference.md a implementováno v klippy/extras/pwm_cycle_time.py.

Jak je hodnota použita interně

V klippy/mcu.py třída MCU_pwm převádí dobu cyklu na tiky MCU hodin:

example.py
cycle_ticks = self._mcu.seconds_to_clock(self._cycle_time)

Pro softwarový PWM se to stává argumentem cycle_ticks funkce set_digital_out_pwm_cycle (řádek 488), a doba zapnutí v každém cyklu je plánována ve stejných jednotkách tiků. Pro hardwarový PWM je stejná hodnota cycle_ticks předána platformě specifické gpio_pwm_setup(), která pak zvolí prescaler a periodu časovače, které ji nejlépe odpovídají.

Varování pro hardwarový PWM: skutečná frekvence se může lišit

Když je nastaveno hardware_pwm: True, frekvence, kterou požadujete, je pouze cílem. Periferie časovače MCU musí zvolit prescaler a periodu čítače, které se vejdou do hardwarových limitů, takže skutečná frekvence se může mírně lišit.

Například STM32 implementace v src/stm32/hard_pwm.c počítá nejbližší dosažitelné hodnoty hwpwm_ticks a prescaler (řádky 328-348). Konečná frekvence na STM32 je přibližně:

example.txt
frequency = CLOCK_FREQ / (prescaler * hwpwm_ticks * pclock_div)

Pokud dva hardwarové PWM piny sdílejí stejný časovač, musí také používat stejnou frekvenci; jinak se Klipper vypne s “PWM already programmed at different speed” (řádek 356).

Praktické příklady

25 kHz ventilátor pro 4-drátové PWM řízení

example.ini
[fan]
pin: PA8
cycle_time: 0.00004
hardware_pwm: True

1 / 0.00004 = 25,000 Hz. Protože to je mimo spolehlivý rozsah softwarového PWM, je vyžadováno hardware_pwm: True.

Standardní 100 Hz ventilátor chlazení dílu

example.ini
[fan]
pin: PA8
cycle_time: 0.010

To je výchozí a funguje dobře se softwarovým PWM.

10 Hz topení

example.ini
[extruder]
heater_pin: PA2
pwm_cycle_time: 0.100

Opět výchozí; není potřeba měnit, pokud váš MOSFET/driver nepotřebuje rychlejší přepínání.

Shrnutí

  • Frekvence PWM v Klipperu je vždy 1 / cycle_time.
  • Použijte cycle_time pro ventilátory, výstupní piny a LED.
  • Použijte pwm_cycle_time pro topení.
  • Softwarový PWM respektuje dobu cyklu přesně.
  • Hardwarový PWM může zaokrouhlit dobu cyklu kvůli omezením časovače MCU.

Podívejte se na podobné články podle kategorie: Klipper 3D Printing