adc.cpp 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #include "kbf/adc.h"
  2. #include <esp_log.h>
  3. #include "kbf/macros.h"
  4. using namespace kbf;
  5. adc::ADC1::ADC1(int channel) : channel(static_cast<adc1_channel_t>(channel)) {
  6. ESP_LOGI(TAG, "configuring ADC1 channel %d", channel);
  7. CHECK(adc1_config_width(KBF_ADC_WIDTH));
  8. CHECK(adc1_config_channel_atten(this->channel, KBF_ADC_ATTEN));
  9. adcChars = new esp_adc_cal_characteristics_t();
  10. auto cal = esp_adc_cal_characterize(ADC_UNIT_1, KBF_ADC_ATTEN, KBF_ADC_WIDTH, KBF_ADC_DEFAULT_VREF, adcChars);
  11. switch (cal) {
  12. case ESP_ADC_CAL_VAL_EFUSE_VREF:
  13. ESP_LOGI(TAG, "characterized using eFuse Vref");
  14. break;
  15. case ESP_ADC_CAL_VAL_EFUSE_TP:
  16. ESP_LOGI(TAG, "characterized using eFuse two point value");
  17. break;
  18. case ESP_ADC_CAL_VAL_DEFAULT_VREF:
  19. ESP_LOGW(TAG, "characterized using default Vref");
  20. break;
  21. default:
  22. ESP_LOGE(TAG, "unexpected response from esp_adc_cal_characterize: %d", cal);
  23. ABORT("debug me");
  24. }
  25. }
  26. uint32_t adc::ADC1::readRaw() const {
  27. int reading = 0;
  28. for (int i = 0; i < KBF_ADC_NUM_SAMPLES; i++) {
  29. reading += adc1_get_raw(channel);
  30. }
  31. reading /= KBF_ADC_NUM_SAMPLES;
  32. return reading;
  33. }
  34. uint32_t adc::ADC1::readVoltage() const {
  35. uint32_t reading = 0;
  36. for (int i = 0; i < KBF_ADC_NUM_SAMPLES; i++) {
  37. uint32_t voltage = 0;
  38. CHECK(esp_adc_cal_get_voltage((adc_channel_t) channel, adcChars, &voltage));
  39. reading += voltage;
  40. }
  41. reading /= KBF_ADC_NUM_SAMPLES;
  42. return reading;
  43. }
  44. uint32_t adc::ADC1::rawToVoltage(int raw) const {
  45. return esp_adc_cal_raw_to_voltage(raw, adcChars);
  46. }