Подключение ADS1115 к Arduino

25-02-2020, 17:59 2 комментариев
В этой статье мы рассмотрим подключение ADS1115 к Ардуино. Речь идет о 16-битном аналого-цифровом преобразователе, оснащенном 4 входами непосредственно для преобразования аналогового сигнала в цифровой. Данный АЦП-модуль основан на одноименном чипе и содержит все необходимые для его функционирования элементы.

Датчик достаточно функционален, потому способен помочь в расширении опциональности микроконтроллера либо возможностей миникомпьютера в сфере работы с аналоговыми сигналами. Кроме того, он несомненно пригодится радиолюбителям, которые нуждаются в измерении напряжения (на конкретных участках цепи) и последующем анализе полученной информации (наконец, ее оцифровке).
Обратимся к техническим характеристикам:
  • напряжение питания: от 2В до 5В;
  • потребляемый ток в непрерывном режиме: 150 мкА;
  • тактовый генератор: интегрирован;
  • разрешение: 16 бит;
  • совместимость с I2C шиной;
  • скорость передачи данных от 8 до 860 выборок в секунду;
  • диапазоны входных сигналов от ± 256 мВ до ± 6.144 В;
  • рабочие температуры: от -40 до +125;
  • габариты платы: 25,5 х 9 мм.
Помимо этого, модуль оснащен программируемым усилителем, цифровым компаратором и внутренним источником опорного напряжения.

Подключение ADS1115 к Ардуино

Электрическая схема датчика показана ниже:

А вот принципиальная схема подключения имеет несколько вариаций – в зависимости от выбора из 4-х возможных адресов подключения ADDR:

Как видим из упомянутого выше скриншота, в одном интерфейсе I2C могут присутствовать сразу четыре датчика ADS1115.
АЦП может функционировать в 2-х режимах: несимметричном и дифференциальном, поэтому схемы измерительной цепи будут также отличаться. Рассмотрим коротко оба варианта. Начнем с первого. Несимметричный режим измерения схематически выглядит следующим образом (на примере платы Arduino Nano):

Заливаем скетч для проверки:
1. #include <Wire.h> // Библиотека для работы с шиной I2C  

2. #include <Adafruit_ADS1015.h> // Библиотека для работы с модулями ADS1115 и ADS1015  

3. Adafruit_ADS1115 ads; // Создание объекта ads для общения через него с модулем  

4.   

5. void setup() {  

6.   Serial.begin(9600); // Инициализация серийного порта  

7.   

8.   // Установка коэффициента усиления 2/3  

9.   ads.setGain(GAIN_TWOTHIRDS);  

10.   

11.   // ВОЗМОЖНЫЕ ВАРИАНТЫ УСТАНОВКИ КУ:                           

12.   // ads.setGain(GAIN_TWOTHIRDS); | 2/3х | +/-6.144V | 1bit = 0.1875mV    |   

13.   // ads.setGain(GAIN_ONE);       | 1х   | +/-4.096V | 1bit = 0.125mV     |  

14.   // ads.setGain(GAIN_TWO);       | 2х   | +/-2.048V | 1bit = 0.0625mV    |  

15.   // ads.setGain(GAIN_FOUR);      | 4х   | +/-1.024V | 1bit = 0.03125mV   |  

16.   // ads.setGain(GAIN_EIGHT);     | 8х   | +/-0.512V | 1bit = 0.015625mV  |  

17.   // ads.setGain(GAIN_SIXTEEN);   | 16х  | +/-0.256V | 1bit = 0.0078125mV |  

18.   

19.   ads.begin(); // Инициализация модуля ADS1115  

20. }  

21.   

22. void loop() {  

23.   // Переменные для хранения значений АЦП каждого канала  

24.   int16_t adc0, adc1, adc2, adc3;  

25.   

26.   adc0 = ads.readADC_SingleEnded(0); // Чтение АЦП нулевого канала  

27.   adc1 = ads.readADC_SingleEnded(1); // Чтение АЦП первого канала  

28.   adc2 = ads.readADC_SingleEnded(2); // Чтение АЦП второго канала  

29.   adc3 = ads.readADC_SingleEnded(3); // Чтение АЦП третьего канала  

30.   

31.   // Расчёт фактических напряжений на каждом канале  

32.   float u0 = float(adc0) * 0.1875 / 1000.0;  

33.   float u1 = float(adc1) * 0.1875 / 1000.0;  

34.   float u2 = float(adc2) * 0.1875 / 1000.0;  

35.   float u3 = float(adc3) * 0.1875 / 1000.0;  

36.     

37.   

38.   // Вывод значения АЦП и фактичесгого напряжения на каналах 0-3  

39.   Serial.print("ADC_AIN0="); Serial.print(adc0);   

40.   Serial.print(" VOLTAGE_AIN0="); Serial.print(u0); Serial.println("V");  

41.   Serial.print("ADC_AIN1="); Serial.print(adc0);  

42.   Serial.print(" VOLTAGE_AIN1="); Serial.print(u1); Serial.println("V");  

43.   Serial.print("ADC_AIN2="); Serial.print(adc0);   

44.   Serial.print(" VOLTAGE_AIN2="); Serial.print(u2); Serial.println("V");  

45.   Serial.print("ADC_AIN3="); Serial.print(adc0);   

46.   Serial.print(" VOLTAGE_AIN3="); Serial.print(u3); Serial.println("V");  

47.   Serial.println(" ");  

48.     

49.   delay(1000);  

50. }
Обратите внимание – для этой прошивки понадобятся 2 библиотеки (найти можно в Интернете). Не забудьте добавить их в среду разработки Arduino IDE, папка C:\Program Files (x86)\Arduino\libraries\
Дифференциальный способ измерения показан на следующей схеме сборки:
Прописываем коды:
1. #include <Wire.h> // Библиотека для работы с шиной I2C  

