pwm_sample.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #include <stdio.h>
  2. #include "pico/stdlib.h"
  3. #include "hardware/pwm.h"
  4. #include "hardware/clocks.h"
  5. #include <math.h>
  6. #define LED_PIN PICO_DEFAULT_LED_PIN // LED
  7. #define PWM_SUB_PIN 2 // サブ用
  8. #define PWM_FREQ 1000
  9. #define PWM_DIVIDER 100.0f
  10. #define PI 3.14159265358979323846
  11. uint slice_num = 0;
  12. uint sub_slice = 0;
  13. uint16_t wrap = 0;
  14. void pwm_irq_handler(void)
  15. {
  16. static uint counter = 0;
  17. pwm_clear_irq(slice_num);
  18. if(counter++ >= PWM_FREQ) {
  19. counter = 0;
  20. }
  21. double amp = fabs(sin(PI * ((double)counter/(double)PWM_FREQ)));
  22. uint16_t cc = (uint16_t)((double)wrap * amp);
  23. pwm_set_gpio_level(LED_PIN, cc);
  24. pwm_set_gpio_level(PWM_SUB_PIN, cc);
  25. }
  26. int main()
  27. {
  28. stdio_init_all();
  29. gpio_set_function(LED_PIN,GPIO_FUNC_PWM );
  30. gpio_set_function(PWM_SUB_PIN,GPIO_FUNC_PWM );
  31. pwm_config c = pwm_get_default_config();
  32. pwm_config_set_clkdiv(&c, PWM_DIVIDER);
  33. wrap = (clock_get_hz(clk_sys) / PWM_DIVIDER) / PWM_FREQ;
  34. pwm_config_set_wrap(&c, wrap);
  35. // LEDのスライスを設定
  36. slice_num = pwm_gpio_to_slice_num(LED_PIN);
  37. pwm_init(slice_num, &c, false);
  38. // サブのスライスを設定
  39. sub_slice = pwm_gpio_to_slice_num(PWM_SUB_PIN);
  40. pwm_init(sub_slice, &c, false);
  41. // 念のためにIRQをクリアしておく
  42. pwm_clear_irq(slice_num);
  43. //
  44. pwm_set_irq_enabled(slice_num, true);
  45. irq_set_exclusive_handler(PWM_DEFAULT_IRQ_NUM(), pwm_irq_handler);
  46. irq_set_enabled(PWM_DEFAULT_IRQ_NUM(), true);
  47. pwm_set_gpio_level(LED_PIN, wrap/2);
  48. pwm_set_gpio_level(PWM_SUB_PIN, wrap/2);
  49. pwm_set_enabled(slice_num, true);
  50. pwm_set_enabled(sub_slice, true);
  51. while (true) {
  52. tight_loop_contents();
  53. }
  54. }