ADS1115 – описание и подключение 16-битного АЦП

16-битный АЦП ADS1115-описание и подключение
В этой статье я рассмотрю 16-битный аналого-цифровой преобразователь ADS1115, который продается в Китае в виде модуля АЦП под платформу Arduino, хотя конечно не имеет отношения к ней. Отличительными характеристиками этого АЦП является низкое энергопотребление, всего 150 мкА в рабочем режиме, встроенный программируемый усилитель входного сигнала, программируемая частота дискретизации, режим пониженного энергопотребления, выходной компаратор.

На следующей картинке представлена схема модуля АЦП ADS1115, который был куплен здесь:
Схема модуля АЦП ADS1115
Всего в микросхеме имеется 4 входа (AIN0-AIN3), которые могут использоваться как два дифференциальных входа для измерения разности напряжения между входами, либо как 4 отдельных несимметричных входа, в этом случае напряжение измеряется между одним из входов и общим проводом. Необходимую комбинацию входов можно задавать с помощью встроенного мультиплексора, структура которого показана на картинке ниже:
ADS1115 - структурная схема мультиплексора
Как видно на вход внутреннего АЦП (AINp, AINn) в один момент времени может подключаться только одна комбинация входов. Для дифференциального входа, в случае, когда AINp>AINn, напряжение считается положительным, если AINn>AINp, то напряжение отрицательное. При использовании несимметричного входа измерение напряжения производится относительно общего провода, в этом случае измеряется только положительное напряжение. Микросхема ADS1115 не предназначена для измерения отрицательного напряжение относительно общего провода, на входы можно подавать только положительное напряжение.

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

PGAFS
2/3±6,144 В
1±4,096 В
2±2,048 В
4±1,024 В
8±0,512 В
16±0,256 В

Напряжение питания АЦП должно быть больше или равно диапазону измерения, это касается коэффициентов 2/3 и 1, которые позволяют измерять значения вплоть до величины напряжения питания АЦП. Если напряжение питания меньше предела измерения, выходной код АЦП (результат преобразования) не достигнет максимального значения для выбранного предела измерения. Наибольший предел FS=6,144 В (для коэффициента 2/3) отражает полную шкалу АЦП ADS1115, но это не означает что можно подавать такое значение, напряжение подаваемое на вход АЦП не должно превышать VDD+0,3 В. В случае максимального напряжения питания (5,5 В) измеряемое напряжение не должно превышать 5,5 В+0,3 В=5,8 В.

В следующей таблице представлено соответствие выходного кода АЦП в зависимости от входного напряжения:

Входной сигнал, Vin=AINp-AINnЗначение кода АЦПДесятичное значение
≥FS7FFFh32767
+FS/(2 в 15 степени)0001h1
000
-FS/(2 в 15 степени)FFFFh65535
≤-FS8000h32768

При измерении напряжения на несимметричном входе используется только половина шкалы выходного кода (0-7FFFh), так как в этом случае измеряется только положительное напряжение.

Для передачи данных ADS1115 использует стандартный широко распространенный интерфейс I2C. В этом интерфейсе для связи с устройством необходимо передать его адрес, длина которого составляет 7 бит. Адрес микросхемы задается с помощью вывода ADDR, в следующей таблице приведены адреса в зависимости от того куда подключается вывод ADDR:

Подключение вывода ADDRАдрес микросхемы ADS1115
GND1001000
VDD1001001
SDA1001010
SCL1001011

На модуле этот вывод подключен к общему проводу через резистор, соответственно адрес будет равен значению 1001000.

ADS1115 поддерживает стандартную скорость передачи до 100 Кбит/сек (100 кГц), высокую скорость до 400 Кбит/сек (400 кГц), а также ультравысокую скорость до 3,4 Мбит/сек (3,4 МГц). Из даташита: для активации ультравысокой скорости необходимо после условия “Старт”, вместо адресного байта, отправить байт со значением 00001xxx, при этом АЦП не выдает подтверждение на этот байт, после чего происходит переключение на ультравысокую скорость, действие которой заканчивается после условия “Стоп”. Для работы на скоростях до 400 Кбит/сек ничего предпринимать не надо.

