#include #include "pico/stdlib.h" #include "hardware/pwm.h" #include "hardware/clocks.h" #include #define LED_PIN PICO_DEFAULT_LED_PIN // LED #define PWM_SUB_PIN 2 // サブ用 #define PWM_FREQ 1000 #define PWM_DIVIDER 100.0f #define PI 3.14159265358979323846 uint slice_num = 0; uint sub_slice = 0; uint16_t wrap = 0; void pwm_irq_handler(void) { static uint counter = 0; pwm_clear_irq(slice_num); if(counter++ >= PWM_FREQ) { counter = 0; } double amp = fabs(sin(PI * ((double)counter/(double)PWM_FREQ))); uint16_t cc = (uint16_t)((double)wrap * amp); pwm_set_gpio_level(LED_PIN, cc); pwm_set_gpio_level(PWM_SUB_PIN, cc); } int main() { stdio_init_all(); gpio_set_function(LED_PIN,GPIO_FUNC_PWM ); gpio_set_function(PWM_SUB_PIN,GPIO_FUNC_PWM ); pwm_config c = pwm_get_default_config(); pwm_config_set_clkdiv(&c, PWM_DIVIDER); wrap = (clock_get_hz(clk_sys) / PWM_DIVIDER) / PWM_FREQ; pwm_config_set_wrap(&c, wrap); // LEDのスライスを設定 slice_num = pwm_gpio_to_slice_num(LED_PIN); pwm_init(slice_num, &c, false); // サブのスライスを設定 sub_slice = pwm_gpio_to_slice_num(PWM_SUB_PIN); pwm_init(sub_slice, &c, false); // 念のためにIRQをクリアしておく pwm_clear_irq(slice_num); // pwm_set_irq_enabled(slice_num, true); irq_set_exclusive_handler(PWM_DEFAULT_IRQ_NUM(), pwm_irq_handler); irq_set_enabled(PWM_DEFAULT_IRQ_NUM(), true); pwm_set_gpio_level(LED_PIN, wrap/2); pwm_set_gpio_level(PWM_SUB_PIN, wrap/2); pwm_set_enabled(slice_num, true); pwm_set_enabled(sub_slice, true); while (true) { tight_loop_contents(); } }