Программирование ARM ESP32-C3: встроенный АЦП Tue, April 16 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

ESP32-C3: встроенный АЦП Печать
Добавил(а) microsin   

На кристалле чипа микроконтроллера 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: работа со встроенным АЦП.

 

Добавить комментарий


Защитный код
Обновить

Top of Page