adc_driver.hpp 2.4 KB

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