/ads1115

Модуль MicroPython для управления ADS1115. Многоканальный, дифференциальный I2C АЦП от TI. MicroPython module for controlling ADS1115. Multichannel, differential I2C ADC from TI.

Primary LanguagePythonMIT LicenseMIT

Модуль MicroPython для управления ADS1115. Многоканальный, дифференциальный I2C АЦП от TI. MicroPython module for controlling ADS1115. Multichannel, differential I2C ADC from TI.

Описание

ADS1115 представляет собой прецизионный маломощный 16-разрядный I2C-совместимый аналого-цифровой преобразователь (АЦП). ADS1115 включает в себя источник опорного напряжения с малым дрейфом и генератор. Также имеется усилитель с программируемым усилением (PGA) и цифровой компаратор. Эти особенности, а также широкий диапазон рабочих напряжений питания, делают ADS1115 подходящим для приложений измерения датчиков с ограниченной мощностью.

Применения

  • Портативные приборы
  • Мониторинг напряжения и тока батарей
  • Измерение температуры
  • Бытовая электроника
  • Автоматизация производства и управление процессами

Питание

Напряжение питания 3.3, 5.0 В (от 2.0 В до 5.5 В)!

Адрес датчика

Находятся в диапазоне 72..75.

Шина I2C

Просто подключите контакты (VCC, GND, SDA, SCL) платы с ADS1115 к соответствующим контактам Arduino, ESP или любой другой платы с прошивкой MicroPython! Подайте питание на плату.

Загрузка ПО в плату

Загрузите прошивку micropython на плату NANO(ESP и т. д.), а затем файлы: main.py, ads1115mod.py и папку sensor_pack_2 полностью! Затем откройте main.py в своей IDE и запустите/выполните его.

Режимы работы АЦП

Ручной

