AD7706 3-х канальный 16 битный сигма-дельта АЦП (Arduino IDE)

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

AD7706 работают от однополярного питания от 4.75 В до 5.25. AD7706 имеет три канала с псевдо дифференциальными входами.  Диапазон биполярного входного сигнала при питании 5 В и опорном напряжении 2,5 В может изменяться от 0 … 20 мВ до 0 … 2.5 В. При измерении биполярного сигнала может изменяться в диапазоне от ± 20 мВ до ± 2,5 В.

Отличительные особенности:

  • AD7706: трехканальный АЦП с псевдо-дифференциальными входами
  • 16 битное разрешение
  • Коэффициент нелинейности 0.003 %
  • Программируемый коэффициент усиления от 1 до 128
  • Трехпроводный последовательный SPI, QSPI, MICROWIRE и DSP совместимый интерфейс
  • Однополярное питание от 2.7 В до 3.3 В или от 4.75 В до 5.25 В
  • Рассеиваемая мощность при 3 В питании — менее 1 мВт
  • Ток потребления в дежурном режиме — не более 8 мкА

АЦП управляется при помощи нескольких регистров:

Регистр Communications

Communications Register 8 бит, содержит биты настройки выбора входа CH1 CH0, активация режима STANDBY STBY.

Так как это коммуникационный регистр, то он содержит адрес регистра который необходимо активировать RS0 RS1 RS2, то есть коммуникационном регистре указываем адрес регистра в который необходимо записать или прочитать данные (бит RW), так же указываем номер канала настойки которого необходимо поменять.

Например необходимо записать данные в регистр SETUP, то в коммуникационном регистре записываем адрес регистра SETUP, номер канала, бит записи или чтения:

Communications Register (пример записи в регистр SETUP)

DRDY RS2 RS1 RS0 RW STB CH1 CH0
0 0 0 1 0 0 0 1

RS0 RS1 RS2 = [001] — адрес регистра SETUP

RW = [0] — запись

CH1 CH0 = [01] — выбран канал №2

Регистр Setup

Регистр SETUP содержит биты настройки коэффициента усиления G2 G1 G0 (от 1 до 128), режимы калибровки MD1 MD0, тип входного сигнала B/U (униполярный\биполярный).

Биты G2 G1 G0

Режимы калибровки:

MD1 MD0 = [00] — рабочий режим, калибровка не проводится

MD1 MD0 = [01] — калибровка нуля и опорного напряжения

MD1 MD0 = [10] — калибровка нуля 

MD1 MD0 = [11] — калибровка опорного напряжения

После процедуры калибровки биты MD1 MD0 возвращаются в рабочий режим [00].

Регистр Clock 

Регистр Clock содержит делитель тактовых импульсов на 2 (бит CLKDIS), бит выбора частоты кварцевого резонатора (бит CLKDIV) и биты CLK FS1 FS0 определяющие скорость опроса АЦП (частота дискретизации).

*Бит CLK доступен при использовании кварцевого резонатора 4.9152 MHz

Регистр данных (Data Register)

16 — и бытный регистр, содержит результат измерения.

Ниже показаны эпюры сигналов в режиме чтения и записи регистров.

Запись

Чтение

При записи данных в регистр сигнал CS служит сигналом начала и конца записи данных, запись бита производится на возрастающем фронте сигнала синхронизации SCLK.

При чтении главным условием для начала чтения данных служит сигнал готовности АЦП к передаче данных DRDY, в данном примере сигнал готовности DRDY снимается в выхода АЦП, но можно и не использовать выход DRDY, а брать состояние готовности с бита DRDY коммуникационного регистра. Далее после сигнала CS, на каждом возрастающем фронте сигнала синхронизации SCLK происходит считывание 1 бита данных с выхода DOUT. Запись как и чтение начинается со старшего разряда.

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

Схема включения при измерении униполярного напряжения

Тестовый скетч

// AD7706
#define SCLK   2
#define CS     3
#define DIN    4
#define DOUT   5
#define DRDY   6
 
#define REF   2.500  
 
#define AIN1   0b00  
#define AIN2   0b01  
#define AIN3   0b11 
 
#define GAIN_1       0b000000      
#define GAIN_2       0b001000      
#define GAIN_4       0b010000     
#define GAIN_8       0b011000     
#define GAIN_16      0b100000     
#define GAIN_32      0b101000      
#define GAIN_64      0b110000      
#define GAIN_128     0b111000
 
#define F20     0b000  // 5.24 Hz
#define F25     0b001  // 6.55 Hz
#define F100    0b010  // 26.2 Hz
#define F200    0b011  // 52.4 Hz
 
unsigned long times;
 
void setup() {
  Serial.begin(9600);
  pinMode(SCLK,OUTPUT);
  pinMode(CS,OUTPUT);
  pinMode(DIN,OUTPUT);
  pinMode(DOUT,INPUT);
  pinMode(DRDY,INPUT);
  digitalWrite(SCLK,HIGH);
  digitalWrite(CS,HIGH);
  digitalWrite(DIN,HIGH);
  reset();
 
  write_byte(0x20|AIN2); 
  write_byte(0x00|F20); // Clock | 2.4576 MHz
  delay(100);
}
 
