В ESP32-C3 интегрировано два блока АЦП (ADC1 и ADC2), построенных по принципу заполнения регистра последовательного приближения (Successive Approximation Register, SAR). Всего имеется 6 каналов, распределенных по этим блокам.
ADC1: 5 каналов, жестко привязанных к выводам GPIO0 .. GPIO4 (ADC1_CHANNEL_0 .. ADC1_CHANNEL_4) ADC2: 1 канал, жестко привязанный к выводу GPIO5 (ADC2_CHANNEL_0).
[Ослабление по входу АЦП]
Для измерения внешнего уровня напряжения блоки АЦП используют внутренний источник опорного напряжения Vref. Таким образом, ESP32-C3 может измерять аналоговые напряжения от 0V до Vref. От экземпляра к экземпляру чипа значение Vref может меняться относительно среднего напряжения 1.1V. Чтобы получить возможность преобразования в цифровую форму напряжений больших, чем Vref, входные напряжения могут быть ослаблены перед подачей на вход АЦП (ADC Attenuation). Для этого имеется 4 доступные опции ослабления. Чем ослабление выше, тем более высокое напряжение можно измерить.
Таблица 1. Опции аттенюации по входу АЦП.
Ослабление (Attenuation) |
Измеряемый диапазон напряжений |
ADC_ATTEN_DB_0 |
0 mV ~ 750 mV |
ADC_ATTEN_DB_2_5 |
0 mV ~ 1050 mV |
ADC_ATTEN_DB_6 |
0 mV ~ 1300 mV |
ADC_ATTEN_DB_11 |
0 mV ~ 2500 mV |
[Аналого-цифровое преобразование]
Преобразование (ADC conversion) переводит входное аналоговое напряжение в числовое значение. Результаты преобразования предоставляются драйвером ADC в виде сырых данных. Максимальная разрешающая способность ESP32-C3 ADC в режиме однократного чтения (Single Read mode) составляет 12 бит (диапазон выходных сырых значений оцифровки 0 .. 4095). Для запуска преобразования и получения сырых результатов имеются функции:
adc1_get_raw() adc2_get_raw() adc_digi_read_bytes()
Для вычисления реального напряжения на основе сырых значений ADC используется формула:
Vout = Dout * Vmax / Dmax (1)
Здесь:
Vout Реальное значение входного напряжения в милливольтах. Dout Сырое значение, прочитанное из ADC. Vmax Максимальное измеряемое напряжение, которое зависит от выбранной опции ослабления по входу, см. таблицу 1. Dmax Максимальное сырое значение, соответствующее Vmax и выбранной разрешающей способности. Для 12-битной разрядности Dmax = 4095 для 4Single Read mode и Continuous Read mode.
Для плат, у которых запрограммированы биты калибровки (eFuse ADC calibration bits), может использоваться функция esp_adc_cal_raw_to_voltage() для получения калиброванных результатов преобразования. Эти результаты будут означать реальное напряжение (в mV), нет необходимости преобразовывать сырые значения по формуле (1). Если используется ADC calibration API на платах без eFuse ADC calibration bits, то генерируется предупреждение (см. далее "Калибровка ADC").
Примечание: для использования АЦП существуют ограничения, подробнее см. раздел "Ограничения ADC" статьи [2]. Последовательность действий для использования АЦП в режимах ADC Continuous (DMA) Read и ADC Single Read также см. в статье [2].
Минимизация шума. ESP32-C3 ADC может быть чувствителен к шумам на входе и из-за помех по питанию, что приводит к скачкообразным изменениям значений преобразования. В зависимости от сценария использования, для уменьшения шума и ошибок измерений к входному выводу канала АЦП может быть подключен фильтрующий кондеyсатор (например керамика 100 нФ). Кроме этого для устранения шума может использоваться техника передискретизации и усреднения (multisampling).
[Калибровка ADC]
Калибровка ESP32-C3 ADC состоит из 2 шагов: аппаратная калибровка (Hardware Calibration) и программная калибровка (Software Calibration).
Hardware Calibration. На основании последовательных сравнений с опорным напряжением ESP32-C3 ADC определяет вес каждого бита выходного оцифрованного значения. Расчетное значение опорного напряжения (Vref) составляет 1100 mV, однако реальное значение Vref может находится в диапазоне от 1000 mV до 1200 mV, в зависимости от экземпляра чипа. Чтобы минимизировать эту разницу, была введена аппаратная калибровка, которая состоит из 2 шагов.
1. Устанавливается параметр автокалибровки для диапазона опорного напряжения (bandgap voltage reference). Этим может быть сведена к минимуму упомянутая выше погрешность величины Vref. 2. Корректируется смещение характеристики ADC Vin-Dout. Характеристика ADC обычно описывается функцией: f(x) = A * x + B, где B это смещение.
Некалиброванная характеристика ADC может выглядеть так:
Рис. 1. Характеристика АЦП до аппаратной калибровки.
Смещение (offset) не откалиброванной характеристики может быть значительным. На шаге 2 корректируется это смещение, чтобы оно стало нулевым.
Рис. 2. Характеристика АЦП после аппаратной калибровки.
Аппаратная калибровка осуществляется внутри кода драйвера ADC. Последующими результатами будут необработанные сырые данные. Для получения конечного результата значения напряжения необходима трансформация по формуле (1), см. выше раздел "Аналого-цифровое преобразование".
Software Calibration. Для преобразования сырых данных ADC в калиброванные цифровые данные должны быть выполнены последующие шаги:
1. Проверка eFuse, чтобы определить, поддерживается ли программная калибровка. Это делается вызовом esp_adc_cal_check_efuse(). 2. Вызовом esp_adc_cal_characterize() вычисляются характеристики калибровки ADC. Программные характеристики калибровки ADC используются на модуль АЦП (ADC1 или ADC2) и на выбранное ослабление (см. таблицу 1). Например, характеристики ADC1 канала 0 при ослаблении 11 dB такие же, как характеристики ADC1 канала 2 при ослаблении 11 dB. Однако характеристики ADC1 канала 0 при ослаблении 11 dB отличаются от характеристик ADC2 канала 0 при ослаблении 11 dB. Также отличаются характеристики ADC1 канала 0 при ослаблении 11 dB и характеристики ADC1 канала 0 при ослаблении 6 dB. 3. Получение реального значения напряжения вызовом esp_adc_cal_raw_to_voltage().
После программной калибровки характеристика ADC должна выглядеть так:
Рис. 3. Характеристика АЦП после аппаратной и программной калибровки.
Результаты, предоставленные API-функциями, учитывающими калибровку (ADC calibration API) показывают реальные значения напряжения в милливольтах. Пример программной калибровки можно найти в директории peripherals/adc/single_read среди примеров проектов ESP-IDF.
[Справочник по API]
API-функции ADC поделены на 3 категории:
· ADC driver · ADC Calibration · GPIO Lookup Macros
Общее описание назначения API-функций, см. в статье [2], полное описание функций и их параметров, макросов и типов данных см. в документации [1].
Примечание: версия 5 среды разработки ESP-IDF внесла изменения в API драйвера ADC, см. [3 .. 5].
[Ссылки]
1. ESP32-C3 Analog to Digital Converter site:espressif.com. 2. ESP32-C3: встроенный АЦП. 3. ESP32-C3 Analog to Digital Converter (ADC) Oneshot Mode Driver site:espressif.com. 4. ESP32-C3 Analog to Digital Converter (ADC) Continuous Mode Driver site:espressif.com. 5. ESP32-C3 Analog to Digital Converter (ADC) Calibration Driver site:espressif.com. |