Использование АЦП в ESP32 с использованием ESP-IDF


В этом уроке мы научимся использовать аналого-цифровой преобразователь (АЦП) платы ESP32 с помощью ESP-IDF. Другими словами, мы научимся считывать аналоговые значения с помощью модуля аналого-цифрового преобразователя (АЦП) ESP32, используя VS Code с расширением ESP-IDF. Для подачи аналогового сигнала на канал АЦП мы подключим потенциометр к плате ESP32 и будем считывать его аналоговое значение. Мы покажем, как выводить значения АЦП ESP32 и преобразовывать их в аналоговые показания напряжения с помощью двух примеров скетчей.

Прежде чем продолжить, убедитесь, что у вас установлена ​​последняя версия VS Code и настроено расширение ESP-IDF:

Также на нашем сайте вы можете прочитать статью про начало работы с ESP32 с использованием ESP-IDF.

АЦП ESP32

АЦП ESP32 может считывать аналоговые значения в диапазоне от 0 до 3,3 В. АЦП преобразует аналоговые сигналы в цифровые значения. Измеренному напряжению присваивается значение от 0 до 4095. Соответственно, значение 0 соответствует 0 В, а максимальное значение 4095 соответствует 3,3 В. Любые промежуточные значения также будут присваиваться соответствующим образом.

Однако есть небольшой недостаток. Модуль АЦП не особенно чувствителен к изменениям значений. Его природа нелинейна. Поэтому очень близкие значения будут соответствовать аналогичным напряжениям. Например, показания напряжения 3,3 В и 3,2 В будут представлены как значение АЦП 4095.

Нелинейная зависимость между значением напряжения и значением АЦП показана на следующем графике.

Зависимость между значением напряжения и значением АЦП ESP32

ESP32 имеет два 12-битных АЦП (АЦП 1 и АЦП 2) и поддерживает максимум 18 аналоговых каналов.

Разрешение 12 бит
Напряжение 0-3,3 В
Присвоенное значение 0-4095
Аналоговый контакт GPIO0, GPIO2, GPIO4, GPIO12, GPIO13, GPIO14, GPIO15, GPIO25, GPIO26, GPIO27, GPIO32, GPIO33, GPIO34, GPIO35, GPIO36 и GPIO39
Изменение разрешения Может измениться

Плата ESP32 имеет 8 каналов для АЦП1, но DEVKIT V1 поддерживает только 6 из них. АЦП2 имеет 10 аналоговых каналов. Аналоговые выводы обоих каналов указаны ниже:

Контакты АЦП1

  • ADC1_CH0 :GPIO 36
  • ADC1_CH1 :GPIO 37 (НЕДОСТУПНО)
  • ADC1_CH2 :GPIO 38 (НЕДОСТУПНО)
  • ADC1_CH3 :GPIO 39
  • ADC1_CH4 :GPIO 32
  • ADC1_CH5 :GPIO 33
  • ADC1_CH6 :GPIO 34
  • ADC1_CH7 :GPIO 35

Контакты ADC2

  • ADC2_CH0 :GPIO 4
  • ADC2_CH1 :GPIO 0
  • ADC2_CH2 :GPIO 2
  • ADC2_CH3 :GPIO 15
  • ADC2_CH4 :GPIO 13
  • ADC2_CH5 :GPIO 12
  • ADC2_CH6 :GPIO 14
  • ADC2_CH7 :GPIO 27
  • ADC2_CH8 :GPIO 25
  • ADC2_CH9 :GPIO 26

На следующей схеме показаны аналоговые выводы для ESP32 DEVKIT V1:

Аналоговые выводы для ESP32 DEVKIT V1

API ESP-IDF для АЦП ESP32 

Прежде чем двигаться дальше, давайте обсудим некоторые важные функции, необходимые для доступа к каналам АЦП ESP32.

ESP-IDF предоставляет библиотеки driver/adc.h и esp_adc_cal.h, необходимые для драйвера АЦП и калибровки АЦП соответственно. Для этого проекта нам потребуется установить диапазон входного напряжения АЦП, выполнить калибровку АЦП, определить разрядность АЦП, получить значение АЦП и преобразовать его в показания напряжения. Давайте посмотрим, как это будет реализовано. 

Первым шагом является подключение заголовочных файлов:

Настройка диапазона входного напряжения АЦП ESP32

Следующий шаг — установка диапазона входного напряжения АЦП. Этот диапазон соответствует установленному параметру ослабления. Таким образом, диапазон АЦП изменяется в зависимости от этого параметра. У нас есть возможность установить параметр ослабления, выбрав один из четырех вариантов, перечисленных ниже. Обратите внимание, как диапазон входного напряжения АЦП изменяется в зависимости от выбранного ослабления.

