В данной статье мы рассмотрим как подключить 24-битный модуль АЦП ADS1220 к плате Arduino. Плата коммутации ADS1220 представляет собой 24-битный аналого-цифровой преобразователь (АЦП), подходящий для использования с Arduino, ESP8266/32, STM32 и другими микроконтроллерами. ADS1220 выделяется своим безупречным 24-битным разрешением, превосходящим возможности 16-битного АЦП ADS1115.
Хотя платы Arduino оснащены встроенным 10-битным АЦП, его точность несколько ограничена. Напротив, ADS1220 может похвастаться 24-битным разрешением АЦП. Для сравнения, наименьшее напряжение, которое может обнаружить Arduino, составляет 5 В / 1024 = 0,0049 В (или 4,9 мВ). С другой стороны, ADS1220 может измерять всего 5 В / 16777216 = 0,0000003 В (или 0,3 мкВ ). Это означает, что ADS1220 может обнаруживать гораздо более тонкие различия в напряжении чем стандартный АЦП Arduino, что делает его превосходным выбором для более точных измерений.
Необходимые компоненты
- Плата Arduino Nano (купить на AliExpress).
- Модуль АЦП ADS1220 (купить на AliExpress).
- Модуль OLED дисплея SSD1306 128×64 с интерфейсом I2C (купить на AliExpress).
- Потенциометр 10 кОм - 2 шт. (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Чип ADS1220
Микросхема ADS1220 является основным компонентом модуля АЦП ADS1220. Изготовленная Texas Instruments (TI) , эта микросхема представляет собой высокоточный 12-битный аналого-цифровой преобразователь (АЦП).
Он поставляется с четырьмя несимметричными входными каналами. Эти каналы также могут быть настроены для работы в качестве двух дифференциальных входных каналов. Одной из выдающихся особенностей микросхемы ADS1220 является ее малошумящий программируемый усилитель усиления (programmable gain amplifier, PGA), который повышает ее производительность. Кроме того, микросхема обеспечивает гибкость в своей работе, позволяя пользователям выбирать между двумя режимами преобразования: непрерывное преобразование или однократное преобразование. Эта универсальность делает микросхему ADS1220 ценным инструментом для различных приложений.
Характеристики микросхемы ADS1220
- Аналоговое питание: от 2,3 до 5,5 В на AVDD/AVSS (AGND).
- Цифровой источник питания: от 2,3 до 5,5 вольт на DVDD / DGND.
- Вариант биполярного питания: например, AVSS на DGND = -2,5 вольт, AVDD на DGND = +2,5 вольт.
- Потребляемая мощность: 120 микроампер в режиме рабочего цикла.
- Связь: через SPI.
- Опорные напряжения:
- Внутреннее: 2,048 вольт.
- Внешнее: VREFP x – VREFN x = мин. 0,75 вольт, макс. AVDD.
- Усиление: 1 – 128 (с PGA = программируемый усилитель усиления), 1 – 4 (без PGA).
- Скорость передачи данных: 5–2000 выборок в секунду (SPS)
- Режимы преобразования: непрерывный и «одиночный».
- Входы напряжения: 4 однотактных (против AVSS) или 2 дифференциальных входа.
- Измерение в мультиплексном режиме.
- Два программируемых ЦАП (цифро-аналоговых преобразователя тока): от 10 микроампер до 1,5 миллиампер (в техническом описании также называется «источником тока возбуждения»).
- Цифровой фильтр: 50 и/или 60 Гц.
- Встроенный датчик температуры .
Функциональная блок-схема ADS1220
Рекомендуемое соединение SPI с микроконтроллером
ADS1220 может работать с системами SPI большинства микроконтроллеров. Он использует режим SPI 1, где CPOL установлен на 0, а CPHA установлен на 1. В этом режиме SCLK остается низким в режиме ожидания. Данные изменяются или запускаются только тогда, когда SCLK повышается, и считываются или блокируются, когда SCLK понижается.
Texas Instruments (TI) предлагает использовать резисторы 47 Ом со всеми цифровыми входными и выходными контактами, такими как CS, SCLK, DIN, DOUT/DRDY и DRDY. Эти резисторы помогают сделать переходы более плавными, контролировать выбросы и обеспечивать некоторую защиту от высокого напряжения. Однако при добавлении этих резисторов важно убедиться, что все тайминги SPI по-прежнему соблюдены, поскольку резисторы могут влиять на цифровые сигналы из-за емкостей шины.
Корпус микросхемы ADS1220
Микросхема ADS1220 выпускается в двух различных корпусах интегральных схем, как показано на представленном рисунке.
Первый корпус — это 16-контактный TSSOP (Thin Shrink Small Outline Package). Это более крупный корпус с корпусом чипа размером приблизительно 5,1 мм x 4,5 мм. Второй корпус — это VQFN (Quad Flatpack No-Lead). Это гораздо более компактный корпус с размером корпуса всего 3,6 мм x 3,6 мм. Выбор между этими корпусами зависит от конкретных требований и пространственных ограничений проекта или приложения, в котором будет использоваться чип.
Дополнительную информацию о микросхеме ADS1220 см. в техническом описании ADS1220.
Коммутационная плата ADS1220
Микросхема ADS1220 поставляется в очень маленьком корпусе. То есть, она не доступна в большем корпусе DIP, который можно вставить в макетную плату.
Поэтому для прототипирования и тестирования нам нужно будет использовать коммутационную плату (breakout board) или модуль. Существует много производителей таких плат, таких как Protocentral, Olimex и CJMCU. Из них модель CJMCU продается больше всего.
Схема коммутационной платы ADS1220
На следующем рисунке показана схема модуля АЦП ADS1220 компании Protocentral.
Хотя модули АЦП CJMCU ADS1220 имеют схожую конструкцию, есть небольшая разница. Версии CJMCU используют резисторы 24 Ом для линий SPI, в отличие от резисторов 47 Ом, используемых Protocentral.
Распиновка модуля ADS1220
Микросхема ADS1220 или коммутационная плата имеют в общей сложности 18 контактов.
Подробная информация о назначении ее контактов представлена в следующей таблице.
Номер контакта | Обозначение контакта | Назначение контакта |
1 | DRDY | Контакт готовности данных. Переходит на НИЗКИЙ уровень, когда данные доступны для чтения. |
2 | MISO (DOUT) | Контакт Master In Slave Out (MISO). Также указывает, когда данные готовы к считыванию. |
3 | MOSI (DIN) | Контакт Master Out Slave In (MOSI). Используется для отправки данных от ведущего к ведомому. |
4 | SCLK | Контакт последовательного тактового сигнала (SCLK). Обеспечивает синхронизацию для передачи данных. |
5 | CS | Контакт выбора чипа (CS) в интерфейсе SPI. Активирует ведомое устройство для связи. |
6 | CLK | Дополнительный вход внешнего тактового сигнала. |
7 | DVDD | Контакт питания для цифрового напряжения. |
8 | DGND | Заземляющий контакт для цифрового напряжения. |
9 | AGND | Заземляющий контакт для аналогового напряжения. |
10 | AVDD | Контакт питания для аналогового напряжения. |
11 | REFP0 | Положительный контакт для внешнего опорного напряжения. |
12 | REFFN0 | Отрицательный контакт для внешнего опорного напряжения. |
13 | AIN3 | Аналоговый вход для измерения напряжения. Может также служить отрицательным входом для внешнего опорного напряжения. |
14 | AIN2 | Аналоговый вход для измерения напряжения. |
15 | AIN1 | Аналоговый вход для измерения напряжения. |
16 | AIN0 | Аналоговый вход для измерения напряжения. Может также служить положительным входом для внешнего опорного напряжения. |
Как видите, контактов много - модуль достаточно функциональный.
Взаимодействие 24-битного модуля АЦП ADS1220 с Arduino
Схема подключения 24-битного модуля АЦП ADS1220 к плате Arduino представлена на следующем рисунке.
В следующей таблице приведено четкое сопоставление каждого контакта модуля ADS1220 с соответствующим ему контактом Arduino.
Контакт модуля ADS1220 | Контакт Arduino |
DRDY | D6 |
MISO | D12 |
MOSI | D11 |
SCLK | D13 |
CS | D7 |
DVDD | +5V |
DGND | GND |
AGND | GND |
Конструкцию проекта можно легко собрать на макетной плате.
Аналоговый сигнал может быть подан через выводы AIN0, AIN1, AIN2 и AIN3. Если у вас нет источника переменного питания, вы можете использовать потенциометр для подачи входного напряжения.
Для демонстрации я использовал потенциометр 10 кОм для подачи аналогового напряжения от 5 В до 0 В.
Установка и использование библиотеки ADS1220 Arduino
Библиотека Protocentral ADS1220 Arduino предназначена для упрощения сопряжения модуля ADC ADS1220 с платами Arduino. Вот подробное руководство по ее установке и использованию:
Установка библиотеки
- Arduino IDE: Вы можете установить библиотеку Protocentral ADS1220 непосредственно из Arduino IDE. Перейдите в
Sketch
>Include Library
>Manage Libraries
, затем найдите «Protocentral ADS1220» и установите ее.
- Ручная установка: вы также можете загрузить библиотеку с GitHub или сайта Protocentral и вручную добавить ее в папку библиотек Arduino.
Использование библиотеки
1. Методы чтения библиотеки Protocentral ADS1220:
Библиотека предоставляет методы для чтения данных напрямую из модуля АЦП ADS1220. Основной метод:
1 |
int32_t adc_data = ads1220.read_data(); |
Этот метод извлекает показания АЦП как 32-битное целое число со знаком, представляющее необработанное значение АЦП. Затем это значение можно преобразовать в напряжение или использовать напрямую, в зависимости от приложения.
2. Режим преобразования:
ADS1220 предлагает два основных режима преобразования:
- Непрерывный режим: АЦП непрерывно преобразует аналоговый вход в цифровые значения. Этот режим полезен, когда требуется постоянный мониторинг.
1 |
ads1220.set_mode(MODE_CONTINUOUS); |
- Режим одиночного срабатывания: АЦП выполняет одно преобразование и затем останавливается. Этот режим экономит энергию, поскольку АЦП не выполняет постоянное преобразование.
1 |
ads1220.set_mode(MODE_SINGLE_SHOT); |
3. Доступные методы READ:
Помимо основного read_data()
метода, библиотека предоставляет методы для чтения определенных конфигураций или статуса из АЦП. Например, вы можете найти методы для чтения значений калибровки, идентификатора устройства или других параметров конфигурации.
4. Программируемый усилитель усиления (PGA):
ADS1220 имеет встроенный PGA, который усиливает сигнал перед преобразованием. Это особенно полезно для считывания небольших разностей напряжений. Усиление можно задать с помощью:
1 |
ads1220.set_gain(GAIN); |
Где в качестве GAIN
могут быть значения типа 1, 2, 4, 8, 16, 32, 64, 128 в зависимости от определений библиотеки. Коэффициент усиления напрямую влияет на диапазон полной шкалы (Full-Scale Range, FSR) АЦП.
5. FSR и VREF (опорное напряжение):
- FSR (Full-Scale Range): представляет диапазон напряжений, которые может считывать АЦП. Он определяется настройкой усиления PGA и VREF. Математически FSR можно рассчитать следующим образом:
FSR=VREF/Усиление VREF: Опорное напряжение, относительно которого АЦП выполняет преобразования. ADS1220 может использовать внутренний или внешний VREF. Выбор VREF и настройка PGA вместе определяют FSR АЦП.
Важно отметить, что указанные значения FSR точны при использовании внутреннего опорного напряжения ADS1220, которое составляет 2,048 В. Например, если внешний опорный сигнал 5 В подключен к контактам REFP0 и REFN0, а настройка усиления остается на уровне 1, FSR становится равным 5 В. Это означает, что АЦП может измерять напряжения в диапазоне от 0 до 5 В.
6. Преобразование значений АЦП в напряжение:
Чтобы преобразовать необработанный выходной сигнал АЦП в показание напряжения, используйте формулу:
- n — необработанное значение АЦП, возвращаемое командой чтения.
- VREF — опорное напряжение, обычно 2,048 В для ADS1220.
- Усиление — это настройка программируемого усилителя усиления (PGA).
Делитель 8 388 607 представляет собой разрешение АЦП, которое равно (2^23)−1 из-за того, что в 24-битном АЦП ADS1220 один бит резервируется для полярности.
7. Изменение скорости передачи данных:
Скорость передачи данных или скорость выполнения преобразований АЦП можно настроить. Более высокая скорость передачи данных может привести к более быстрым преобразованиям, но может привести к большему шуму. И наоборот, более низкая скорость передачи данных может быть более точной, но более медленной. Вы можете задать желаемую скорость передачи данных с помощью:
1 |
ads1220.set_data_rate(DR); |
Где DR
- желаемое значение скорости передачи данных, например 20SPS, 45SPS, 90SPS, 175SPS и т. д.
Тестовый код: считывание значений напряжения с 4 каналов ADS1220
Основная цель этого кода — считывать значения напряжения с четырех каналов модуля АЦП ADS1220 и отображать их в милливольтах на последовательном мониторе.
АЦП работает в режиме одиночного срабатывания, то есть он выполняет одно преобразование за раз по запросу. Показания АЦП снимаются с регулярными интервалами (из-за delay(100)
), а результаты выводятся на последовательный монитор для каждого канала.
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 |
#include "Protocentral_ADS1220.h" #include <SPI.h> #define PGA 1 // Programmable Gain = 1 #define VREF 2.048 // Internal reference of 2.048V #define VFSR VREF/PGA #define FULL_SCALE (((long int)1<<23)-1) #define ADS1220_CS_PIN 7 #define ADS1220_DRDY_PIN 6 Protocentral_ADS1220 pc_ads1220; int32_t adc_data; volatile bool drdyIntrFlag = false; void drdyInterruptHndlr(){ drdyIntrFlag = true; } void enableInterruptPin(){ attachInterrupt(digitalPinToInterrupt(ADS1220_DRDY_PIN), drdyInterruptHndlr, FALLING); } void setup() { Serial.begin(9600); pc_ads1220.begin(ADS1220_CS_PIN,ADS1220_DRDY_PIN); pc_ads1220.set_data_rate(DR_330SPS); pc_ads1220.set_pga_gain(PGA_GAIN_1); pc_ads1220.set_conv_mode_single_shot(); //Set Single shot mode } void loop() { adc_data=pc_ads1220.Read_SingleShot_SingleEnded_WaitForData(MUX_SE_CH0); Serial.print("\n\nCh1 (mV): "); Serial.print(convertToMilliV(adc_data)); delay(100); adc_data=pc_ads1220.Read_SingleShot_SingleEnded_WaitForData(MUX_SE_CH1); Serial.print("\nCh2 (mV): "); Serial.print(convertToMilliV(adc_data)); delay(100); adc_data=pc_ads1220.Read_SingleShot_SingleEnded_WaitForData(MUX_SE_CH2); Serial.print("\nCh3 (mV): "); Serial.print(convertToMilliV(adc_data)); delay(100); adc_data=pc_ads1220.Read_SingleShot_SingleEnded_WaitForData(MUX_SE_CH3); Serial.print("\nCh4 (mV): "); Serial.print(convertToMilliV(adc_data)); delay(100); } float convertToMilliV(int32_t i32data) { return (float)((i32data*VFSR*1000)/FULL_SCALE); } |
После загрузки кода откройте последовательный монитор.
Как вы видите, все 4 выхода идентичны. Это потому, что я подключил все входные каналы к одному напряжению. Чтобы наблюдать изменение напряжения, вы можете подать переменный вход на любой из входных терминалов AIN0, AIN1, AIN2, AIN3.
Изготовление прецизионного вольтметра 0-5 В с внешним опорным напряжением
Теперь давайте используем внешнее опорное напряжение, чтобы сделать недорогой прецизионный вольтметр. Он может измерять напряжение в милливольтах и с точностью до десятичного знака 5. Таким образом, этот проект можно использовать для создания милли/микровольтметра.
Схема вольтметра
Я изменил соединение между Arduino и 24-битным модулем АЦП ADS1220 в соответствии с требованиями. Для визуализации напряжения я использовал 0,96″ I2C OLED-дисплей.
Схема соединений между Arduino и 24-битным модулем АЦП ADS1220 представлена в следующей таблице.
Контакт ADS1220 | Контакт Arduino |
DRDY | D6 |
MISO | D12 |
MOSI | D11 |
SCLK | D13 |
CS | D7 |
DVDD | 5V |
DGND | GND |
AGND | GND |
REFP0 | 5V |
REFN0 | GND |
AIN1 | GND |
Аналогично, вывод AIN0 подключен к среднему выводу потенциометра 10K. Это необязательно, так как потенциометр 10K не нужен. Мы используем этот потенциометр для подачи входного напряжения. Вы можете использовать любой другой источник для подачи входного напряжения через вывод AIN0 ADS1220.
Для визуализации считанного напряжения мы можем использовать модуль 0,96″ I2C OLED Display. OLED дисплей можно подключить к контактам I2C Arduino Nano.
Исходный код/программа
Ниже приведен код для создания недорогого прецизионного вольтметра.
Для кода требуются некоторые библиотеки, которые необходимо добавить в папку библиотек Arduino.
- Библиотека Adafruit SSD1306: Загрузить
- Библиотека Adafruit GFX: Загрузить
- Библиотека Megunolink/MLP: Загрузить
Вот полный код для части проекта. Вам нужно настроить внешний опорный вход (VREF) для точного и правильного измерения.
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 |
#include <Wire.h> #include <SPI.h> #include <Adafruit_SSD1306.h> #include <Adafruit_GFX.h> #include "MegunoLink.h" #include "Filter.h" #include "Protocentral_ADS1220.h" #define OLED_WIDTH 128 #define OLED_HEIGHT 64 #define OLED_ADDR 0x3C #define PGA 1 // Programmable Gain = 1 #define VREF 4.72 // External reference input #define VFSR VREF/PGA #define FULL_SCALE (((long int)1<<23)-1) #define ADS1220_CS_PIN 7 #define ADS1220_DRDY_PIN 6 Adafruit_SSD1306 display(OLED_WIDTH, OLED_HEIGHT); Protocentral_ADS1220 pc_ads1220; ExponentialFilter<float> FilteredV(20, 0); int32_t adc_data; void setup() { Serial.begin(115200); display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR); display.clearDisplay(); pc_ads1220.begin(ADS1220_CS_PIN, ADS1220_DRDY_PIN); pc_ads1220.writeRegister(CONFIG_REG2_ADDRESS, 0x40); pc_ads1220.set_data_rate(DR_20SPS); pc_ads1220.set_pga_gain(PGA_GAIN_1); pc_ads1220.PGA_OFF(); pc_ads1220.set_conv_mode_single_shot(); // Set Single shot mode display.display(); } void loop() { adc_data = pc_ads1220.Read_SingleShot_SingleEnded_WaitForData(MUX_AIN0_AIN1); float mv = convertToVolt(adc_data); FilteredV.Filter(mv); float SmoothV = FilteredV.Current(); Serial.print("Measured Voltage: "); Serial.print(SmoothV); Serial.println("mV"); delay(5); display.clearDisplay(); display.setTextSize(3); display.setTextColor(WHITE); display.setCursor(0, 20); display.println(SmoothV/10000, 5); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0, 0); display.println("Output Voltage (mV):"); display.display(); } float convertToVolt(int32_t i32data) { return (float)((i32data * VFSR * 10000) / FULL_SCALE); } |
Прежде чем погрузиться в измерения напряжения, важно понять его возможности. ИС (интегральная схема) имеет внутренний опорный сигнал по умолчанию 2,048 В, что означает, что он может измерять вплоть до этого напряжения. Однако ADS1220 допускает внешний опорный сигнал напряжения, поддерживая до 7,3 вольт (при AVDD, установленном на 7 В). Для достижения оптимальных результатов я подключил 5-вольтовый источник питания от Arduino к опорному входу ADS1220. Чтобы обеспечить точность показаний, рекомендуется использовать внешний опорный сигнал напряжения ИС, например REF5050, поскольку использование шин питания Arduino может привести к появлению шума и несоответствий.
Для своей настройки я использовал канал 1 ADS1220 с заземленным выводом AIN0 и подключенным к переменному блоку питания AIN1. Если вы заметили какие-либо расхождения в измерениях, рассмотрите возможность корректировки значения VREF в вашем коде. Такие изменения могут быть вызваны нестабильными источниками опорного напряжения или нежелательными сопротивлениями. С этими знаниями вы хорошо подготовлены к использованию всего потенциала вашего нового вольтметра!
Тестирование и результаты
Наш вольтметр разработан для получения сверхточных показаний, отображая до пяти знаков после запятой.
Чтобы получить наиболее точные результаты, убедитесь, что вы установили правильное внешнее опорное напряжение в переменной VREF кода. Если можете, перепроверьте показания с помощью надежного мультиметра. При необходимости вы можете откалибровать свой измеритель, выполнив шаги, упомянутые ранее. Немного заботы и внимания, и у вас будет первоклассный вольтметр, сделанный прямо дома.
Заключение
24-битный модуль АЦП ADS1220 выделяется как превосходный выбор для тех, кто ищет точность в измерениях напряжения. При интеграции с такими платформами, как Arduino, он значительно расширяет возможности обнаружения мельчайших различий напряжения, намного превосходя встроенный 10-битный АЦП стандартных плат Arduino. Способность ADS1220 измерять с точностью до 0,3 мкВ по сравнению с 4,9 мВ Arduino подчеркивает его замечательную точность.
Кроме того, наше тестирование с вольтметром, который отображает показания до пяти знаков после запятой, подтверждает обещание ADS1220 обеспечить непревзойденную точность. Для тех, кто ставит точность в приоритет в своих проектах, 24-битный модуль АЦП ADS1220, несомненно, является лучшей рекомендацией.
58 просмотров