adc_driver.hpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #ifndef _ADC_DRIVER_HPP_
  2. #define _ADC_DRIVER_HPP_ 1
  3. #include "hardware/adc.h"
  4. #include "hardware/irq.h"
  5. #include "pico/multicore.h"
  6. #include "hardware/clocks.h"
  7. #include "adrs2040U_i2c.h"
  8. #define ADC_BUFF_SIZE 0x100
  9. // MUTEX
  10. auto_init_mutex(adcbuff_mutex);
  11. static volatile int read_p;
  12. static volatile int write_p;
  13. static volatile uint16_t adc_buffer[ADC_BUFF_SIZE];
  14. static void adc_interrupt(void)
  15. {
  16. while(! adc_fifo_is_empty()) {
  17. mutex_enter_blocking(&adcbuff_mutex);
  18. adc_buffer[write_p] = adc_fifo_get() & 0xFFF;
  19. write_p = (write_p + 1) & (ADC_BUFF_SIZE - 1);
  20. mutex_exit(&adcbuff_mutex);
  21. }
  22. };
  23. class ADC_Driver {
  24. private:
  25. int sample_rate = 1000; // サンプリングレート
  26. uint32_t adc_clk; // ADCクロック
  27. uint8_t adc_pin; // 使用するADCピン番号
  28. uint8_t adc_channel; // ADCチャンネル番号
  29. public:
  30. ADC_Driver(uint8_t p = 26, uint8_t c = 0) : adc_pin(p), adc_channel(c)
  31. {
  32. read_p = write_p = 0;
  33. sample_rate = 1000;
  34. adc_init();
  35. adc_gpio_init(adc_pin);
  36. adc_select_input(adc_channel);
  37. adc_fifo_setup(true, false, 1, true, false);
  38. // ADCサンプリングクロック設定
  39. adc_clk = clock_get_hz(clk_adc);
  40. adc_set_clkdiv(adc_clk/sample_rate);
  41. // ADC割り込み
  42. irq_set_exclusive_handler(ADC_IRQ_FIFO, adc_interrupt);
  43. irq_set_enabled(ADC_IRQ_FIFO, true);
  44. run(false);
  45. };
  46. int get_sample_rate(void)
  47. {
  48. return sample_rate;
  49. };
  50. void set_sample_rate(int rate)
  51. {
  52. sample_rate = rate;
  53. adc_set_clkdiv(adc_clk/sample_rate);
  54. };
  55. bool is_empty(void)
  56. {
  57. return (read_p == write_p);
  58. };
  59. int get_value(void)
  60. {
  61. int wp, rv;
  62. mutex_enter_blocking(&adcbuff_mutex);
  63. wp = write_p;
  64. if(read_p != wp) {
  65. rv = adc_buffer[read_p];
  66. read_p = (read_p + 1) & (ADC_BUFF_SIZE - 1);
  67. }
  68. else
  69. rv = -1;
  70. mutex_exit(&adcbuff_mutex);
  71. return rv;
  72. };
  73. uint8_t count(void)
  74. {
  75. uint8_t r;
  76. mutex_enter_blocking(&adcbuff_mutex);
  77. r = write_p - read_p;
  78. mutex_exit(&adcbuff_mutex);
  79. return r;
  80. }
  81. void run(bool r)
  82. {
  83. adc_irq_set_enabled(r);
  84. adc_run(r);
  85. if(r == false) {
  86. read_p = write_p = 0;
  87. }
  88. };
  89. };
  90. #endif