АЦП имеет всего 4 внутренних регистра, все регистры 16-ти битные, соответственно для каждой сессии записи/чтения по интерфейсу I2C передается 2 информационных байта (кроме байта адреса регистра). Описание регистров приведено ниже в таблице:

НазваниеОписаниеАдрес
Conversion registerРегистр хранения результата преобразования00000000
Config registerКонфигурационный регистр00000001
Lo_thresh registerРегистр уставки, минимальное значение00000010
Hi_thresh registerРегистр уставки, максимальное значение00000011

С помощью конфигурационного регистра осуществляется управление АЦП, описание регистра приведено ниже в таблице:

БитНазвание битаЗначение битаОписание
15OS
Бит определяет состояние устройства
Бит может быть записан только в режиме пониженного потребления
Для записи
0Нет эффекта
1Начать преобразование, для режима одиночного преобразования (пониженное потребление)
Для чтения
0Выполняется преобразование
1Преобразование закончено
14-12MUX
Настройка мультиплексора
000AINp=AIN0 и AINn=AIN1 (умолч)
001AINp=AIN0 и AINn=AIN3
010AINp=AIN1 и AINn=AIN3
011AINp=AIN2 и AINn=AIN3
100AINp=AIN0 и AINn=GND
101AINp=AIN1 и AINn=GND
110AINp=AIN2 и AINn=GND
111AINp=AIN3 и AINn=GND
11-9PGA
Коэффициент усиления усилителя
000FS=±6,144 В
001FS=±4,096 В
010FS=±2,048 В  (умолч.)
011FS=±1,024 В
100FS=±0,512 В
101FS =±0,256 В
110FS =±0,256 В
111FS =±0,256 В
8MODE
Режим работы
0Непрерывное преобразование
1Одиночное преобразование, режим пониженного потребления (умолч)
7-5DR
Частота дискретизации
0008 ГЦ
00116 ГЦ
01032 ГЦ
01164 ГЦ
100128 ГЦ (умолч)
101250 ГЦ
110475 ГЦ
111860 ГЦ
4COMP_MODE
Тип компаратора
0Компаратор с гистерезисом (умолч)
1Компаратор без гистерезиса
3COMP_POL
Полярность компаратора
0Низкий активный уровень (умолч)
1Высокий активный уровень
2COMP_LAT
Режим компаратора
0Компаратор без “защелки” (умолч)
1Компаратор с “защелкой”
1-0COMP_QUE
Управление компаратором
00Установка сигнала на выходе после одного преобразования
01Установка сигнала на выходе после двух преобразований
10Установка сигнала на выходе после четырех преобразований
11Компаратор выключен (умолч)

АЦП может работать в 2-х режимах: непрерывное преобразование и одиночное. В случае одиночного преобразования, АЦП автоматически переходит в режим пониженного энергопотребления, после окончания преобразования.

Для запуска одиночного преобразования необходимо установить бит OS в 1 (бит может быть записан только в состоянии пониженного потребления). Этот же бит определяет статус преобразования, если бит равен 0, идет преобразование, 1 – преобразование закончено. Путем чтения конфигурационного регистра можно определить готовность результата преобразования.

Режим одиночного преобразования позволяет экономить энергию, например, вместо режима непрерывного преобразования с частотой дискретизации 8 Гц, можно установить максимальную частоту дискретизации 860 Гц, а со стороны управляющего устройства (микроконтроллера) запускать одиночные преобразования с частотой 8 Гц. Время преобразования АЦП для частоты дискретизации 860 Гц составит 1,2 мс, остальные 125-1,2=123,8 мс АЦП будет находиться в режиме пониженного энергопотребления, тем самым потребляя 1/100 часть энергии, от режима непрерывного преобразования.

