PWM auf Pins 0 bis 20

This commit is contained in:
2026-07-04 02:44:36 +02:00
parent 5234c8d23d
commit 1f4b353f6c
12 changed files with 392 additions and 0 deletions
+28
View File
@@ -0,0 +1,28 @@
#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);
}