Коротко: У Klipper частота PWM задається опосередковано через параметр cycle time (час циклу). Частота дорівнює 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 Гц. - За замовчуванням для
[output_pin]:0.100с → 10 Гц. - За замовчуванням для LED-каналів
[neopixel]/[dotstar]:0.010с → 100 Гц.
Параметр задокументований у 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 Гц. - Документація зазначає, що “не рекомендується змінювати це, якщо немає електричної потреби перемикати нагрівач швидше ніж 10 разів на секунду” (Config_Reference.md).
Час циклу, що налаштовується під час виконання: [pwm_cycle_time]
Якщо вам потрібно змінювати час PWM-циклу під час виконання через G-code, використовуйте секцію [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 це стає аргументом cycle_ticks функції set_digital_out_pwm_cycle (рядок 488), а час увімкнення в кожному циклі планується в тих же одиницях тактів. Для апаратного PWM те саме значення cycle_ticks передається у специфічну для платформи функцію gpio_pwm_setup(), яка потім вибирає прескалер таймера та період, що найкраще відповідають цьому значенню.
Попередження щодо апаратного PWM: реальна частота може відрізнятися
Коли встановлено hardware_pwm: True, частота, яку ви запитуєте, є лише цільовою. Периферія таймера MCU повинна вибрати прескалер та період лічильника, що відповідають її апаратним обмеженням, тому реальна частота може трохи відрізнятися.
Наприклад, реалізація STM32 у src/stm32/hard_pwm.c обчислює найближчі досяжні значення hwpwm_ticks та prescaler (рядки 328-348). Остаточна частота на STM32 приблизно:
frequency = CLOCK_FREQ / (prescaler * hwpwm_ticks * pclock_div)Якщо два апаратних PWM-піни поділяють один таймер, вони також повинні використовувати однакову частоту; інакше Klipper зупиняється з помилкою “PWM already programmed at different speed” (рядок 356).
Практичні приклади
Вентилятор 25 кГц для 4-провідного PWM-керування
[fan]
pin: PA8
cycle_time: 0.00004
hardware_pwm: True1 / 0.00004 = 25,000 Гц. Оскільки це поза надійним діапазоном програмного PWM, потрібно hardware_pwm: True.
Стандартний вентилятор охолодження деталі 100 Гц
[fan]
pin: PA8
cycle_time: 0.010Це значення за замовчуванням, добре працює з програмним PWM.
Нагрівач 10 Гц
[extruder]
heater_pin: PA2
pwm_cycle_time: 0.100Знову за замовчуванням; не потрібно змінювати, якщо ваш MOSFET/драйвер не потребує швидшого перемикання.
Підсумок
- Частота PWM у Klipper завжди дорівнює
1 / cycle_time. - Використовуйте
cycle_timeдля вентиляторів, вихідних пінів та LED. - Використовуйте
pwm_cycle_timeдля нагрівачів. - Програмний PWM точно дотримується часу циклу.
- Апаратний PWM може округлювати час циклу через обмеження таймера MCU.