ADS1115 имеет встроенный компаратор (вывод ALERT/RDY), который можно использовать в качестве оповещения для управляющего устройства (микроконтроллера). Компаратор используется совместно с двумя регистрами уставки (контролируемого параметра): Hi_thresh, Lo_thresh. В конфигурационном регистре можно настраивать тип компаратора (с гистерезисом и без него), активный логический уровень выхода компаратора (вывода ALERT/RDY), режим “защелки” (сохранение уровня сигнала на выходе).

Компаратор с гистерезисом срабатывает, если измеряемое напряжение превышает значение в регистре Hi_thresh, и возвращается в исходное состояние, когда величина напряжение меньше значения в регистре Lo_thresh. Под словом “срабатывает” следует понимать установку активного логического уровня, который зависит от бита COMP_POL.

Компаратор без гистерезиса срабатывает в случае, когда измеряемое напряжение выходит за рамки, установленные в регистрах Hi_thresh, Lo_thresh.

Для правильной работы компаратора значение уставки в регистре Hi_thresh (по умолчанию 7FFFh) должно быть больше значения в регистре Lo_thresh (по умолчанию 8000h). Кроме этого вывод компаратора ALERT/RDY необходимо подтянуть через резистор к линии питания, на модуле это уже сделано.

Ниже представлена диаграмма работы компаратора:
Диаграмма компаратора ADS1115
Если включен режим “защелки” (COMP_LAT=1), то после срабатывания компаратора, уровень сигнала на выходе сохраняется и не меняется, то есть запоминается. Для снятия этого условия и дальнейшей работы компаратора необходимо прочитать результат преобразования из регистра Conversion register, или послать специальную команду предупреждения SMBus (00011001). Получив команду АЦП должен выдать ответ (ALERT) в виде своего адреса, после чего компаратор продолжает работу. Честно говоря, я не вникал в подробности этой команды, нашел только информацию, что она позволяет определить неисправный АЦП.

С помощью бита COMP_QUE можно настроить компаратор на срабатывание после одного, двух, четырех преобразований, или выключить его.

Еще одной полезной функцией компаратора является оповещение по окончании преобразования, для включения которого необходимо установить старший бит регистра Hi_thresh в 1, а старший бит регистра Lo_thresh в 0. В этом случае бит активного уровня COMP_POL, а также бит управления компаратором COMP_QUE продолжают действовать, биты COMP_MODE и COMP_LAT не влияют на выход компаратора.

Если функция оповещения включена, то в режиме непрерывного преобразования, после окончания каждого измерения на выходе компаратора появляется импульс длительностью 8 мкс. В режиме одиночного преобразования на выходе компаратора устанавливается низкий логический уровень по окончании преобразования, если бит COMP_POL установлен в 0. Тем самым эту функцию удобно использовать в качестве прерывания для управляющего устройства, чтобы не опрашивать постоянно бит OS, а сразу считывать результат преобразования.

Я подключил АЦП ADS1115 к микроконтроллеру PIC16F628A, для отображения величины измеряемого напряжения использовал цифровой индикатор на драйвере MAX7219, схема на картинке ниже:
ADS1115 схема подключения к МК
На стороне микроконтроллера интерфейс I2C реализован программно. Светодиод HL1 загорается в случае возникновения ошибки в процессе передачи данных по интерфейсу I2C, светодиод HL2 светится во время процесса преобразования АЦП. Напряжение на вход АЦП (AIN0) подается через переменный резистор R2. Используется режим одиночного преобразования с частотой дискретизации 860 Гц, с включенной функцией оповещения по окончании преобразования, измерения производятся каждые 0,6 секунд.
Код программы приведен ниже:

Сначала в регистр АЦП Hi-tresh, передается значение 0xFFFF, а в регистр Lo_thresh значение 0x0000, тем самым активируется функция компаратора об оповещении после окончания преобразования. Далее настраивается конфигурационный регистр (Config register) с одновременным запуском преобразования. После чего выполняется опрос вывода компаратора (ALERT/RDY) на факт окончания преобразования. На время выполнения преобразования включается светодиод HL2.

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

