На кристалле чипа микроконтроллера ESP32-C3 интегрированы 2 аналого-цифровых преобразователя (Analog to Digital Converter, ADC, или по-нашему АЦП), работающие по принципу заполнения данными регистра с последовательным приближением (SAR, Successive Approximation Register). Эти АЦП 12-разрядные, и поддерживают вместе 6 каналов АЦП (внешние выводы, на которых разрешена работа считывания аналоговых уровней).
Имя |
Количество каналов |
Внешние выводы |
ADC1 |
5 |
GPIO0 .. GPIO4 |
ADC2 |
1 |
GPIO5 |
Работа с аппаратными модулями АЦП осуществляется через библиотеку драйвера ADC системы программирования ESP-IDF [2].
[Ограничения ADC]
Поскольку модуль ADC2 также используется аппаратурой Wi-Fi, то операция чтения данных АЦП вызовом adc2_get_raw() (между вызовами esp_wifi_start() и esp_wifi_stop()) может быть неудачной. Используйте код возврата, чтобы определить успех операции чтения.
Определенный модуль ADC может работать одновременно только в одном из рабочих режимов: либо в режиме повторяющихся операций преобразование/чтение (Continuous Read Mode), либо в режиме однократного преобразования и чтения результата (Single Read Mode).
ADC1 и ADC2 не могут работать одновременно в режиме Single Read Mode. Один из них будет заблокирован, пока другой не завершит свою операцию.
Для режима непрерывного чтения (Continuous Read Mode) с использованием прямого доступа к памяти (DMA), частота выборок ADC (значение поля sample_freq_hz структуры конфигурации adc_digi_config_t) должно быть в пределах SOC_ADC_SAMPLE_FREQ_THRES_LOW и SOC_ADC_SAMPLE_FREQ_THRES_HIGH.
[Использование драйвера ADC]
Каждый из блоков ADC поддерживает 2 рабочих режима, ADC single read mode и ADC continuous read mode (DMA). Режим однократного чтения (ADC single read mode) подходит для низкочастотных измерений уровня. Режим постоянного чтения (ADC continuous read mode с использованием DMA) подходит для постоянно повторяющихся с высокой частотой измерений.
Примечание: значение уровня, прочитанное с помощью ADC из любого не подключенного вывода, может быть случайным.
Режим ADC Continuous (DMA) Read. Для запуска автоматически повторяющихся преобразований АЦП с использованием DMA выполните следующие шаги:
· Инициализируйте драйвер ADC вызовом функции adc_digi_initialize(). · Инициализируйте контроллер ADC вызовом функции adc_digi_controller_config(). · Запустите автоматические преобразования ADC вызовом функции adc_digi_start(). · После этого ADC вы можете получить прочитанные значения вызовом функции adc_digi_read_bytes(). Перед остановкой ADC (вызовом adc_digi_stop()) драйвер будет продолжать преобразования аналоговых данных в цифровые данные. · Остановка чтений ADC производится вызовом adc_digi_stop(). · Драйвер ADC деинициализируется вызовом adc_digi_deinitialize().
Режим ADC Single Read. ADC должен быть предварительно сконфигурирован.
· Для ADC1 сконфигурируйте желаемую точность (precision) и ослабление (attenuation) вызовом функций adc1_config_width() и adc1_config_channel_atten(). · Для ADC2 сконфигурируйте ослабление вызовом adc2_config_channel_atten(). Чтение ADC2 конфигурируется при каждом его чтении.
Конфигурирование ослабления делается отдельно для каждого канала, см. adc1_channel_t и adc2_channel_t, значения которых устанавливаются как параметры к показанным выше функциям.
После этого можно прочитать результат преобразования ADC вызовом adc1_get_raw() и adc2_get_raw(). Разрядность чтения ADC2 должно быть установлено параметром adc2_get_raw() вместо использования функций конфигурации.
Примечание: при использовании ADC имеются описанные выше ограничения, см. раздел "Ограничения ADC".
Пример приложения, которое использует ADC в режимах одиночного чтения (single read mode) и режиме автоматической оцифровки (continuous (DMA) read mode) можно найти в директории peripherals/adc/esp32c3 примеров ESP-IDF.
Макросы для идентификации GPIO. Следующие макросы могут использоваться для указания номера вывода GPIO для канала ADC, или наоборот.
ADC1_CHANNEL_0_GPIO_NUM это номер порта GPIO канала 0 для ADC1.
ADC1_GPIOn_CHANNEL это номер канала ADC1 для порта n GPIO.
[Справочник по API драйвера ADC]
API для драйвера ADC состоит из 3 составляющих:
Драйвер ADC Калибровка ADC Макросы для идентификации GPIO (GPIO Lookup Macros)
Функция |
Описание |
Заголовочный файл: driver/esp32c3/include/driver/adc.h |
adc_digi_filter_reset |
Сброс фильтра цифрового контроллера ADC. |
adc_digi_filter_set_config |
Установка конфигурации фильтра цифрового контроллера ADC. |
adc_digi_filter_get_config |
Извлечение конфигурации фильтра цифрового контроллера ADC. |
adc_digi_filter_enable |
Разрешение/запрет фильтра цифрового контроллера ADC. Фильтрация данных ADC применяется для получения плавных данных на повышенных скоростях дискретизации. |
adc_digi_monitor_set_config |
Установка конфигурации монитора цифрового контроллера ADC. |
adc_digi_monitor_enable |
Разрешение/запрет монитора цифрового контроллера ADC. |
Заголовочный файл: driver/esp32c3/include/driver/adc.h |
adc_digi_pattern_table_t |
Структура установки правил преобразования цифрового контроллера ADC (режим DMA). |
adc_digi_output_data_t |
Структура формата выходных данных цифрового контроллера ADC (режим DMA). Используется для анализа захваченных данных ADC (режим DMA). |
adc_digi_clk_t |
Структура установки системных тактов цифрового контроллера ADC (режим DMA). Формула для вычисления: controller_clk = (APLL или APB) / (div_num + div_a / div_b + 1). |
adc_digi_config_t |
CONFIG_IDF_TARGET_ESP32. Параметры конфигурации цифрового контроллера ADC (режим DMA). Примеры настроек см. в описании adc_digi_config_t документации [1]. |
adc_arbiter_t |
Настройки режима рабочего арбитража и приоритета ADC. |
adc_digi_filter_t |
Конфигурация фильтра цифрового контроллера ADC (режима DMA). |
adc_digi_monitor_t |
Конфигурация монитора цифрового контроллера ADC (режим DMA). |
ADC_ARBITER_CONFIG_DEFAULT() |
Макрос конфигурации по умолчанию арбитра ADC. Замечание: ESP32S2 поддерживает только арбитр ADC2 (нуждается в нем). |
adc_unit_t |
Перечисление блока ADC. Замечание: для цифрового контроллера ADC (режим DMA) ESP32 не поддерживает ADC_UNIT_2, ADC_UNIT_BOTH, ADC_UNIT_ALTER. |
adc_channel_t |
Дескриптор (handle) каналов ADC. См. adc1_channel_t, adc2_channel_t. Замечание: для ESP32 ADC1 не используйте ADC_CHANNEL_8, ADC_CHANNEL_9. См. adc1_channel_t. |
adc_atten_t |
Параметр ослабления ADC (attenuation). Различные параметры определяют диапазон работы ADC. См. adc1_config_channel_atten. |
adc_i2s_source_t |
Выбор источника ESP32 ADC DMA. |
adc_bits_width_t |
Установка опции разрешающей способности ADC. |
adc_digi_convert_mode_t |
Рабочий режим цифрового контроллера ADC (режим DMA). Замечание: режим преобразования влияет на частоту выборки: SINGLE_UNIT_1 - когда сработало измерение, только ADC1 сделало одну выборку. SINGLE_UNIT_2 - когда сработало измерение, только ADC2 сделало одну выборку. BOTH_UNIT - когда сработало измерение, ADC1 и ADC2 сделали выборки одновременно. ALTER_UNIT - когда сработало измерение, ADC1 или ADC2 сделали выборки поочередно. |
adc_digi_output_format_t |
Опция формата выходных данных цифрового контроллера ADC (режим DMA). |
adc_arbiter_mode_t |
Опция рабочего режима арбитра ADC. |
adc_digi_filter_idx_t |
Опции индекса фильтра цифрового контроллера ADC (режим DMA). Замечание: для ESP32-S2 объект фильтра ADC фиксирован. |
adc_digi_filter_mode_t |
Опции типа фильтра цифрового контроллера ADC (режим DMA). Выражение: filter_data = (k-1)/k * last_data + new_data / k. |
adc_digi_monitor_idx_t |
Опции индекса монитора цифрового контроллера ADC (режим DMA). Замечание: для ESP32-S2 объект монитора ADC фиксирован. |
adc_digi_monitor_mode_t |
Установка режима монитора цифрового контроллера ADC. MONITOR_HIGH: если ADC_OUT > порога, то генерируется прерывание монитора. MONITOR_LOW: если ADC_OUT < порога, то генерируется прерывание монитора. |
Заголовочный файл: driver/include/driver/adc_common.h |
adc_power_on |
Разрешает питание ADC. |
adc_power_off |
Выключает SAR ADC. |
adc_power_acquire |
Инкрементирует счетчик использования (usage counter) модуля ADC. ADC будет оставаться под питанием, пока счетчик больше 0. Вызовите adc_power_release, когда завершили использование ADC. |
adc_power_release |
Декрементирует счетчик использования модуля ADC. ADC будет оставаться под питанием, пока счетчик больше 0. Вызовите эту функцию, когда завершили использование ADC. |
adc1_pad_get_io_num |
Извлечен номер порта GPIO для определенного канала ADC1. |
adc1_config_channel_atten |
Установит ослабление (attenuation) на определенном канале ADC1, и конфигурирует связанный с ним мультиплексор выводов GPIO. В описании этой функции документации [1] приведена таблица напряжения по умолчанию ADC для ослабления 0 dB. Путем установки повышенного ослабления можно оцифровывать напряжения более высокого уровня. Из-за особенностей характеристик ADC самые точные результаты получаются в рекомендуемом диапазоне ("suggested range"), показанном в таблице (см. описание adc1_config_channel_atten в документации [1]). Для достижения максимальной точности используйте API калибровки ADC и измерять напряжения в этих рекомендуемых диапазонах. Замечания: для любого указанного канала эта функция должна быть вызвана перед первым вызовом adc1_get_raw() для этого канала. Эта функция может быть вызвана несколько раз, чтобы одновременно сконфигурировать несколько каналов ADC. Вы можете вызвать adc1_get_raw() только после конфигурирования канала. |
adc1_config_width |
Конфигурируется ширина захвата ADC1 вместе с включением инверсии выхода для ADC1. Эта конфигурация делается для всех каналов ADC1. |
adc1_get_raw |
Берет одно чтение ADC1 из одного канала. ESP32: когда ключ питания SARADC1, SARADC2, HALL-сенсора и AMP-сенсора включен, вход GPIO36 и GPIO39 будет подтянут к низкому уровню примерно на 80 нс. Когда разрешается питание для любых из этих периферийных устройств, игнорируйте вход из GPIO36 и GPIO39. Описание этой проблемы см. в секции 3.11 "ECO_and_Workarounds_for_Bugs_in_ESP32". В качестве обходного решения вызовите в приложении adc_power_acquire(). Это приведет к повышенному потреблению энергии (примерно на 1 мА), но устранит эти выбросы на GPIO36 и GPIO39. Вызовите adc1_config_width() перед первым вызовом этой функции. Для любого указанного канала функция adc1_config_channel_atten(канал) должна быть вызвана перед первым вызовом этой функции. Конфигурирование нового канала не защищает от чтения ранее сконфигурированного канала. |
adc2_pad_get_io_num |
Извлекает номер GPIO определенного канала ADC2. |
adc2_config_channel_atten |
Конфигурирует канал ADC2, включая установку ослабления (attenuation). В описании этой функции документации [1] приведена таблица напряжения по умолчанию ADC для ослабления 0 dB. Путем установки повышенного ослабления можно оцифровывать напряжения более высокого уровня. Из-за особенностей характеристик ADC самые точные результаты получаются в рекомендуемом диапазоне ("suggested range"), показанном в таблице (см. описание adc2_config_channel_atten в документации [1]). Для достижения максимальной точности используйте API калибровки ADC и измерять напряжения в этих рекомендуемых диапазонах. Эта функция также конфигурирует мультиплексор входов портов GPIO для подключения их к каналу ADC2. Замечания: для любого указанного канала эта функция должна быть вызвана перед первым вызовом adc1_get_raw() для этого канала. Эта функция может быть вызвана несколько раз, чтобы одновременно сконфигурировать несколько каналов ADC, перед вызовом adc2_get_raw(). Вы можете вызвать adc2_get_raw() только после конфигурирования канала. |
adc2_get_raw |
Делает чтение одного канала ADC2. ESP32: когда ключ питания включает SARADC1, SARADC2, HALL-сенсор и AMP-сенсор, вход GPIO36 и GPIO39 будет подтянут к низкому уровню на время около 80 нс. Когда разрешается питание для любого из этих периферийных устройств, игнорируйте ввод из GPIO36 и GPIO39. Описание этой проблемы см. в секции 3.11 "ECO_and_Workarounds_for_Bugs_in_ESP32". В качестве обходного решения вызовите в приложении adc_power_acquire(). Это приведет к повышенному потреблению энергии (примерно на 1 мА), но устранит эти выбросы на GPIO36 и GPIO39. ESP32: для определенного канала adc2_config_channel_atten() должна быть вызвана перед первым вызовом этой функции. Если Wi-Fi запускается вызовом esp_wifi_start(), то эта функция всегда потерпит неудачу с ошибкой таймаута ESP_ERR_TIMEOUT. ESP32-S2: ADC2 поддерживает аппаратный арбитр. Арбитр предназначен для повышения эффективности использования ADC2. После того, как права на управление нарушены высоким приоритетом, контроллер с низким приоритетом прочитает недостоверные данные ADC2. Приоритет по умолчанию: Wi-Fi -> RTC -> Digital. |
adc_vref_to_gpio |
Номер ножки порта adc2_channel_t выхода опорного напряжения ADC1 или ADC2. Эта функция маршрутизирует внутреннее опорное напряжение ADCn на один из каналов ADC2. Тогда это опорное напряжение может быть затем измерено вручную для калибровки. ESP32 поддерживает только вывод внутреннего опорного напряжения ADC2. |
adc2_vref_to_gpio |
Номер ножки порта adc2_channel_t выхода опорного напряжения ADC2. Эта функция маршрутизирует внутреннее опорное напряжение ADCn на один из каналов ADC2. Это опорное напряжение может быть затем измерено вручную для калибровки. |
adc_digi_controller_config |
Настройка цифрового контроллера ADC. |
adc_digi_initialize |
Инициализация Digital ADC. |
adc_digi_start |
Старт периферийных устройств Digital ADC и DMA. После этого аппаратура начнет работать. |
adc_digi_stop |
Остановка периферийных устройств Digital ADC и DMA. После этого аппаратура перестанет работать. |
adc_digi_read_bytes |
Считывает байты из Digital ADC через DMA. |
adc_digi_deinitialize |
Отменяет инициализацию Digital ADC. |
adc_digi_init_config_s |
Конфигурация ADC DMA. |
ADC_ATTEN_0db |
Опция ослабления rtc-контроллера ADC. Эти определения оставлены только для обратной совместимости. |
adc_digi_init_config_s |
Конфигурация Digital ADC DMA. |
adc1_channel_t, adc2_channel_t |
Перечисления для идентификации каналов ADC1 и ADC2. |
adc_i2s_encode_t |
Опция кодирования цифрового контроллера ADC. |
[Калибровка ADC]
Функция |
Описание |
Заголовочный файл: esp_adc_cal/include/esp_adc_cal.h |
esp_adc_cal_check_efuse |
Проверит, прошиты ли значения калибровки ADC в eFuse. Эта функция проверит, прошито ли опорное напряжение ADC или "значения двух точек" (Two Point values) в eFuse текущего экземпляра ESP32. Замечание: в ESP32S2 поддерживается только ESP_ADC_CAL_VAL_EFUSE_TP. Некоторые старые ESP32S2 тоже это не поддерживают. В случае, когда вы делаете калибровку вручную, есть возможность выполнить вашу собственную калибровку чипа по двум точкам. |
esp_adc_cal_characterize |
Характеристика ADC на определенном ослаблении (attenuation). Эта функция будет характеризовать ADC на определенной настройке ослабления, и генерировать кривую ADC-напряжение в форме [y = coeff_a * x + coeff_b]. Определение характеристики может быть основана на значениях Two Point, eFuse Vref, или Vref по умолчанию и значений калибровки, с приоритетом в этом порядке. Замечание: для ESP32, значения Two Point и калибровка eFuse Vref может быть разрешены/запрещены с помощью menuconfig. Для ESP32S2 могут поддерживаться только значения калибровки Two Point, и только ADC_WIDTH_BIT_13. Параметр default_vref не используется. |
esp_adc_cal_raw_to_voltage |
Преобразует считанное значение из ADC в напряжение в mV. Эта функция преобразовывает результат чтения из ADC в напряжение в mV, основываясь на характеристиках ADC. Структура с характеристиками должна быть инициализирована перед вызовом этой функции (вызовите esp_adc_cal_characterize()). |
esp_adc_cal_get_voltage |
Reads an ADC and converts the reading to a voltage in mV. Эта функция вычитывает ADC, затем преобразует сырое считанное значение в напряжение, выраженное в mV, на основе предоставленной характеристики. Считываемый ADC также определяется характеристиками. Структура с характеристиками должна быть инициализирована перед вызовом этой функции (вызовите esp_adc_cal_characterize()). |
esp_adc_cal_characteristics_t |
Структура, сохраняющая характеристики ADC. Вызовите esp_adc_cal_characterize() для инициализации этой структуры. |
esp_adc_cal_value_t |
Тип значения калибровки, используемой в определении характеристики. |
[GPIO Lookup Macros]
Заголовочный файл: soc/esp32c3/include/soc/adc_channel.h. Макросы, предназначенные для преобразования каналов ADC в порты GPIO и обратно:
ADC1_GPIO1_CHANNEL, ADC1_CHANNEL_0_GPIO_NUM, ADC1_GPIO2_CHANNEL, ADC1_CHANNEL_1_GPIO_NUM, ADC1_GPIO3_CHANNEL, ADC1_CHANNEL_2_GPIO_NUM, ADC1_GPIO4_CHANNEL, ADC1_CHANNEL_3_GPIO_NUM, ADC1_GPIO5_CHANNEL, ADC1_CHANNEL_4_GPIO_NUM, ADC2_GPIO5_CHANNEL, ADC2_CHANNEL_0_GPIO_NUM.
[Ссылки]
1. ESP32-C3 Analog to Digital Converter site:espressif.com. 2. ESP-IDF Build System. 3. ESP32-C3: работа со встроенным АЦП. |