简而言之: 在Klipper中,PWM频率是通过周期时间参数间接设置的。频率为 1 / cycle_time。具体的配置选项取决于你控制的对象。
使用哪个配置参数
Klipper没有单一的 pwm_frequency 选项。你需要配置一个PWM周期的周期长度,Klipper从中推导出频率。
风扇和输出引脚:cycle_time
对于风扇、通用输出引脚、LED通道等,使用 cycle_time:
[fan]
pin: PA8
cycle_time: 0.010
hardware_pwm: False[fan]的默认值:0.010秒 → 100 Hz。[output_pin]的默认值:0.100秒 → 10 Hz。[neopixel]/[dotstar]LED通道的默认值:0.010秒 → 100 Hz。
该参数在 docs/Config_Reference.md 中有文档记录,针对 [fan](第3239-3242行)和 [output_pin](第3678-3681行)。
加热器:pwm_cycle_time
对于加热器(挤出机、热床等),该参数称为 pwm_cycle_time:
[extruder]
heater_pin: PA2
pwm_cycle_time: 0.100- 默认值:
0.100秒 → 10 Hz。 - 文档指出*“除非有电气要求需要以每秒超过10次的频率切换加热器,否则不建议设置此项”*(Config_Reference.md)。
运行时可配置的周期时间:[pwm_cycle_time]
如果你需要在运行时通过G代码更改PWM周期时间,使用 [pwm_cycle_time] 部分:
[pwm_cycle_time my_pin]
pin: PB0然后在运行时:
SET_PIN PIN=my_pin VALUE=0.5 CYCLE_TIME=0.001这在 docs/Config_Reference.md 中有文档记录,并在 klippy/extras/pwm_cycle_time.py 中实现。
内部如何使用该值
在 klippy/mcu.py 中,MCU_pwm 类将周期时间转换为MCU时钟滴答数:
cycle_ticks = self._mcu.seconds_to_clock(self._cycle_time)对于软件PWM,这成为 set_digital_out_pwm_cycle 的 cycle_ticks 参数(第488行),每个周期内的导通时间以相同的滴答单位调度。对于硬件PWM,相同的 cycle_ticks 值传递给特定平台的 gpio_pwm_setup(),后者选择最匹配的定时器预分频器和周期。
硬件PWM注意事项:实际频率可能不同
当设置 hardware_pwm: True 时,你请求的频率只是一个目标值。MCU定时器外设必须选择一个在其硬件限制范围内的预分频器和计数器周期,因此实际频率可能略有不同。
例如,src/stm32/hard_pwm.c 中的STM32实现计算最接近的可实现 hwpwm_ticks 和 prescaler 值(第328-348行)。STM32上的最终频率约为:
frequency = CLOCK_FREQ / (prescaler * hwpwm_ticks * pclock_div)如果两个硬件PWM引脚共享同一个定时器,它们必须使用相同的频率;否则Klipper会关闭并提示*“PWM already programmed at different speed”*(第356行)。
实际示例
25 kHz风扇用于4线PWM控制
[fan]
pin: PA8
cycle_time: 0.00004
hardware_pwm: True1 / 0.00004 = 25,000 Hz。由于这超出了软件PWM的可靠范围,因此需要 hardware_pwm: True。
标准100 Hz零件冷却风扇
[fan]
pin: PA8
cycle_time: 0.010这是默认值,与软件PWM配合良好。
10 Hz加热器
[extruder]
heater_pin: PA2
pwm_cycle_time: 0.100同样是默认值;除非你的MOSFET/驱动器需要更快的切换,否则无需更改。
总结
- Klipper中的PWM频率始终为
1 / cycle_time。 - 风扇、输出引脚和LED使用
cycle_time。 - 加热器使用
pwm_cycle_time。 - 软件PWM精确遵循周期时间。
- 硬件PWM可能由于MCU定时器限制而对周期时间进行取整。