TL;DR: In Klipper wird die PWM-Frequenz indirekt über einen Cycle-Time-Parameter eingestellt. Die Frequenz ist 1 / cycle_time. Die genaue Konfigurationsoption hängt davon ab, was du steuerst.
Welcher Konfigurationsparameter verwendet wird
Klipper hat keine einheitliche pwm_frequency-Option. Stattdessen konfigurierst du die Periode eines PWM-Zyklus, und Klipper leitet die Frequenz daraus ab.
Lüfter und Output-Pins: cycle_time
Für Lüfter, generische Output-Pins, LED-Kanäle und Ähnliches verwende cycle_time:
[fan]
pin: PA8
cycle_time: 0.010
hardware_pwm: False- Standardwert für
[fan]:0.010s → 100 Hz. - Standardwert für
[output_pin]:0.100s → 10 Hz. - Standardwert für
[neopixel]/[dotstar]LED-Kanäle:0.010s → 100 Hz.
Der Parameter ist in docs/Config_Reference.md für [fan] (Zeilen 3239-3242) und [output_pin] (Zeilen 3678-3681) dokumentiert.
Heizungen: pwm_cycle_time
Für Heizungen (Extruder, beheiztes Druckbett usw.) heißt der Parameter pwm_cycle_time:
[extruder]
heater_pin: PA2
pwm_cycle_time: 0.100- Standardwert:
0.100s → 10 Hz. - Die Dokumentation merkt an, dass „es nicht empfohlen wird, dies zu ändern, es sei denn, es gibt eine elektrische Anforderung, die Heizung öfter als 10-mal pro Sekunde zu schalten" (Config_Reference.md).
Zur Laufzeit konfigurierbare Cycle Time: [pwm_cycle_time]
Wenn du die PWM-Cycle-Time zur Laufzeit per G-Code ändern musst, verwende die Sektion [pwm_cycle_time]:
[pwm_cycle_time my_pin]
pin: PB0Dann zur Laufzeit:
SET_PIN PIN=my_pin VALUE=0.5 CYCLE_TIME=0.001Dies ist in docs/Config_Reference.md dokumentiert und in klippy/extras/pwm_cycle_time.py implementiert.
Wie der Wert intern verwendet wird
In klippy/mcu.py wandelt die Klasse MCU_pwm die Cycle-Time in MCU-Clock-Ticks um:
cycle_ticks = self._mcu.seconds_to_clock(self._cycle_time)Bei Software-PWM wird dies zum cycle_ticks-Argument von set_digital_out_pwm_cycle (Zeile 488), und die Einschaltdauer innerhalb jedes Zyklus wird in denselben Tick-Einheiten geplant. Bei Hardware-PWM wird derselbe cycle_ticks-Wert an die plattformspezifische Funktion gpio_pwm_setup() übergeben, die dann einen Vorteiler und eine Periode wählt, die am besten passen.
Hardware-PWM-Einschränkung: Die tatsächliche Frequenz kann abweichen
Wenn hardware_pwm: True gesetzt ist, ist die angeforderte Frequenz nur ein Zielwert. Das Timer-Peripheriegerät des MCU muss einen Vorteiler und eine Zählerperiode wählen, die innerhalb seiner Hardware-Grenzen liegen, sodass die tatsächliche Frequenz leicht abweichen kann.
Beispielsweise berechnet die STM32-Implementierung in src/stm32/hard_pwm.c die am besten erreichbaren hwpwm_ticks- und prescaler-Werte (Zeilen 328-348). Die endgültige Frequenz auf dem STM32 ist näherungsweise:
frequency = CLOCK_FREQ / (prescaler * hwpwm_ticks * pclock_div)Wenn zwei Hardware-PWM-Pins denselben Timer teilen, müssen sie auch dieselbe Frequenz verwenden; andernfalls fährt Klipper mit der Meldung „PWM already programmed at different speed" herunter (Zeile 356).
Praktische Beispiele
25-kHz-Lüfter für 4-Draht-PWM-Steuerung
[fan]
pin: PA8
cycle_time: 0.00004
hardware_pwm: True1 / 0.00004 = 25,000 Hz. Da dies außerhalb des zuverlässigen Bereichs von Software-PWM liegt, ist hardware_pwm: True erforderlich.
Standard 100-Hz-Bauteilkühlungs-Lüfter
[fan]
pin: PA8
cycle_time: 0.010Dies ist der Standardwert und funktioniert gut mit Software-PWM.
10-Hz-Heizung
[extruder]
heater_pin: PA2
pwm_cycle_time: 0.100Ebenfalls der Standardwert; keine Änderung nötig, es sei denn, dein MOSFET/Treiber benötigt schnelleres Schalten.
Zusammenfassung
- Die PWM-Frequenz in Klipper ist immer
1 / cycle_time. - Verwende
cycle_timefür Lüfter, Output-Pins und LEDs. - Verwende
pwm_cycle_timefür Heizungen. - Software-PWM hält die Cycle-Time exakt ein.
- Hardware-PWM kann die Cycle-Time aufgrund von MCU-Timer-Beschränkungen runden.