Як задати частоту PWM у Klipper?

Коротко: У Klipper частота PWM задається опосередковано через параметр cycle time (час циклу). Частота дорівнює 1 / cycle_time. Точний параметр конфігурації залежить від того, чим ви керуєте.

Який параметр конфігурації використовувати

Klipper не має єдиного параметра pwm_frequency. Замість цього ви налаштовуєте період одного PWM-циклу, і Klipper обчислює частоту з нього.

Вентилятори та вихідні піни: cycle_time

Для вентиляторів, загальних вихідних пінів, LED-каналів тощо використовуйте cycle_time:

example.ini
[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:

example.ini
[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]:

example.ini
[pwm_cycle_time my_pin]
pin: PB0

Під час виконання:

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

example.py
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 приблизно:

example.txt
frequency = CLOCK_FREQ / (prescaler * hwpwm_ticks * pclock_div)

Якщо два апаратних PWM-піни поділяють один таймер, вони також повинні використовувати однакову частоту; інакше Klipper зупиняється з помилкою “PWM already programmed at different speed” (рядок 356).

Практичні приклади

Вентилятор 25 кГц для 4-провідного PWM-керування

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

1 / 0.00004 = 25,000 Гц. Оскільки це поза надійним діапазоном програмного PWM, потрібно hardware_pwm: True.

Стандартний вентилятор охолодження деталі 100 Гц

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

Це значення за замовчуванням, добре працює з програмним PWM.

Нагрівач 10 Гц

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

Знову за замовчуванням; не потрібно змінювати, якщо ваш MOSFET/драйвер не потребує швидшого перемикання.

Підсумок

  • Частота PWM у Klipper завжди дорівнює 1 / cycle_time.
  • Використовуйте cycle_time для вентиляторів, вихідних пінів та LED.
  • Використовуйте pwm_cycle_time для нагрівачів.
  • Програмний PWM точно дотримується часу циклу.
  • Апаратний PWM може округлювати час циклу через обмеження таймера MCU.

Дивіться схожі статті за категоріями: Klipper 3D Printing