В этой статье мы рассмотрим процесс подключения 16-битного модуля АЦП ADS1115 к плате ESP32. Плата коммутации ADS1115 представляет собой аналого-цифровой преобразователь (АЦП) высокого разрешения , который можно использовать с различными микроконтроллерами и платами на их основе, включая Arduino, STM32 и ESP8266/32. В частности, ESP32 — это мощный микроконтроллер со встроенными возможностями Wi-Fi и Bluetooth, что делает его идеальным выбором для приложений Интернета вещей (IoT).
ESP32 имеет встроенный 12-битный АЦП, который обеспечивает более высокое разрешение, чем 10-битный АЦП, используемый на платах Arduino. Однако ADS1115 может похвастаться еще более высоким разрешением в 16 бит, предлагая превосходную производительность с точки зрения измерения напряжения. Наименьшее напряжение, которое может измерить ESP32, составляет 3,3 В / 4096 = 0,0008 В (или 0,8 мВ), в то время как ADS1115 может измерять всего 5 В / 65536 = 0,000076 В (76 мкВ). Это делает ADS1115 отличным выбором, когда требуются точные измерения напряжения. Если вам нужна большая точность до 0,3 мкВ, вы можете использовать 24-битный модуль АЦП ADS1220.
В следующих разделах этой статьи мы предоставим пошаговые инструкции по подключению модуля ADS1115 к ESP32, настройке связи I2C между ними и написанию кода для чтения и обработки аналоговых сигналов с использованием Arduino IDE. К концу этого руководства вы будете иметь четкое представление о том, как подключить 16-битный модуль АЦП ADS1115 к ESP32 и использовать весь его потенциал для ваших проектов.
Ранее на нашем сайте мы рассматривали подключение модуля АЦП ADS1115 к плате Raspberry Pi. Также можете прочитать статью о том, что такое АЦП и как он работает.
Необходимые компоненты
- Модуль ESP32 (купить на AliExpress).
- ЖК дисплей 16x2 с модулем I2C (купить на AliExpress).
- Модуль АЦП ADS1115 (купить на AliExpress).
- Потенциометр 10 кОм - 2 шт. (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Контакты и точность АЦП ESP32
ESP32 — это мощный микроконтроллер с интегрированными возможностями Wi-Fi и Bluetooth. Он имеет несколько контактов аналого-цифровых преобразователей (АЦП), которые можно использовать для измерения аналоговых сигналов и преобразования их в цифровые значения. ESP32 имеет два АЦП - это АЦП1 (ADC1) и АЦП2 (ADC2) с общим количеством 18 доступных каналов АЦП.
- ADC1 имеет 8 каналов (GPIO32 - GPIO39)
- ADC2 имеет 10 каналов (GPIO0, GPIO2, GPIO4, GPIO12 - GPIO15 и GPIO25 - GPIO27)
Точность: АЦП ESP32 имеют разрешение 12 бит, что означает, что они могут представлять аналоговый сигнал с использованием 4096 дискретных уровней. Однако из-за внутреннего шума и нелинейных характеристик эффективное разрешение обычно составляет около 10-11 бит.
Чтобы повысить точность показаний АЦП на ESP32, вы можете:
- Используйте встроенный датчик Холла для калибровки.
- Реализуйте избыточную выборку и усреднение для снижения шума.
- Для лучшей стабильности используйте внешний источник опорного напряжения.
- Если требуется более высокая точность, рассмотрите возможность использования внешнего модуля АЦП, например ADS1115.
Помните, что каналы ADC2 используются совместно с функциями Wi-Fi, поэтому, если вы используете Wi-Fi, лучше использовать каналы ADC1, чтобы избежать потенциальных конфликтов или помех в показаниях АЦП.
Микросхема ADS1115
ADS1115 — это прецизионная, маломощная, 16-битная, совместимая с I2C ИС (интегральная схема) аналого-цифрового преобразователя.
Особенности ADS1115
- Разрешение 16 бит.
- Четыре (4) канала с несимметричным входом или два (2) канала с дифференциальным входом.
- Интерфейс протокола I2C.
- Программируемый компаратор.
- Широкий ассортимент поставок.
- Низкое потребление тока.
- Режим непрерывного преобразования.
- Программируемая скорость передачи данных.
- Программируемый компаратор.
- Одноцикловое осаждение.
- Внутренний источник опорного напряжения с малым дрейфом.
- Внутренний генератор
- Широкий диапазон рабочих температур.
- Доступно в сверхмалом корпусе X2QFN.
Конфигурация выводов ADS1115
На рисунке ниже показана конфигурация выводов микросхемы ADS1115.
- Контакт 1 — это контакт ADDR, который выбирает адрес I2C для чипа.
- Контакт 2 — это контакт оповещения/готовности, который служит в качестве сигнала готовности данных и оповещения.
- Контакт 3 — это клемма GND.
- Контакты 4, 5, 6 и 7 — это четыре (4) входных контакта АЦП. Мы можем использовать эти контакты как четыре (4) несимметричных входа или два (2) дифференциальных входа.
- Контакт 8 — это положительный контакт источника питания, который принимает напряжение от 2,0 В до 5,5 В.
- Контакты 9 и 10 являются клеммами для интерфейса I2C, SDA и SCL соответственно.
Функциональная блок-схема ADS1115
Ниже представлена функциональная схема микросхемы ADS1115:
Сначала мультиплексор выбирает входной сигнал. Затем этот выбранный сигнал поступает в программируемый усилитель усиления (PGA), который можно запрограммировать на усиление меньших сигналов до того, как произойдет преобразование.
Затем 16-битный преобразователь Delta Sigma обрабатывает входной сигнал. Этот преобразователь использует собственный встроенный опорный источник напряжения и генератор для измерения входного сигнала. После завершения преобразования полученные данные отправляются на интерфейс I2C. Кроме того, компаратор генерирует сигнал для внешнего интерфейса, указывая, что преобразованный результат доступен для извлечения.
Типовая схема подключения соединения ADS1115
Основные соединения I2C для ADS1115 можно увидеть на следующем изображении.
ADS1115 совместим с контроллерами I2C стандартного, быстрого и высокоскоростного режима, что позволяет ему напрямую взаимодействовать с ними. ADS1115 функционирует с любым периферийным устройством I2C микроконтроллера, включая периферийные устройства I2C только с ведущим устройством и с одним ведущим устройством.
Более подробную информацию см. в техническом описании ADS1115.
Модуль (коммутационная плата) ADS1115
ADS1115 доступен в корпусах X2QFN и VSSOP, которые не подходят для прототипирования. В результате для использования с ESP32 или любым другим микроконтроллером необходим модуль ADS1115 или отладочная плата.
Эти модули можно найти у разных производителей по доступным ценам. Их конструкция, удобная для макетных плат, делает их идеальными для прототипирования и тестирования приложений, что обеспечивает легкую интеграцию.
Распиновка модуля ADS1115
Модуль ADS1115 имеет общее количество контактов равное 10.
Номер контакта | Название контакта | Описание контакта |
1 | VDD | Питание: от 2,0 В до 5,5 В |
2 | GND | Земля (общий провод) |
3 | SCL | Последовательный вход синхронизации: синхронизирует данные на SDA (используется для связи I2C) |
4 | SDA | Последовательные данные: передача и прием данных (используется для связи I2C) |
5 | ADDR | Выбор адреса I2C (ведомый) |
6 | ALERT/RDY | Цифровой компараторный выход или готовность к преобразованию |
7 | AIN0 | Дифференциальный канал 1: несимметричный вход канала 1 или отрицательный вход |
8 | AIN1 | Дифференциальный канал 1: несимметричный вход канала 2 или отрицательный вход |
9 | AIN2 | Дифференциальный канал 2: несимметричный вход канала 3 или положительный вход |
10 | AIN3 | Дифференциальный канал 2: несимметричный вход канала 4 или отрицательный вход |
Как видите, контакты модуля почти полностью повторяют контакты микросхемы.
Схема модуля ADS1115
Приведенная выше принципиальная схема представляет собой версию модуля ADS1115 от компании Adafruit.
Она следует типичному подключению для чипа ADS1115. Подтягивающие резисторы 10 кОм установлены на выводах I2C и Alert. Также между выводом VDD и GND установлен конденсатор емкостью 1 мкФ, который служит в качестве развязывающего конденсатора.
Взаимодействие модуля ADS1115 с ESP32
Схема подключения модуля АЦП ADS1115 к плате ESP32 представлена на следующем рисунке.
Сначала подключите выводы VDD и GND модуля к выводам 3.3V и GND ESP32 соответственно. Затем подключите выводы ADS1115 I2C (SDA и SCL) к выводам I2C (SDA=GPIO21 и SCL=GPIO22) ESP32. Вывод ADDR чипа должен быть подключен либо к VDD, SDA, либо к SCL, в зависимости от того, какой из адресов 0x49, 0x4A или 0x4B вы хотите использовать. Обратите внимание, что вывод ADDR по умолчанию подтянут к земле резистором 10K.
Если вы хотите использовать вывод ALERT/READY модуля ADS1115, вы должны подключить его к цифровому выводу ESP32. Этот вывод имеет два назначения. Во-первых, вы можете использовать его для преобразования, управляемого прерываниями, где он служит сигналом READY данных. Во-вторых, вы можете использовать его с программируемым выходным компаратором для определения порогов преобразования. В этом случае он служит сигналом ALERT.
ADS1115 имеет четыре выхода АЦП, A0, A1, A2 и A3, что означает, что к этому модулю можно подключить до четырех аналоговых датчиков. Например, для проверки показаний модуля можно использовать потенциометр, который следует подключить согласно схеме, представленной выше.
Установка библиотеки ADS1115
Для модуля ADS1115 доступно несколько библиотек. При просмотре через менеджер библиотек вы увидите библиотеки от разных разработчиков.
Из всех доступных библиотек мы можем попробовать использовать одну из стабильных библиотек для нашего приложения - это библиотека от Adafruit. Вы можете загрузить эту библиотеку по следующей ссылке.
Библиотека имеет функциональность для установки тактовой частоты I2C, установки программируемого усиления, рабочего режима и скорости передачи данных. Используя эту библиотеку, мы можем считывать данные АЦП датчика в одиночном режиме, дифференциальном режиме и непрерывном режиме.
Базовый исходный код программы
Используя базовый пример кода из папки примеров Adafruit ADS1115, мы можем проверить работу датчика.
Скопируйте следующий код и загрузите его на плату ESP32.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
#include <Adafruit_ADS1X15.h> Adafruit_ADS1115 ads; /* Use this for the 16-bit version */ //Adafruit_ADS1015 ads; /* Use this for the 12-bit version */ void setup(void) { Serial.begin(115200); Serial.println("Getting single-ended readings from AIN0..3"); Serial.println("ADC Range: +/- 6.144V (1 bit = 3mV/ADS1015, 0.1875mV/ADS1115)"); // The ADC input range (or gain) can be changed via the following // functions, but be careful never to exceed VDD +0.3V max, or to // exceed the upper and lower limits if you adjust the input range! // Setting these values incorrectly may destroy your ADC! // ADS1015 ADS1115 // ------- ------- // ads.setGain(GAIN_TWOTHIRDS); // 2/3x gain +/- 6.144V 1 bit = 3mV 0.1875mV (default) // ads.setGain(GAIN_ONE); // 1x gain +/- 4.096V 1 bit = 2mV 0.125mV //ads.setGain(GAIN_TWO); // 2x gain +/- 2.048V 1 bit = 1mV 0.0625mV // ads.setGain(GAIN_FOUR); // 4x gain +/- 1.024V 1 bit = 0.5mV 0.03125mV // ads.setGain(GAIN_EIGHT); // 8x gain +/- 0.512V 1 bit = 0.25mV 0.015625mV // ads.setGain(GAIN_SIXTEEN); // 16x gain +/- 0.256V 1 bit = 0.125mV 0.0078125mV if (!ads.begin()) { Serial.println("Failed to initialize ADS."); while (1); } } void loop(void) { int16_t adc0, adc1, adc2, adc3; float volts0, volts1, volts2, volts3; adc0 = ads.readADC_SingleEnded(0); adc1 = ads.readADC_SingleEnded(1); adc2 = ads.readADC_SingleEnded(2); adc3 = ads.readADC_SingleEnded(3); volts0 = ads.computeVolts(adc0); volts1 = ads.computeVolts(adc1); volts2 = ads.computeVolts(adc2); volts3 = ads.computeVolts(adc3); Serial.println("-----------------------------------------------------------"); Serial.print("AIN0: "); Serial.print(adc0); Serial.print(" "); Serial.print(volts0); Serial.println("V"); Serial.print("AIN1: "); Serial.print(adc1); Serial.print(" "); Serial.print(volts1); Serial.println("V"); Serial.print("AIN2: "); Serial.print(adc2); Serial.print(" "); Serial.print(volts2); Serial.println("V"); Serial.print("AIN3: "); Serial.print(adc3); Serial.print(" "); Serial.print(volts3); Serial.println("V"); } |
После загрузки кода откройте Serial Monitor (окно монитора последовательной связи) - в нем вы увидите значения АЦП для всех 4 выходов AIN0, AIN1, AIN2, AIN3 вместе с выходным напряжением.
Поскольку мы использовали только два потенциометра для AIN0 и AIN1, мы получим изменение этих значений при вращении потенциометра.
Тестирование точности модуля ADS1115
Теперь мы оценим точность модуля АЦП ADS1115. Чтобы оценить его точность, мы можем использовать ЖК-дисплей для отображения значения АЦП и измеренных напряжений. Затем мы можем использовать мультиметр для измерения обнаруженного напряжения и сравнения его с напряжением, отображаемым на последовательном мониторе.
Схема подключения ADS1115, ESP32 и ЖК-дисплея
Подключите ЖК-дисплей к предыдущей цепи согласно следующей принципиальной схеме.
Подключите выводы SDA и SCL ЖК-дисплея к GPIO21 и GPIO22 ESP32. Обеспечьте подключение 5 В VCC и GND к ЖК-дисплею с помощью выводов Vin и GND ESP32.
Исходный код программы
Для компиляции кода требуется библиотека I2C LCD. Затем вы можете скопировать следующий код и загрузить его на плату ESP32.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
#include <Adafruit_ADS1X15.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); Adafruit_ADS1115 ads; /* Use this for the 16-bit version */ //Adafruit_ADS1015 ads; /* Use this for the 12-bit version */ void setup(void) { Serial.begin(115200); Serial.println("Getting single-ended readings from AIN0..3"); Serial.println("ADC Range: +/- 6.144V (1 bit = 3mV/ADS1015, 0.1875mV/ADS1115)"); // The ADC input range (or gain) can be changed via the following // functions, but be careful never to exceed VDD +0.3V max, or to // exceed the upper and lower limits if you adjust the input range! // Setting these values incorrectly may destroy your ADC! // ADS1015 ADS1115 // ------- ------- // ads.setGain(GAIN_TWOTHIRDS); // 2/3x gain +/- 6.144V 1 bit = 3mV 0.1875mV (default) // ads.setGain(GAIN_ONE); // 1x gain +/- 4.096V 1 bit = 2mV 0.125mV //ads.setGain(GAIN_TWO); // 2x gain +/- 2.048V 1 bit = 1mV 0.0625mV // ads.setGain(GAIN_FOUR); // 4x gain +/- 1.024V 1 bit = 0.5mV 0.03125mV // ads.setGain(GAIN_EIGHT); // 8x gain +/- 0.512V 1 bit = 0.25mV 0.015625mV // ads.setGain(GAIN_SIXTEEN); // 16x gain +/- 0.256V 1 bit = 0.125mV 0.0078125mV lcd.init(); lcd.backlight(); if (!ads.begin()) { Serial.println("Failed to initialize ADS."); while (1); } } void loop(void) { int16_t adc0, adc1, adc2, adc3; float volts0, volts1, volts2, volts3; adc0 = ads.readADC_SingleEnded(0); adc1 = ads.readADC_SingleEnded(1); adc2 = ads.readADC_SingleEnded(2); adc3 = ads.readADC_SingleEnded(3); volts0 = ads.computeVolts(adc0); volts1 = ads.computeVolts(adc1); volts2 = ads.computeVolts(adc2); volts3 = ads.computeVolts(adc3); Serial.println("-----------------------------------------------------------"); Serial.print("AIN0: "); Serial.print(adc0); Serial.print(" "); Serial.print(volts0); Serial.println("V"); Serial.print("AIN1: "); Serial.print(adc1); Serial.print(" "); Serial.print(volts1); Serial.println("V"); Serial.print("AIN2: "); Serial.print(adc2); Serial.print(" "); Serial.print(volts2); Serial.println("V"); Serial.print("AIN3: "); Serial.print(adc3); Serial.print(" "); Serial.print(volts3); Serial.println("V"); lcd.clear(); lcd.setCursor(0, 0); lcd.print("ADC0:"); lcd.print(adc0); lcd.print(" "); lcd.print(volts0); lcd.print("V"); lcd.setCursor(0, 1); lcd.print("ADC1:"); lcd.print(adc1); lcd.print(" "); lcd.print(volts1); lcd.print("V"); delay(1000); } |
Результаты тестирования
После загрузки кода модуль становится готовым к тестированию. Для этого понадобится мультиметр.
На ЖК-дисплее отобразится значение АЦП и измеренное напряжение.
Мы используем два потенциометра для ввода напряжения АЦП и отображения их обоих на ЖК-дисплее. Одно из измеренных напряжений, показанных мультиметром, составляет 3,28 В, а на ЖК-дисплее отображается 3,31 В.
Максимальное выходное напряжение АЦП модуля составляет 3,3 В, а минимальное — 0 В.
При измерении более низкого напряжения, при 0,84 В на ЖК-дисплее мультиметр показал 0,827 В. Вы можете использовать калькулятор АЦП, чтобы вручную рассчитать значение АЦП.
Таким образом, можно сделать вывод, что 16-разрядный модуль АЦП ADS1115 имеет хорошую точность и может использоваться для многоцелевых приложений.
Согласно другим тестам, это устройство имеет заявленную типичную точность 0,01%, но его максимальная точность составляет 0,15%. Эта точность включает в себя все источники ошибок, такие как опорное напряжение, ошибка усиления, смещение и шум .