Затухание Параметр затухания Диапазон входного напряжения
0 дБ ADC_ATTEN_DB_0 ~100-950 мВ
2,5 дБ ADC_ATTEN_DB_2_5 ~100-1250 мВ
6 дБ ADC_ATTEN_DB_6 ~150-1750 мВ
11 дБ ADC_ATTEN_DB_11 ~150-2450 мВ

Для установки диапазона входного напряжения для АЦП1 используется функция adc1_config_channel_atten(), в которой указываются два аргумента. Первый аргумент — это номер канала АЦП1, записанный в формате ADC1_CHANNEL_X, где 'X' обозначает номер канала. Если вы измеряете аналоговый сигнал с вывода GPIO35, он будет обозначаться как ADC1_CHANNEL_7. Второй аргумент — это параметр ослабления, указанный в таблице выше.

В следующей строке кода мы устанавливаем параметр ослабления канала 0 АЦП1, который соответствует выводу GPIO36, на 11 дБ.

Аналогично, для установки диапазона входного напряжения для ADC2 мы используем функцию adc2_config_channel_atten() и указываем в ней два аргумента. Первый аргумент — это канал ADC2, записанный в виде ADC2_CHANNEL_X, где 'X' обозначает номер канала. Если вы измеряете аналоговый сигнал с вывода GPIO26, он будет обозначаться как ADC1_CHANNEL_9. Второй аргумент — это параметр ослабления, указанный в таблице выше.

В следующей строке кода мы устанавливаем параметр ослабления канала 0 АЦП2, который соответствует выводу GPIO4, на 11 дБ.

Калибровка АЦП ESP32

Далее мы покажем, как выполнить калибровку АЦП. Это важный шаг, поскольку микросхемы ESP32 различаются по своим внутренним опорным напряжениям. Для калибровки АЦП мы выполняем два шага. Сначала создаем экземпляр типа esp_adc_cal_characteristics_t с именем ' adc1_chars '. В нем будет храниться откалиброванное значение АЦП. Затем используем функцию esp_adc_cal_characterize() и указываем в ней 4 аргумента, как показано ниже.

В следующей строке кода мы калибруем АЦП1 с ослаблением 11 дБ.

Настройка разрядности АЦП ESP32

Следующий шаг — установка разрядности АЦП. Для АЦП1 используется функция adc1_config_width() для настройки разрядности АЦП. Она принимает один аргумент — желаемую разрядность. Для разрядности можно выбрать следующие значения:

  • ADC_WIDTH_BIT_DEFAULT (12-бит)
  • ADC_WIDTH_BIT_9
  • ADC_WIDTH_BIT_10
  • ADC_WIDTH_BIT_11
  • ADC_WIDTH_BIT_12

В следующей строке кода мы настраиваем АЦП1 с разрядностью по умолчанию, то есть 12 бит.

Получение исходного значения АЦП

Для получения показаний АЦП для АЦП1 мы используем функцию adc1_get_raw() и указываем в качестве аргумента канал АЦП1 в формате ADC1_CHANNEL_X, где 'X' обозначает номер канала.

В следующей строке кода мы получаем исходное значение АЦП1 канала 0. Это значение сохраняется в целочисленной переменной 'adc_value'.

Аналогично, для получения показаний АЦП для АЦП2 мы используем функцию adc2_get_raw() и указываем в качестве аргумента канал АЦП2 в формате ADC2_CHANNEL_X, где 'X' обозначает номер канала.

В следующей строке кода мы получаем исходное значение АЦП2 канала 0. Это значение сохраняется в целочисленной переменной 'adc_value'.

Примечание: перед получением исходного значения АЦП обязательно настройте разрядность АЦП.

Показания напряжения, полученные с помощью АЦП

Наконец, для преобразования исходного значения АЦП в показание напряжения в милливольтах мы используем функцию esp_adc_cal_raw_to_voltage(). Она принимает два аргумента. Первый аргумент — это исходное значение АЦП, полученное из функции adc1_get_raw() для АЦП1 и adc2_get_raw для АЦП2. Второй аргумент — это указатель на результат калибровки АЦП, полученный из функции esp_adc_cal_characterize(), который мы использовали для калибровки АЦП.

В следующей строке кода мы получаем показания напряжения (мВ) канала 0 АЦП1.

Считывание аналоговых входных сигналов с помощью ESP32 ESP-IDF

Теперь мы рассмотрим, как использовать переменный резистор или потенциометр для считывания аналоговых входных сигналов с ESP32. Подключение потенциометра показано на схеме ниже. Два его боковых вывода подключены к VCC и земле соответственно, а средний вывод обеспечивает выходной сигнал.

Схема подключения потенциометра в нашем проекте

Потенциометр будет подключен к аналоговому каналу на нашей плате ESP32, и затем будет измеряться напряжение на нем. Изменение входного напряжения может быть достигнуто вращением верхней ручки потенциометра, а модуль АЦП на нашей плате ESP32 будет преобразовывать эти переменные входные напряжения в соответствующие цифровые значения.

