evg

Работа с АЦП Analog Devices

AD7730

Datasheet AD7730

AD7730 - это полнофункциональный аналоговый входной интерфейс для схем измерения давления и электронных весов. Компонент принимает на вход слабые сигналы непосредственно от датчика и выдает цифровой результат преобразования в последовательном формате. Входной сигнал поступает во входной каскад с программируемым коэффициентом усиления, а затем на аналоговый модулятор. Выходной сигнал модулятора обрабатывается программируемым цифровым фильтром нижних частот с регулируемыми частотой среза, частотой обновления выходных данных и временем установления.

AD7730 имеет два буферизированных дифференциальных аналоговых входа с программируемым усилением и дифференциальный вход опорной частоты. Компонент работает с однополярным напряжением питания +5 В и поддерживает четыре диапазона однополярных входных напряжений (от 0 мВ до 10 мВ, 20 мВ, 40 мВ и 80 мВ), а также четыре диапазона биполярных входных напряжений (±10 мВ, ±20 мВ, ±40 мВ и ±80 мВ). Преобразователь обеспечивает разрешение “от пика до пика” (диапазон измерения без шумов) 1 к 230000. Интегрированный 6-разрядный ЦАП может использоваться для компенсации напряжений, соответствующих весу тары. Компонент также содержит схемы формирования тактовых сигналов синхронизации для возбуждения моста сигналами переменного напряжения.

Последовательный интерфейс компонента может быть сконфигурирован для работы в трехпроводном режиме и обеспечивает совместимость с микроконтроллерами, а также цифровыми сигнальными процессорами. AD7730 имеет функции самокалибровки и системной калибровки. Дрейф напряжения смещения и коэффициента усиления составляет менее 5 нВ/°C и 2 ppm/°C, соответственно. Компонент выпускается в 24-выводном пластиковом корпусе DIP, 24-выводном корпусе SOIC и 24-выводном корпусе TSSOP.


#include <SPI.h>
/*

 DRDY: pin 6
 CSB: pin 7
 MOSI: pin 11
 MISO: pin 12
 SCK: pin 13
*/


const int dataReadyPin = 6;
const int chipSelectPin = 7;
const int resetPin = 8;

#define STATUS_REG 0
#define DATA_REG   1
#define MODE_REG   2
#define FILTER_REG 3
#define DAC_REG    4
#define OFFSET_REG 5
#define GAIN_REG   6
#define TEST_REG   7

//STATUS REG
#define READY   (1<<7)
#define STEADY  (1<<6)
#define STANDBY (1<<5)
#define NOREF   (1<<4)


//MODE REG
#define IDLE_MODE        0
#define CONT_CONV_MODE   1
#define SINGLE_CONV_MODE 2
#define POWER_DOWN_MODE  3
#define INT_ZS_CAL       4
#define INT_FS_CAL       5
#define SYS_ZS_CAL       6
#define SYS_FS_CAL       7

//byte 1
#define MODE(v) (v<<5)
#define BIPOLAR  0
#define UNIPOLAR (1<<4)
#define DATA_LENGTH (1<<0)
#define DIG_OUT_D0 (1<<1)
#define DIG_OUT_D1 (1<<2)
#define DIGITAL_OUT_EN (1<<3)

//byte 2
#define HIREF (1<<7)

#define INPUT_RANGE_10 0
#define INPUT_RANGE_20 1
#define INPUT_RANGE_30 2
#define INPUT_RANGE_40 3

#define SEL_RANGE(v) (v<<4)
#define MASTER_CLOCK_DIS (1<<3)
#define BO (1<<2)

#define CH1_1 0
#define CH2_2 1
#define CHm1_1 2
#define CHm1_2 3

//filter
//3
#define CHOP_EN (1<<4)
#define AC_EN   (1<<5)
//2
#define FAST_STEP 1
#define FIR_SKIP  2
//filter section 4 - 7
//1
//filter section
//chop     skip     sf val            update rate
// 0        0     2048 - 150         150 - 2.048 kHz
// 1        0     2048 - 75          50 - 1.365 kHz
// 0        1     2048 - 40          150 - 7.6 kHz
// 1        1     2048 - 20          50 - 5.12 kHz

//DAC
// (Vref / 62.5) x (D / 32) = (Vref / 2000) x D
// s - sign (1 - "-", 0 - "+"), v - value
#define DAC(s,v) ((s*(1<<5)+v)&0x3f)

// write
#define _W(v) (v)
// read
#define _R(v) (0x10 | v)
// continuous read
#define _CR(v)(0x20 | v)
// continuous read end
#define _CRE 0x30 
int tt = 0;
#define WAIT_RDY {while((digitalRead(dataReadyPin)==LOW));}// && (tt < 100)){tt++; delay(5);Serial.print("-");}tt=0;}