После срабатывания компаратора, считываем результат преобразования из регистра АЦП Conversion register. Полученный результат делим на 16, чтобы получить значение напряжения в милливольтах, данное действие равносильно уменьшению разрешения с 16 до 12 бит. Далее результат деления выводим на цифровой индикатор, после паузы в 0,6 секунд повторяем весь цикл, начиная с записи конфигурационного регистра АЦП, тем самым запуская новое преобразование. Если установлен другой предел измерения, то делить надо на другое число: для предела FS=±4,096В делим результат преобразования на 8, для FS=±2,048В на 16, для FS=±1,024В соответственно на 32, и так далее. Для наибольшего предела FS=±6,144В в код программы нужно добавить арифметические операции, так как простым делением не обойтись, готовый исходник и прошивка для наибольшего предела приведены в конце статьи.

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

Модуль 16-битного АЦП ADS1115ADS1115 - макетная плата

Ниже представлен видеоролик демонстрирующий работу АЦП ADS1115:

Прошивка МК и исходник для подключения АЦП ADS1115 (предел измерения напряжения 2,048В)
Прошивка МК и исходник АЦП ADS1115 (предел измерения напряжения 6,144В)

У этой записи 28 комментариев

  1. А какое минимальное напряжение он может измерить? Подойдет ли для измерения термопары хромель-копель? Там нужны 0,06мВ на градус!

    1. Для коэффициента усиления PGA=16 предел измеряемого напряжения равен ±0,256 В, при этом минимальное измеряемое напряжение составит 0,256/32768 = 0,0078 мВ, в случае вашей термопары погрешность составит примерно 1 градус, в пределах входного напряжения от 0 до 0,256 В.

  2. День добрый.
    Спасибо за статью.

    Возник вопрос, на видео у Вас шум ADC1115 составляет до 2 единиц. У меня шум на потенциометре до 50 единиц от встроенного DC ардуины. Вы пользуетесь лабораторным блоком питания или указанные на схеме конденсаторы С1, С2 решают проблему?

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

      Ну а вообще шум может зависеть от качества переменного резистора, а также качества соединений (проводов) и контактов. Сглаживающие конденсаторы имеют значение, но в данном примере C1, C2 влияют слабо, так как на выходе блока питания уже стоит конденсатор большой емкости.

      1. Спасибо за ответ.

        Пока питаю от встроенного DC, используется китайский резистор, соединения как у Вас на видео на макетке.

        Сейчас попробую проверить на регулируемом блоке питания (у меня простой китаец) и промышленный датчик линейного перемещения, увы конденсаторов пока нет под рукой.

        В проекте планируется использование импульсного блока питания на 5V, или DC-DC 24V-5V, пайка, колодки и промышленная резистивная линейка.

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

    Большое спасибо.

    1. Отлично, рад был помочь.

      1. Длительный тест, увы не радуют. Обычно около 10 единиц, но иногда проскакивает 50.

        Получается 50 единиц, с настройками 2/3x gain +/- 6.144V что-то около 9.5mV, для меня это много. Но тут надо забирать осциллограф с работы и читать документацию, раньше выходных не доберусь.

  4. По какой формуле преобразуются показатели АЦП в напряжение?

    1. Для случая AINp > AINn получаем Vизм=(4096*Xацп) / (PGA*32768), где Xацп – код ацп в десятичной форме в пределах от 0 до 32767, PGA – коэфф. усиления.

      Для случая AINp < AINn получаем Vизм=(4096*(65536-Xацп)) / (PGA*32768), Xацп - код ацп в десятичной форме в пределах от 32768 до 65535.

  5. А как измерять не только положительные напряжения? Есть дешевый аналог с такой возможностью?
    Или здесь чтото схемное можно придумать? инвертирование например и отдельный пин на контроллер (чтобы понимать что с минуса пришло)?

    1. Сообщите на почту ,чтоб знал что ответили

  6. подскажите пожалуйста такой момент, мне надо отпросить второй вход, а установлен первый, я записываю конфигурационный регистр (там будет старт преобразования, и установка второго входа), для какого входа я сниму значения ацп?
    или мне надо записать конфигурационный регистр(установить второй вход), а затем ещё раз записать конфигурационный регистр с стартом преобразования?

    пс: ацп-шки нету, она в пути, вот сижу код пишу

    1. Выбрать канал и начать старт преобразования можно одним действием при записи конфигурационного регистра, при этом измерения будут производится для канала, который был передан в конфигурационный регистр.

  7. Здравствуйте.
    Хотел бы спросить, сколько суммарно занимает процесс преобразования АЦП и отправки на МК, если не будем учитывать время реакции МК? Пока АЦП едет, так бы сам посчитал.
    Спасибо

    1. Забыл добавить, в режиме непрерывного преобразования на 860Гц

  8. Здравствуйте!
    > Микросхема ADS1115 не предназначена для измерения отрицательного напряжение относительно общего провода, на входы можно подавать только положительное напряжение.

    В этом предложении речь идет только о режиме несимметричного входа, или о дифференциальном тоже? Другими словами, можно ли в режиме дифференциального входа изменить напряжение, когда на одном из входов положительное относительно общего, а на другом – отрицательное отностительного общего?

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

  9. Здравствуйте. Способен ли ADS1115 выйти из строя, если напряжение на одном из входов превысит установленный диапазон? Например, если я выставлю коэффициент 16 (±0,256 В), а на входе окажется напряжение питания (+3,3В).

    1. У него на входе два диода Шоттки – один подтянут к питанию, второй к земле. Если вдруг превысите диапазон, то тут два варианта – если есть ограничительный резистор по входу или вход подключен к высокоимпедансному источнику, то АЦП просто уйдет в зашкал и все. Если нет резистора и источник низкоимпедансный, то сначала сгорит диод, а потом весь АЦП.

  10. Существует ли возможность изменять коэффициент усиления при опросе разных входов. К примеру на шунте максимальный синал 200мв, а на делителе 400мв.

  11. Постоянно считываю с ADS1115 значения с обнуленными 4-мя младшими разрядами. Т.е. наибольшее значение смог считать только 32752. Ну и далее – 32736, 32720. В чем дело, не могу понять. Ардуино мега 2560

    Код инициализации:

    Wire.begin();
    Wire.beginTransmission(0x48);
    Wire.write(0x01);
    Wire.write(0x40); // Wire.write(0x40);
    Wire.write(0xA3); // Wire.write(0x83);
    Wire.endTransmission();
    Wire.setClock(400000);

    Код считывания:

    Wire.beginTransmission(0x48);
    Wire.write(0x00);
    Wire.endTransmission();
    Wire.requestFrom(0x48, 2);
    ReadValue[ix] = ((Wire.read() << 8) | Wire.read());

    Причем пробовал и через Adafruit библиотеку – то же самое.

  12. Получается, что ADS1115 отличается от ADS1015 только символически. Младшие 4 бита всегда равны 0. И вместо 16-битного ADS1115 мы имеем 12-битный ADS1115, у которого только старшие 12 бит значащие, а младшие 4 бита – просто добавлены для “псевдозума”. Так ли это, или есть способ включить младшие 4 бита в работу? Выведите HEX, и вы заметите, что младший разряд всегда “0”. Реально выходит дискретность 3 мВ на пределе 256 мВ.

  13. Исправление: Реально выходит дискретность 3 мВ на пределе 6.144V, например.

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

  15. Подскажите пожалуйста при измерении напряжения на 4 каналах всё работает отлично но если я на 4 канала вешаю 4 датчика тока Холла всё измеряется в принципе нормально но со временем начинает
    Сдвигаться 0 либо в одну сторону либо в другую сторону изменяя показания как с этим можно бороться? То есть если через токовый Шунт не течёт ток с начала показания держится нулевые всё отлично но через какой-то период времени происходит сдвиг либо в – либо в + показаний что самое интересное при измерении напряжения на датчиках тока напряжения стоит ровно 2.500 не двигая ни в одну не в другую сторону а acp значение двигает.

Имя (обязательно)Email (обязательно)Веб-сайт

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