2. #include <Adafruit_ADS1015.h> // Библиотека для работы с модулями ADS1115 и ADS1015  

3. Adafruit_ADS1115 ads; // Создание объекта ads для общения через него с модулем  

4.   

5. void setup() {  

6. Serial.begin(9600); // Инициализация серийного порта  

7.   

8.   // Установка коэффициента усиления 2/3  

9.   ads.setGain(GAIN_TWOTHIRDS);  

10.   

11.   // ВОЗМОЖНЫЕ ВАРИАНТЫ УСТАНОВКИ КУ:                           

12.   // ads.setGain(GAIN_TWOTHIRDS); | 2/3х | +/-6.144V | 1bit = 0.1875mV    |   

13.   // ads.setGain(GAIN_ONE);       | 1х   | +/-4.096V | 1bit = 0.125mV     |  

14.   // ads.setGain(GAIN_TWO);       | 2х   | +/-2.048V | 1bit = 0.0625mV    |  

15.   // ads.setGain(GAIN_FOUR);      | 4х   | +/-1.024V | 1bit = 0.03125mV   |  

16.   // ads.setGain(GAIN_EIGHT);     | 8х   | +/-0.512V | 1bit = 0.015625mV  |  

17.   // ads.setGain(GAIN_SIXTEEN);   | 16х  | +/-0.256V | 1bit = 0.0078125mV |  

18.   

19.   ads.begin(); // Инициализация модуля ADS1115  

20. }  

21.   

22. void loop() {  

23.   int16_t adc_01_voltage; // Переменная для хранения значения АЦП вольтметра (канал 0-1)  

24.   int16_t adc_23_current; // Переменная для хранения значения АЦП амперметра (канал 2-3)  

25.   

26.   adc_01_voltage = ads.readADC_Differential_0_1(); // Измеряем значение АЦП на канало 0-1  

27.   adc_23_current = ads.readADC_Differential_2_3(); // Измеряем значение АЦП на канало 2-3  

28.   

29.   // Расчёт напряжения  

30.   float u = float(adc_01_voltage) * 0.1875 / 1000.0;  

31.   

32.   // Расчёт падения напряжения на токоизмерительном резисторе 1 Ом  

33.   float ur = float(adc_23_current) * 0.1875 / 1000.0;  

34.   // Расчёт силы тока  

35.   float i = ur / 1.0; // Сопротивление резистора 1 Ом.  

36.   

37.   // Вывод полученных значений в монитор серийного порта  

38.   Serial.print("VOLTAGE="); Serial.print(u); Serial.println("V");  

39.   Serial.print("CURRENT="); Serial.print(i); Serial.println("A");  

40.   

41.   delay(1000);  

42. }
На этом прощаемся! Удачных вам проектов!
Поделись в социальных сетях:
О авторе
Калугин Антон

Программист микроконтроллеров с 8-ми летним стажем, работал в таких компаниях как IBM, ASUS, Microsoft.

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

Все статьи автора
Похожие новости

Сегодня поговорим о том, как воплотить в жизнь подключение FPM10A к Arduino, что это за модуль, где используется, каковы параметры его работы и т.д. Речь идет...

Наш новый информационный обзор посвящен подключению AD9833 к Ардуино. Мы постараемся рассмотреть базовые особенности устройства, его преимущества и схему...

FM радио модуль стерео RDA5807M для Ардуино - отличное решение для создателей интересных проектов, в которых понадобится FM-радиоприемник. Модуль имеет ряд...

На повестке дня - подключение AM2320 к Ардуино. Тема очень занятная по той простой причине, что подобные датчики являются просто «мастхевом» для современных...

В новом информационном обзоре рассматриваем GSM модуль SIM800L к Arduino. Почему выбрано именно это устройство? Во-первых, оно достаточно известно и популярно...

2 комментария
  1. Александр
    8 апреля 2021 13:47 Александр

    Здравствуйте. При опробовании ads1115 выяснилось, что получаемое целое всегда кратно 16, то есть 4 младших бита всегда равны 0. И выходит, что реальная дискретность измерений всё равно 12 бит, как в ads1015. Использовалась стандартная библиотека Adafruit. Так ли это? Можно ли увеличить точность, чтобы последние 4 бита тоже участвовали в преобразовании? 16 бит - только математически, увы.

    replyОтветить
  2. Андрей
    28 декабря 2023 18:00 Андрей

    Здравствуйте. Помогите с подключением 4 ads1115. Не получается выводить информацию на экран с 4х АЦП.

    replyОтветить
Оставить комментарий