AD7714 представляет собой аналого-цифровой преобразователь для низкочастотных измерений. АЦП измеряет низкоуровневые сигналы непосредственно от датчиков и преобразует их в результат преобразования (цифровое слово). Максимальное разрешение АЦП 24 бит, точность преобразования 0,0015%. Имеется несколько режимов калибровки (корректировка нуля и диапазона измерений), внутренний усилитель сигнала с коэффициентом усиления от 1 до 128.
АЦП AD7714 имeет три дифференциальных входа (AIN1_AIN2, AIN3_AIN4, AIN5_AIN6), которые могут быть переконфигурированы в четыре псевдодифференциальных входа (измерение однополярного напряжения). При измерении обнополярного напряжения используются входы AIN1 AIN2 AIN3 AIN4, на них можно подавать напряжение только положительной полярности, общий провод измеряемого напряжения соединяют со входом AIN6 и к GND.
AD7714 не содержит встроенного источника опорного напряжения, поэтому необходимо опорное напряжение подавать с внешнего ИОН. При этом опорное напряжение не должно превышать 2,5 В для 5-и вольтовой версии АЦП и 1,25 В для 3-х вольтовой версии АЦП. АЦП имеет аналоговую и цифровую землю, но как правило их объединяют в общий провод.
Для связи с АЦП используется шина SPI, выводы SCLK, DIN и DOUT служат для отправки и приема данных, вывод CS активирует работу микросхемы, вывод DRDY передает в контроллер сигнал о готовности считывания данных с АЦП. RESET сбрасывает состояние АЦП в исходное состояние. MCLKIN и MCLKOUT выводы для подключения кварцевого резонатора с частотами 2,4576 и 1 МГц. Так же допускается тактирование АЦП внешним тактовым сигналом. АЦП может работать как в 16-и битном режиме, так и в 24-х битном.
На рисунке показана схема подключения AD7714 к плате Arduino (NANO, UNO). Измеренные значения напряжения выводятся в монитор порта. Скетч конфигурирует работу АЦП для измерения однополярного напряжения которое подается на вход AIN1. Коэффициент усиления равен 1, частота фильтра 50 Гц.
#include <SPI.h> // SS 10 // CS // MOSI 11 // DIN // MISO 12 // DOUT // SCK 13 // SCLK // RESET 7 // DRDY 8 // POL, AVdd, DVdd, SYNC,STANDBY = VCC // AGDN, DGDN,REF IN(-), BUFFER = GND // REF IN(+) = +1.25...2.5 V #define RESET 7 #define DRDY 8 long bt24,hi,mid,lo; int in = 0b000; // Channel Selection AIN1_AIN6 // Pseudo Differential // AIN1_AIN6 = 0b000 // AIN2_AIN6 = 0b001 // AIN3_AIN6 = 0b010 // AIN4_AIN6 = 0b011 // Fully Differential // AIN1_AIN2 = 0b100 // AIN3_AIN4 = 0b101 // AIN5_AIN6 = 0b110 void setup(){ Serial.begin(9600); pinMode(DRDY,INPUT); // DRDY pinMode(RESET,OUTPUT);// RESET digitalWrite(RESET,LOW); SPI.beginTransaction(SPISettings(SPI_CLOCK_DIV2, MSBFIRST, SPI_MODE3)); SPI.begin(); digitalWrite(RESET,HIGH); delay(300); } void loop(){ Write(); Read(); Serial.println(bt24); } void Write(){ digitalWrite(RESET,HIGH); digitalWrite(SS, LOW); delayMicroseconds(1); /////////////// Filter High Register ///////////////////////////////////////////// // BU WL BST CLKDIS FS11 FS10 FS9 FS8 // BU 1 UNIPOLAR, 0 BIPOLAR // WS 0 = 16 bit, 1 = 24 bit // BST 2.4576 MHz BST=0, 1.0000 MHz BST=1 // CLKDIS 0 (от кварца) // FSx HIGH 4 BITS FILTER (12 BITS) SPI.transfer(0b00100000 + in); // Communications Register > Filter High Register SPI.transfer(0b11100001); // Filter High Register ////////////// Filter Low Register ////////////////////////////////////////////// // FS7 FS6 FS5 FS4 FS3 FS2 FS1 FS0 // LOW 8 BITS FILTER (12 BITS) SPI.transfer(0b00110000 + in); // Communications Register > Filter Low Register SPI.transfer(0b10000000); // Filter Low Register // 2.4576 MHz / 128 / 4000 (111110100000) = 4.8 Hz // FS11...FS8 1111, FS7...FS0 10100000 //////////////// Mode Register ///////////////////////////////////////////////// // MD2 MD1 MD0 G2 G1 G0 BO FSYNC // MDx Operating Mode // Gx Gain Setting 000...111 = 1...128 GAIN // 000 = x1, 001 = x2, 010 = x4, 011 = x8, 100 = x16, 101 = x32, 110 = x64, 111 = x128 // BO, FSYNC = 0 SPI.transfer(0b00010000 + in); // Communications Register > Mode Register SPI.transfer(0b00100000); // Mode Register // MDx = 001 Self-Calibration digitalWrite(SS, HIGH); delay(10); } void Read(){ while(digitalRead(DRDY)!=LOW); digitalWrite(SS, LOW); delayMicroseconds(1); SPI.transfer(0b01011000 + in); hi = SPI.transfer(0xFF); hi = hi<<16; mid = SPI.transfer(0xFF); mid = mid<<8; lo = SPI.transfer(0xFF); bt24 = hi | mid | lo; digitalWrite(SS, HIGH); while(digitalRead(DRDY)!=HIGH); delay(10); digitalWrite(RESET,LOW); }
AIN1 замкнут на GND
На AIN1 подано напряжение 1,13 В, источник опорного напряжения 1,81 В
На скриншоте Вы видите результат преобразования напряжения. Максимальное напряжение подаваемое на вход АЦП равно напряжению опорного источника и в цифровом формате будет отображено как 16 777 215, что дает разрешение 1,1 мкВ (при GAIN =1, Uref = 1.81 V), из чего получаем измеренное напряжение равное 1,133 904 В.
AD7714 содержит 8-м внутренних регистров, но в скетче используются только пять основных, это регистр обмена, выбор режима, два регистра фильтра и регистр чтения данных.
Регистр обмена (Communications Register) определяет тип последующей операции чтения или записи, а так же коммутирует измерительные каналы.
Так как регистр определяет тип последующей операции, то он предшествует регистрам выбора режима, двум регистрам фильтра и регистру чтения данных (выделены красным).
Так например для записи данных в регистр выбора режима (Mode Register), необходимо в Communications Register передать следующие данные:
DRDY | RS2 | RS1 | RS0 | R/W | CH2 | CH1 | CH0 |
0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
- DRDY — этот бит обеспечивает статус флага DRDY
- RS2…RS0 — 010 определяют что далее последует обращение к регистру выбора режима (Mode Register)
- R/W — 0 запись данных в последующий регистр
- CH2…CH0 — выбор входа (см. таб. ниже), биты 000 определяют что активен вход AIN1_AIN6
Далее следует сам регистр выбора режима (Mode Register)
MD2 | MD1 | MD0 | G2 | G1 | G0 | BO | FSYNC |
0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
- MD2…MD0 — биты режима калибровки АЦП
- 000 — обычный режим
- 001 — автокалибровка
- 010 — системная калибровка нуля
- 011 — системная калибровка полной шкалы
- 100 — системная калибровка смещения
- 101 — фоновая калибровка
- 110 — автокалибровка нуля
- 111 — автокалибровка полной шкалы
- G2…G0 — биты определения коэффициента усиления (см.таб. ниже)
- Bo и FSYNC по умолчанию установлены 00
Далее снова обращаемся к регистру обмена, выбираем первый регистр фильтра (Filter High Register), отправляем в него данные, и затем при помощи регистра обмена обращаемся ко второму регистру фильтра (Filter Low Register).
Два регистра фильтра составляют одно целое разделенное на два 8-и битных байта, эти регистры определяют тип входного сигнала (однополярный или дифференциальный), определяют разрядность (16 или 24 бит) и частоту внутреннего фильтра.
Рассмотрим Filter High Register подробнее:
B/U | WL | BST | CLKDIS | FS11 | FS10 | FS9 | FS8 |
1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
- B/U — выбор типа входа, 1 — однополярный вход, 0 — дифференциальный
- WL — разрядность, 1 — 24 бит, 0 — 16 бит
- BST — 1 используем кварц на 2,4576 МГц, 0 — на 1 МГц
- CLKDIS — 0 используем кварцевый резонатор, 1 — внешние тактирующие импульсы (без кварца)
- FS11…FS8 — старшие биты коэффициент частоты внутреннего фильтра
- частота фильтра вычисляется по формуле Fф = Fкв / 128 / К,
- где Fкв — частота кварцевого резинатора в Гц
- К — коэффициент (от 19 до 4000) который указывается в двух регистрах фильтра (12 бит, 4 старшие биты указываются в HIGH регистре, остальные в LOW регистре фильтра)
- например для получения частоты фильтра в 10 Гц (частота опроса) необходимо применит К = 2000. Fф = 2 457 600 / 128 / 2000 = 9,6 Гц
- частота фильтра вычисляется по формуле Fф = Fкв / 128 / К,
Выше показана таблица из которой видно, что практически измеренное значение напряжение в 24 бит получить не возможно, младшие биты будут находится в области шума, но 22,5 бит получить можно, если установить частоту фильтра 5 Гц при коэффициенте усиления 1.
Для отправки всех описанных параметров регистров фильтра нужно два раза использовать регистр обмена:
0b00100000 — данные регистра обмена определяют, что следующий регистр будет регистр HIGH регистр фильтра,
далее отправляем данные в регистр — 0b11100111, первые три бита определяют полярность, разрядность и частоту кварцевого резонатора, последние четыре, старшие биты (4 из 12 бит), коэффициента фильтра. Для примера коэффициент равен 2000, что в двоичном коде равно 011111010000, в HIGH регистр фильтра прописываем 4-е старших разряда 0111.
Далее снова обращаемся к регистру обмена:
0b00110000 — данные регистра обмена определяют, что следующий регистр будет регистр LOW регистр фильтра. После отправляем остальные 8 бит коэффициента фильтра — 11010000.
Filter High Register
На этом конфигурация АЦП закончена, остается отправить запрос для чтения полученного значения измеренного напряжения, опять же при помощи регистра обмена. При этом ранее его использовали для записи параметров, а сейчас он используется для чтения:
DRDY | RS2 | RS1 | RS0 | R/W | CH2 | CH1 | CH0 |
0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 |
- RS2…RS0 — выбираем что последующее обращение будет к регистру Data
- R/W — операция чтения
- CH2…CH0 — выбор входа
Регистр Data 24 бит, поэтому его чтение производится в три запроса по 8 бит.
Форум — http://forum.rcl-radio.ru/viewtopic.php?pid=1830#p1830
ad7714.pdf