void loop() {
   times=millis();
   write_byte(0x10|AIN2);
   write_byte(0b01000100|GAIN_1); // Setup | Self-Calibration
 
   // Измеренное напряжение от 0 до +2,5 В
   write_byte(0x38|AIN2);
   unsigned int u_data = read_byte();
   Serial.println(REF/65535 * (u_data),5 );
 
   // Цифровое значение от 0(0,0В) до 65535(+2,5В)
   Serial.println(u_data);
 
   /// Частота опроса
   Serial.print("F = ");Serial.print(1/ ((float(millis()-times))/1000));Serial.println(" Hz");
   Serial.println();
   delay(1000);
}
 
void write_byte(byte data){
     digitalWrite(CS,LOW);
  for(int i = 7; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(DIN, (data >> i) & 1);
     digitalWrite(SCLK,HIGH);
     }  
     digitalWrite(CS,HIGH);
     }
 
unsigned int read_byte(){
  unsigned int data_out=0;
  unsigned int dat;
  while(digitalRead(DRDY)!=LOW);
     digitalWrite(CS,LOW); 
  for(int i = 15; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(SCLK,HIGH);
     dat = digitalRead(DOUT);
     data_out |= (dat<<i); 
     }
     digitalWrite(CS,HIGH);
     return data_out; 
  }
 
void reset(){
     digitalWrite(CS,LOW);
  for(int i = 31; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(DIN, HIGH);
     digitalWrite(SCLK,HIGH);
     }
     digitalWrite(CS,HIGH);
  }

На вход №2 подано напряжение в 1,8 В. В мониторе порта отображается частота опроса, измеренное напряжение и его цифровое значение которое может находится в пределах от 0 до 65535 (16 бит).

Схема включения при измерении биполярного напряжения


При измерении биполярного напряжения на вход COMMON подается опорное напряжение для создания средней точки, при этом источник входного сигнала не должен иметь соединения с GND АЦП.

Тестовый скетч

// AD7706
#define SCLK   2
#define CS     3
#define DIN    4
#define DOUT   5
#define DRDY   6
 
#define REF   2.500  
 
#define AIN1   0b00  
#define AIN2   0b01  
#define AIN3   0b11 
 
#define GAIN_1       0b000000      
#define GAIN_2       0b001000      
#define GAIN_4       0b010000     
#define GAIN_8       0b011000     
#define GAIN_16      0b100000     
#define GAIN_32      0b101000      
#define GAIN_64      0b110000      
#define GAIN_128     0b111000
 
#define F20     0b000  // 5.24 Hz
#define F25     0b001  // 6.55 Hz
#define F100    0b010  // 26.2 Hz
#define F200    0b011  // 52.4 Hz
 
unsigned long times;
 
void setup() {
  Serial.begin(9600);
  pinMode(SCLK,OUTPUT);
  pinMode(CS,OUTPUT);
  pinMode(DIN,OUTPUT);
  pinMode(DOUT,INPUT);
  pinMode(DRDY,INPUT);
  digitalWrite(SCLK,HIGH);
  digitalWrite(CS,HIGH);
  digitalWrite(DIN,HIGH);
  reset();
 
  write_byte(0x20|AIN2); 
  write_byte(0x00|F100); // Clock | 2.4576 MHz
  delay(100);
}
 
void loop() {
   times=millis();
   write_byte(0x10|AIN2);
   write_byte(0b01000000|GAIN_1); // Setup | Self-Calibration
 
   // Измеренное напряжение от 0 до +/-2,5 В
   write_byte(0x38|AIN2);
   unsigned int u_data = read_byte();
   Serial.println(REF/32768 * (u_data-32768),5 );
 
   // Цифровое значение от 0(-2,5В) до 65535(+2,5В), середина шкалы 32768(0,0В)
   Serial.println(u_data);
 
   /// Частота опроса
   Serial.print("F = ");Serial.print(1/ ((float(millis()-times))/1000));Serial.println(" Hz");
   Serial.println();
   delay(1000);
}
 
void write_byte(byte data){
     digitalWrite(CS,LOW);
  for(int i = 7; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(DIN, (data >> i) & 1);
     digitalWrite(SCLK,HIGH);
     }  
     digitalWrite(CS,HIGH);
     }
 
unsigned int read_byte(){
  unsigned int data_out=0;
  unsigned int dat;
  while(digitalRead(DRDY)!=LOW);
     digitalWrite(CS,LOW); 
  for(int i = 15; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(SCLK,HIGH);
     dat = digitalRead(DOUT);
     data_out |= (dat<<i); 
     }
     digitalWrite(CS,HIGH);
     return data_out; 
  }
 
void reset(){
     digitalWrite(CS,LOW);
  for(int i = 31; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(DIN, HIGH);
     digitalWrite(SCLK,HIGH);
     }
     digitalWrite(CS,HIGH);
  }

На вход №2 подано напряжение в +1,48 В. В мониторе порта отображается частота опроса, измеренное напряжение и его цифровое значение которое может находится в пределах от 32768 (0 В) до 65535 (+2,5 В) (15 бит).

На вход №2 подано напряжение в -1,48 В. В мониторе порта отображается частота опроса, измеренное напряжение и его цифровое значение которое может находится в пределах от 0 (-2,5 В) до 32768 (0 В) (15 бит).

Даташит — ad7706.pdf

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

Войти с помощью: