#include "hw_pwm.h" #include "pwm.h" #include "hardware/pwm.h" #include "hardware/gpio.h" #include "hardware/clocks.h" void hw_pwm_init(void) { // clkdiv so waehlen, dass (wrap+1) Ticks pro Periode 1 kHz ergeben. // Bei 125 MHz sysclk und wrap=999 kommt exakt 125.0 raus. float div = (float)clock_get_hz(clk_sys) / ((PWM_MAX_LEVEL + 1) * PWM_FREQ_HZ); for (unsigned pin = PWM_HW_FIRST_PIN; pin < PWM_HW_FIRST_PIN + PWM_HW_COUNT; pin++) { gpio_set_function(pin, GPIO_FUNC_PWM); } // 8 Slices decken GP0..GP15 komplett ab (je 2 Kanaele A/B pro Slice). for (unsigned slice = 0; slice < 8; slice++) { pwm_set_wrap(slice, PWM_MAX_LEVEL); pwm_set_clkdiv(slice, div); pwm_set_both_levels(slice, 0, 0); pwm_set_enabled(slice, true); } } void hw_pwm_set(unsigned pin, uint16_t level) { if (level > PWM_MAX_LEVEL) level = PWM_MAX_LEVEL; pwm_set_chan_level(pwm_gpio_to_slice_num(pin), pwm_gpio_to_channel(pin), level); }