На каждое измерение нужен вызов метода start_measurement(single_shot=True... .

Автоматический

Вызовом метода start_measurement, датчик переводится в режим автоматического выполнения измерений. start_measurement(single_shot=False... .

Модуль adcmod

Представляет собой основу для описания любого АЦП. Выражаясь языком программиста, класс ADC, является классом, наследуя который, можно программно описать АЦП. В частности, ADS1115!

Методы модуля

def init(self, init_props: adc_init_props, model: str = None):

Конструктор. Параметры:

  • init_props - параметры, описывающие АЦП: опорное напряжение, предельное кол-во значащих бит в отсчете, количество обычных (single ended) каналов, количество дифференциальных(differential) каналов, дифференциальный АЦП (bool).
  • model - строковое наименование АЦП, по которому, функция возвратит init_props.

def get_general_props(self) -> adc_general_props:

Возвращает основные свойства АЦП:

  • Опорное напряжение
  • Текущее кол-во бит в отсчете
  • Предельное кол-во бит в отсчете
  • Текущий номер канала
  • Кол-во обычных (single ended) каналов
  • Кол-во дифференциальных (differential) каналов

def get_general_raw_props(self) -> adc_general_raw_props:

Возвращает основные 'сырые' свойства АЦП, которые считываются из регистра, обычно конфигурации:

  • Текущая "частота" взятия отсчетов
  • Текущее усиление PGA (усилитель с программируемым усилением)
  • Режим работы АЦП (одиночный или автоматический)

def get_specific_props(self):

Возвращает уникальные для АЦП свойства, желательно в виде именованного кортежа. Для переопределения в классе-наследнике!

def check_gain_raw(self, gain_raw: int) -> int:

Проверяет сырое усиление на правильность. В случае ошибки (значение вне допустимого диапазона) выброси исключение! Возвращает значение gain_raw в случае успеха! Для переопределения в классе-наследнике! Вызывается в методе start_measurement.

def check_data_rate_raw(self, data_rate_raw: int) -> int:

Проверяет сырое значение 'частоты' взятия отсчетов, data_rate, на правильность. В случае ошибки выброси исключение! Возвращает data_rate_raw в случае успеха! Для переопределения в классе-наследнике.

def get_lsb(self) -> float:

Возвращает цену младшего разряда в Вольтах в зависимости от текущих настроек АЦП.

def get_conversion_cycle_time(self) -> int:

Возвращает время преобразования в [мкc/мс] аналогового значения в цифровое в зависимости от текущих настроек АЦП. Переопредели для каждого АЦП!

def get_raw_value(self) -> int:

Возвращает 'сырое' значение отсчета АЦП. Переопределяется в классах - наследниках!

def get_raw_value_ex(self, delta: int = 5) -> raw_value_ex:

Возвращает именованный кортеж: 'сырое' значение отсчета АЦП, нижний предел, верхний предел. Переопределяется в классах - наследниках!

def raw_value_to_real(self, raw_val: int) -> float:

Преобразует 'сырое' значение из регистра АЦП в значение в Вольтах.

def gain_raw_to_real(self, raw_gain: int) -> float:

Преобразует 'сырое' значение усиления в 'настоящее'.

def get_value(self, raw: bool = True) -> float:

Возвращает значение текущего канала в Вольтах, если raw в Ложь, в коде, если raw в Истина.

def get_current_channel(self) -> adc_channel_info:

Возвращает информацию о текущем активном канале АЦП.

def start_measurement(self, single_shot: bool, data_rate_raw: int, gain_raw: int, channel: int, differential_channel: bool)

Запуск однократного(single_shot в Истина) или многократного(single_shot в Ложь) измерения. data_rate_raw - частота получения выборок АЦП, отсчетов в сек., RAW-параметр, смотри в datasheet битовое поле! gain_raw - коэффициент усиления входного аналогового напряжения, RAW-параметр, смотри в datasheet битовое поле! channel - номер аналогового входа. От 0 до self._channels/self._diff_channels - 1 differential_channel - если Истина, то канал с номером channel дифференциальный(!) Внимание! Последней строкой этого метода всегда вызывайте метод raw_config_to_adc_properties для записи значений в соответствующие поля класса!

def raw_config_to_adc_properties(self, raw_config: int):

Возвращает текущие настройки датчика из числа, возвращенного get_raw_config(!), в поля(!) класса. raw_config -> adc_properties

def adc_properties_to_raw_config(self) -> int:

Преобразует свойства АЦП из полей класса в 'сырую' конфигурацию АЦП. adc_properties -> raw_config

def get_raw_config(self) -> int:

Возвращает(считывает) текущие настройки датчика из регистров(конфигурации) в виде числа.

def set_raw_config(self, value: int):

Записывает настройки (value) во внутреннюю память/регистр датчика.

ADS1115

Параметры АЦП в методах

def start_measurement(self, single_shot: bool, data_rate_raw: int, gain_raw: int, channel: int, differential_channel: bool):

Имя параметра raw значения Значения ___ ___
data_rate_raw 0..7 8, 16, 32, 64, 128, 250, 475, 860
gain_raw 0..5 +/-3, +/-2, +/-1, +/-0.5, +/-0.25, +/-0.125
channel_raw 0..7 0 - AIN0-AIN1 (diff),
1 - AIN0-AIN3 (diff)
2 - AIN1-AIN3 (diff)
3 - AIN2-AIN3 (diff)
4 - AIN0-GND
5 - AIN1-GND
6 - AIN2-GND
7 - AIN3-GND
AIN3-GND

Зависимость gain от raw_gain, (коэффициента усиления от 'сырого' усиления)

raw gain gain
0 1/3
1 1/2
2 1
3 2
4 4
5 4

Зависимость частоты и времени преобразования от raw_sample_rate ('сырой' частоты преобразования)

raw sample rate частота преобразования [Гц] Время преобразования, мкс
0 8 125_000
1 16 62500
2 32 31250
3 64 15625
4 128 7812.5
5 250 4000
6 475 2105.3
7 860 1162.8

channel - номер канала. 8 каналов АЦП я разбил на две группы по 4 канала 0..3. Если вы установите differential_channel в ЛОЖЬ, то подключите к PGA обычный (single ended) канал, иначе подключите PGA дифференциальный канал.

Предупреждение

Никогда не подавайте на входы АЦП напряжение больше + U_пит. и меньше 0 Вольт!

Отличительная особенность АЦП с дифференциальным входом в том, что результат преобразования всегда будет знаковым! Когда на IN+ потенциал больше чем на IN-, результат будет положительный, иначе отрицательный. То есть если у нас 16-битный АЦП с дифференциальным входом, результат преобразования будет находиться в пределах от -32767 до +32767. Эти 65536 отсчета соответствуют опорному напряжению, а дальше все, как у обычного single-ended АЦП.

Преимущества дифференциального АЦП перед single-ended:

  • устраняет любой синфазный шум
  • позволяет измерять малые напряжения при больших смещениях

Плата с ADS1115

alt text

Среда разработки (IDE)

IDE

alt text