1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- #include <stdio.h>
- #include "pico/stdlib.h"
- #include "hardware/pwm.h"
- #include "hardware/clocks.h"
- #include <math.h>
- #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();
- }
- }
|