Klipper: PWM-Frequenz einstellen

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:

example.ini
[fan]
pin: PA8
cycle_time: 0.010
hardware_pwm: False
  • Standardwert für [fan]: 0.010 s → 100 Hz.
  • Standardwert für [output_pin]: 0.100 s → 10 Hz.
  • Standardwert für [neopixel] / [dotstar] LED-Kanäle: 0.010 s → 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:

example.ini
[extruder]
heater_pin: PA2
pwm_cycle_time: 0.100
  • Standardwert: 0.100 s → 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]:

example.ini
[pwm_cycle_time my_pin]
pin: PB0

Dann zur Laufzeit:

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

Dies 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:

example.py
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:

example.txt
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

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

1 / 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

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

Dies ist der Standardwert und funktioniert gut mit Software-PWM.

10-Hz-Heizung

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

Ebenfalls 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_time für Lüfter, Output-Pins und LEDs.
  • Verwende pwm_cycle_time für Heizungen.
  • Software-PWM hält die Cycle-Time exakt ein.
  • Hardware-PWM kann die Cycle-Time aufgrund von MCU-Timer-Beschränkungen runden.

Ähnliche Beiträge nach Kategorie: Klipper 3D Printing