#define CH_RANGE (HIREF + CH1_1 + SEL_RANGE(INPUT_RANGE_40))
void setup() {
  // put your setup code here, to run once:
  int i;
   Serial.begin(9600);

  // start the SPI library:
  SPI.begin();

  // initalize the  data ready and chip select pins:
  pinMode(dataReadyPin, INPUT);
  pinMode(chipSelectPin, OUTPUT);
  pinMode(resetPin, OUTPUT);  
  Serial.println("Init AD7730...");
  digitalWrite(chipSelectPin, HIGH);
  SPI.setClockDivider(SPI_CLOCK_DIV16);
  SPI.setDataMode(SPI_MODE3);
  SPI.setBitOrder(MSBFIRST);
  
  digitalWrite(resetPin, LOW);
  delay(100);
  digitalWrite(resetPin, HIGH);
  delay(100);
  /*while(1){
  WriteByte(_R(STATUS_REG));
  Serial.print("Status:");Serial.println(Read(1),HEX);
  WriteByte(_R(MODE_REG));
  Serial.print("Mode:");Serial.println(Read(2),HEX);
  WriteByte(_R(DAC_REG));
  Serial.print("Dac:");Serial.println(Read(1),HEX);  
  WriteByte(_R(FILTER_REG));
  Serial.print("Filter:");Serial.println(Read(3),HEX);  
  WriteByte(_R(GAIN_REG));
  Serial.print("Gain:");Serial.println(Read(3),HEX);  
  WriteByte(_R(TEST_REG));
  Serial.print("Test:");Serial.println(Read(3),HEX);    
  delay(500);
  }*/
  
  WriteByte(_W(FILTER_REG));
  WriteBuf(setbuf(0x70,0x00,AC_EN+CHOP_EN),3);  
  WriteByte(_W(DAC_REG));
  WriteByte(0);
//  WriteByte(_W(GAIN_REG));
//  WriteBuf(setbuf(0x80,0x00,AC_EN+CHOP_EN),3);
  WriteByte(_W(MODE_REG));
  WriteBuf(setbuf(BIPOLAR+MODE(INT_FS_CAL), CH_RANGE,0x00),2);  //FS cal
  WAIT_RDY;
  WriteByte(_W(MODE_REG));
  WriteBuf(setbuf(BIPOLAR+MODE(INT_ZS_CAL), CH_RANGE,0x00),2);  //ZS cal
  WAIT_RDY;  
  WriteByte(_W(MODE_REG));
  WriteBuf(setbuf(BIPOLAR+MODE(CONT_CONV_MODE), CH_RANGE,0x00),2);  //continuous conversion

  WriteByte(_R(STATUS_REG));
  Serial.print("Status:");Serial.println(Read(1),HEX);
  WriteByte(_R(MODE_REG));
  Serial.print("Mode:");Serial.println(Read(2),HEX);
  WriteByte(_R(DAC_REG));
  Serial.print("Dac:");Serial.println(Read(1),HEX);  
  WriteByte(_R(FILTER_REG));
  Serial.print("Filter:");Serial.println(Read(3),HEX);  
  WriteByte(_R(GAIN_REG));
  Serial.print("Gain:");Serial.println(Read(3),HEX);  

  WriteByte(_CR(DATA_REG));  
  

  
}
byte buf[10];
byte * setbuf(byte b1,byte b2,byte b3){
  buf[0] = b1;buf[1]=b2;buf[2]=b3;
  return buf;
}
void notbuf(void){
  buf[0] = ~buf[0]; buf[1]=~buf[1]; buf[2]=~buf[2]; 
}
unsigned long bufval(int bc){
  unsigned long v=0;int t=0;
  v = buf[t++];
  while(--bc){
    v = v << 8;
    v = v | (buf[t++]);
  }
 // v = buf[0]; v = v << 8;//Serial.print(v,HEX);Serial.print(" ");
//  v = v | (buf[1]); v = v << 8;//Serial.print(v,HEX);Serial.print(" ");
 // v = v | (buf[2]);
  //Serial.println(v,HEX);
  return v;
}

void printbuf(void)
{
 Serial.print(buf[0],HEX);Serial.print(" ");
 Serial.print(buf[1],HEX);Serial.print(" ");
 Serial.print(buf[2],HEX);Serial.println(" ");

}
void loop() {
  unsigned long v=0;
  // put your main code here, to run repeatedly:
    WAIT_RDY;   
    v = Read(3);
    Serial.println(v/100);
    //WriteByte(_R(STATUS_REG));
    //Serial.print(" S:");Serial.println(Read(1),HEX);
    WriteByte(_CR(DATA_REG));
    //v =  ReadReg(REG11_R2_RR,3);    Serial.print("REG_R2_RR: ");    
//Serial.print(v,HEX); Serial.print(" R2 = ");Serial.println(float(v)/F2_21,3);
  
  delay(100);
}

void WriteByte(byte data){   
  
 byte b;
 digitalWrite(chipSelectPin, HIGH);
 b=~data;
 SPI.transfer(b);  
 //printbuf();
 digitalWrite(chipSelectPin, LOW); 
// Serial.println(b,HEX);

}

void WriteBuf(byte *addr, int count){   
  
 byte b;
 notbuf();
 digitalWrite(chipSelectPin, HIGH);
 SPI.transfer(buf, count);   
 digitalWrite(chipSelectPin, LOW); 
 //printbuf();
}


byte Read8b(void){
  byte v;
  digitalWrite(chipSelectPin, HIGH);  
  v = SPI.transfer(v);  
  digitalWrite(chipSelectPin, LOW);      
  return ~v;
}
unsigned long Read(int bc) {// addr - address, bc - byte count
  //setbuf(0xff,0xff,0xff,0xff);
  setbuf(0,0,0);
  digitalWrite(chipSelectPin, HIGH);  
    SPI.transfer(buf,bc);  
    digitalWrite(chipSelectPin, LOW);    
    notbuf();
    //printbuf();
    return bufval(bc);
    
}

Коментарии