Files
pico/pico1w/ampel/hw_pwm.c
T
2026-07-04 02:44:36 +02:00

29 lines
994 B
C

#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);
}