Для нашего проекта с использованием АЦП на базе ESP32 необходимы следующие компоненты:

  1. Плата ESP32.
  2. Макетная плата.
  3. Потенциометр.
  4. Соединительные провода.

На следующем рисунке показана принципиальная схема нашего проекта.

Принципиальная схема проекта для демонстрации работы АЦП в ESP32

Потенциометр питается от 3,3 В от ESP32. Его центральный вывод подключен к GPIO32, который обозначается как ADC1_CH4. Последний вывод подключен к контакту GND ESP32.

Вот как выглядит наша схема после подключения всех компонентов.

Собранная на макетной плате конструкция нашего проекта

Измерение необработанных значений АЦП с помощью ESP-IDF

Откройте VS Code и создайте новый проект ESP-IDF. Теперь перейдите к файлу main.c. Здесь мы определим функции и программный код.

Код АЦП EPS32

Мы будем использовать этот скрипт для измерения исходных значений АЦП, полученных с канала 4 АЦП1.

Код АЦП EPS32 в VS Code

Как работает код?

Для начала мы подключим необходимые библиотеки для этого проекта. Это включает в себя драйвер АЦП, библиотеку калибровки АЦП и библиотеку FreeRTOS. Библиотеки driver/adc.h и esp_adc_cal.h необходимы для драйвера АЦП и библиотеки калибровки АЦП соответственно.

Теперь откалибруем АЦП1 с ослаблением 11 дБ, используя функцию esp_adc_cal_characterize(). Вне цикла создадим экземпляр типа esp_adc_cal_characteristics_t с именем 'adc1_chars'. В нём будет храниться откалиброванное значение АЦП.

Далее установите разрядность АЦП для АЦП1 на значение по умолчанию, используя функцию adc1_config_width().

Установите параметр ослабления канала 4 АЦП1 на 11 дБ. Это задает диапазон входного напряжения АЦП приблизительно в 150-2450 мВ.

Внутри бесконечного цикла мы получим исходное значение АЦП с помощью функции ad1_get_raw() и укажем номер канала АЦП в качестве параметра. Это значение будет сохранено в целочисленной переменной с именем 'adc_value'. Значение АЦП будет выведено в последовательный терминал через задержку в 500 мс.

Компиляция скетча

Для прошивки микросхемы введите следующую команду в последовательном терминале. Не забудьте заменить COM-порт на тот, через который подключена ваша плата.

Ввод команды в VS Code для прошивки ESP32

После успешной прошивки кода значения АЦП (0-4095) отобразятся на терминале. Поворачивайте ручку потенциометра для изменения показаний.

Тестирование работы АЦП ESP32 в терминале

Преобразование необработанных значений АЦП в значения напряжения с помощью ESP-IDF

Далее мы покажем, как получить показания напряжения (мВ) из исходных значений АЦП, полученных в предыдущем примере. Откройте VS Code и создайте новый проект ESP-IDF. Теперь перейдите к файлу main.c. Здесь мы определим функции и программный код.

Код измерения напряжения АЦП на ESP32

Мы будем использовать этот скрипт для измерения исходных значений АЦП, полученных с канала 4 АЦП1, и преобразования их в показания напряжения в милливольтах.

Код измерения напряжения АЦП на ESP32 в VS Code

Как работает код?

Большая часть кода аналогична коду из предыдущего примера. Мы просто покажем, как мы преобразовали исходные значения АЦП для получения показаний напряжения.

Внутри бесконечного цикла мы получим исходное значение АЦП с помощью функции ad1_get_raw() и укажем номер канала АЦП в качестве параметра. Это значение будет сохранено в целочисленной переменной с именем 'adc_value'.

Далее мы преобразуем необработанное значение АЦП в напряжение (мВ) с помощью функции esp_adc_cal_raw_to_voltage(). Эта функция принимает два аргумента. Первый аргумент — это необработанное значение АЦП, сохраненное в целочисленной переменной 'adc_value'. Второй аргумент — это указатель на результат калибровки АЦП, полученный с помощью функции esp_adc_cal_characterize(), который мы использовали для калибровки АЦП. Показания напряжения выводятся на последовательный терминал каждые 500 мс.

Компиляция скетча

Для прошивки микросхемы введите следующую команду в последовательном терминале. Не забудьте заменить COM-порт на тот, через который подключена ваша плата.

После успешной прошивки кода на терминале отобразятся показания напряжения в милливольтах. Поверните ручку потенциометра, чтобы увидеть, как изменяется аналоговое напряжение.

Тестирование работы кода измерения напряжения АЦП на ESP32 в терминале

(Проголосуй первым!)
Загрузка...
3 просмотров

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *