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:
[fan]
pin: PA8
cycle_time: 0.010
hardware_pwm: False- Výchozí pro
[fan]:0.010s → 100 Hz. - Výchozí pro
[output_pin]:0.100s → 10 Hz. - Výchozí pro
[neopixel]/[dotstar]LED kanály:0.010s → 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:
[extruder]
heater_pin: PA2
pwm_cycle_time: 0.100- Výchozí:
0.100s → 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]:
[pwm_cycle_time my_pin]
pin: PB0Pak za běhu:
SET_PIN PIN=my_pin VALUE=0.5 CYCLE_TIME=0.001To 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:
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ě:
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í
[fan]
pin: PA8
cycle_time: 0.00004
hardware_pwm: True1 / 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
[fan]
pin: PA8
cycle_time: 0.010To je výchozí a funguje dobře se softwarovým PWM.
10 Hz topení
[extruder]
heater_pin: PA2
pwm_cycle_time: 0.100Opě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_timepro ventilátory, výstupní piny a LED. - Použijte
pwm_cycle_timepro topení. - Softwarový PWM respektuje dobu cyklu přesně.
- Hardwarový PWM může zaokrouhlit dobu cyklu kvůli omezením časovače MCU.