adc_sample.c 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #include <stdio.h>
  2. #include "pico/stdlib.h"
  3. #include "hardware/adc.h"
  4. #include "hardware/clocks.h"
  5. #include "hardware/pwm.h"
  6. #define ADC0_PIN ADC_BASE_PIN
  7. #define ADC1_PIN (ADC_BASE_PIN+1)
  8. #define ADC2_PIN (ADC_BASE_PIN+2)
  9. #define ADC_VREF 3.3f
  10. #define ADC_SAMPLE_CLKS 96
  11. typedef enum {
  12. adc_input0,
  13. adc_input1,
  14. adc_input2,
  15. adc_input3,
  16. adc_input4,
  17. } _adc_input_t;
  18. #define PWM_WRAP 4096
  19. #define PWM_OUT_PIN PICO_DEFAULT_LED_PIN
  20. #define PWM_SUB_PIN 2
  21. void adc_irq_handler(void)
  22. {
  23. while(!adc_fifo_is_empty()) {
  24. uint16_t value = adc_fifo_get() & 0xFFF;
  25. pwm_set_gpio_level(PWM_OUT_PIN, value);
  26. pwm_set_gpio_level(PWM_SUB_PIN, value);
  27. }
  28. }
  29. int main()
  30. {
  31. stdio_init_all();
  32. float adc_div, pwm_clk;
  33. uint out_slice, sub_slice;
  34. // PWMの設定
  35. gpio_set_function(PWM_OUT_PIN, GPIO_FUNC_PWM);
  36. gpio_set_function(PWM_SUB_PIN, GPIO_FUNC_PWM);
  37. pwm_config c = pwm_get_default_config();
  38. pwm_config_set_wrap(&c, PWM_WRAP);
  39. pwm_config_set_clkdiv(&c, 2.0f);
  40. // PWMクロックの設定
  41. pwm_clk = (float)clock_get_hz(clk_sys) / 2.0f / (float)PWM_WRAP;
  42. printf("pwm_clk = %f\n", pwm_clk);
  43. out_slice = pwm_gpio_to_slice_num(PWM_OUT_PIN);
  44. sub_slice = pwm_gpio_to_slice_num(PWM_SUB_PIN);
  45. pwm_init(out_slice, &c, false);
  46. pwm_init(sub_slice, &c, false);
  47. pwm_set_gpio_level(PWM_OUT_PIN, PWM_WRAP);
  48. pwm_set_gpio_level(PWM_SUB_PIN, PWM_WRAP);
  49. pwm_set_enabled(out_slice, true);
  50. pwm_set_enabled(sub_slice, true);
  51. // ADCの設定
  52. adc_init();
  53. adc_gpio_init(ADC0_PIN);
  54. adc_fifo_setup(
  55. true, // en: FIFOを有効化するならtrue
  56. false, // DREQを有効化するならtrue
  57. 1, // DREQ、IRQを発生させるFIFOエントリ数
  58. false, // 最上位ビットをエラーフラグにするならtrue
  59. false // バイトシフトするならtrue
  60. );
  61. adc_div = (float)clock_get_hz(clk_adc) / (float)ADC_SAMPLE_CLKS / pwm_clk;
  62. adc_set_clkdiv(adc_div);
  63. printf("adc_div = %f\n", adc_div);
  64. // ADC割り込み
  65. irq_set_exclusive_handler(ADC_IRQ_FIFO, adc_irq_handler);
  66. irq_set_enabled(ADC_IRQ_FIFO, true);
  67. // ADC割り込み有効化&フリーランニングスタート
  68. adc_irq_set_enabled(true);
  69. adc_run(true);
  70. while (true) {
  71. tight_loop_contents();
  72. }
  73. }