Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/octaprog7/mcp3421
Модуль MicroPython для управления MCP342X. 18-битный аналого-цифровой преобразователь с интерфейсом I2C и встроенным ИОН. 18-Bit Analog-to-Digital Converter with I2C Interface.
https://github.com/octaprog7/mcp3421
adc i2c micropython
Last synced: 1 day ago
JSON representation
Модуль MicroPython для управления MCP342X. 18-битный аналого-цифровой преобразователь с интерфейсом I2C и встроенным ИОН. 18-Bit Analog-to-Digital Converter with I2C Interface.
- Host: GitHub
- URL: https://github.com/octaprog7/mcp3421
- Owner: octaprog7
- License: mit
- Created: 2024-05-01T12:18:20.000Z (7 months ago)
- Default Branch: master
- Last Pushed: 2024-09-04T20:52:30.000Z (2 months ago)
- Last Synced: 2024-09-06T05:45:14.063Z (2 months ago)
- Topics: adc, i2c, micropython
- Language: Python
- Homepage:
- Size: 495 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-micropython - mcp3421 - MicroPython module for controlling MCP342X, 18-bit analog-to-digital converter with I2C interface. (Libraries / IO)
README
Модуль MicroPython для управления MCP342X. 18-битный аналого-цифровой преобразователь с интерфейсом I2C и встроенным ИОН.
18-Bit Analog-to-Digital Converter with I2C Interface.# Описание
MCP3421 — это одноканальный малошумящий высокоточный ΔΣ аналого-цифровой преобразователь с дифференциальными
входами и разрешением до 18 бит в небольшом корпусе SOT-23-6. Встроенное прецизионное опорное напряжение 2,048 В
обеспечивает дифференциальный входной диапазон ±2,048 В (Δ напряжения = 4,096 В). Устройство использует двухпроводный
последовательный интерфейс, совместимый с I2C, и работает от одного источника питания от 2,7 В до 5,5 В.# Применения
* Портативные приборы
* Весы и указатели уровня топлива
* Измерение температуры с помощью RTD, термистора и термопары.
* Мостовой датчик давления, деформации и силы.# Питание
Напряжение питания 3.3, 5.0 В (от 2.7 В до 5.5 В)!## Адрес датчика
Фиксирован, 0x68.# Шина I2C
Просто подключите контакты (VCC, GND, SDA, SCL) платы с MCP3421 к соответствующим контактам Arduino,
ESP или любой другой платы с прошивкой MicroPython! Подайте питание на плату.# Загрузка ПО в плату
Загрузите прошивку micropython на плату NANO(ESP и т. д.), а затем файлы: main.py, mcp3421mod.py и папку sensor_pack_2 полностью!
Затем откройте main.py в своей IDE и запустите/выполните его.# Режимы работы АЦП
## Ручной
На каждое измерение нужен вызов метода start_measurement(single_shot=True... .## Автоматический
Вызовом метода start_measurement, датчик переводится в режим автоматического выполнения измерений. start_measurement(single_shot=False... .# Модуль adcmod
Представляет собой основу для описания любого АЦП. Выражаясь языком программиста, класс ADC, является
классом, наследуя который, можно программно описать АЦП. В частности, MCP3421!## Методы модуля
### 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) во внутреннюю память/регистр датчика.# MCP3421
## Параметры АЦП в методах
### def start_measurement(self, single_shot: bool, data_rate_raw: int, gain_raw: int, channel: int, differential_channel: bool):Параметр channel это номер канала. Их количество зависит от используемого АЦП семейства MCP342X.
Параметр differential_channel установите в Истина, поскольку АЦП одноканальный с дифференциальным входом.
Параметр data_rate_raw и gain_raw 0..3.### Зависимость gain от raw_gain, (коэффициента усиления от 'сырого' усиления)
| raw gain | gain |
|----------|------|
| 0 | 1 |
| 1 | 2 |
| 2 | 4 |
| 3 | 8 |### Зависимость частоты и времени преобразования от raw_sample_rate ('сырой' частоты преобразования)
| raw sample rate | частота преобразования [Гц] | Время преобразования, мкс | Бит в отсчете |
|-----------------|-----------------------------|---------------------------|---------------|
| 0 | 240 | 4166 | 12 |
| 1 | 60 | 16666 | 14 |
| 2 | 15 | 66666 | 16 |
| 3 | 3.75 | 266666 | 18 |# Предупреждение
Никогда не подавайте на входы АЦП напряжение больше + U_пит. и меньше 0 Вольт!Отличительная особенность АЦП с дифференциальным входом в том, что результат преобразования всегда будет знаковым!
Когда на IN+ потенциал больше чем на IN-, результат будет положительный, иначе отрицательный.
То есть если у нас 18-битный АЦП с дифференциальным входом, результат преобразования будет находиться в пределах от -131071 до +131071.
Эти 131072 отсчета соответствуют опорному напряжению (2048 мВ), а дальше все, как у обычного single-ended АЦП.## Преимущества дифференциального АЦП перед single-ended:
* устраняет любой синфазный шум
* позволяет измерять малые напряжения при больших смещениях# Внимание
Класс Mcp342X, кроме mcp3421, может работать с mcp3422, mcp3422. Я проверял работу только с mcp3421!# Плата с MCP3421
![alt text](https://github.com/octaprog7/mcp3421/blob/master/pics/3421_brd.jpg)
# Плата MCP3421 c припаянным делителем напряжения
![alt text](https://github.com/octaprog7/mcp3421/blob/master/pics/3421_del.jpg)
# Среда разработки (IDE)
## IDE
![alt text](https://github.com/octaprog7/mcp3421/blob/master/pics/3421_ide.png)