본문 바로가기

프로그래밍/프로그래밍_여러가지

AD7788, 16비트 ADC 사용하기 with 아두이노 우노

반응형

 
 


AD7788, 16비트 ADC 사용하기 with 아두이노 우노

 
16 bit 해상도를 가진 ADC 칩인 AD7788을 아두이노로 읽어보려 한다.
AD7788과 아두이노의 통신방법은 SPI통신이다.
 
ADC는 Analog to Digital Converter의 약자이며,
아날로그 값을 디지털로 변환해주는 칩이다.
 
회로도를 그리고 PCB까지 제작했지만 연결 오류가 있어서 회로를 수정해가며 테스트를 진행하게 되었다.
특히 SPI통신의 데이타라인에 직렬저항(댐핑저항)을 달아주어야 데이터 값이 정확히 인식되었다.
 

 
 
 
아두이노 우노 핀맵으로 검색한 뒤 SPI핀이 어떤 핀인지 확인하여 AD7788과 연결해주었다.
그리고 모든 신호는 귀환회로가 필요하므로 AD7788과 아두이노사이에 SPI통신 선과 함께 그라운드(GND)도 같이 연결해주어야 한다.

 
 
 
아두이노 우노.

 
 
 
AD7788이 장착된 PCB이다.
이것저것 실험하느라 점퍼날리고 부품 납땜한 흔적들이 보인다.

 

 
 
 
아두이노 우노 코드이다.
SPI라이브러리를 추가해야 한다.
AD7788은 칩선택핀에 LOW를 인가하고, DIN핀에 0x3C를 전송하면 Continuous Read Mode로 동작한다.
AD7788에 다른 설정없이 한 번 명령으로 디지털변환 데이터를 지속적으로 읽어 올 수 있다.

#include <SPI.h> //SPI라이브러리

uint8_t byteHigh, byteLow;
uint16_t value16;
float result1, result2; 

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  SPI.begin(); //SPI시작
  SPI.setClockDivider(SPI_CLOCK_DIV64); //SPI클럭설정-분주비
  //SPI.beginTransaction(SPISettings(250000, MSBFIRST, SPI_MODE3));
  digitalWrite(SS, HIGH); //Chip Select High
  delay(100);
  digitalWrite(SS, LOW); // //Chip Select Low
  Serial.println("Chip Select Low OK");
  delay(100);
  SPI.transfer(0x3C); //ADC에 0x3C(Continuous Read Mode) 전송
  Serial.println("transfer(0x3C) OK");
  delay(100);  
}

void loop() {
  // put your main code here, to run repeatedly:

  byteHigh = SPI.transfer(0x00);  //  데이터 수신 (0x00은 수신을 위한 더미값)
  byteLow = SPI.transfer(0x00);  //  데이터 수신 (0x00은 수신을 위한 더미값)
  delay(100);
  
  value16 = ((uint16_t)byteHigh << 8) | byteLow; //8비트 두개를 16비트로 저장
  //result = ((value16*2.5)/65536);

  result1 = (((float)value16 / 32768.0) - 1.0) * 2.5 * 2.5; //AD7788의 Bipolar 계산식 x AMC1350에 대한 2.5배 곱

  if (((result2-result1)>=0.005) || ((result1-result2)>=0.005))
  {
    Serial.println("0.005V 이상 오차발생");  
  }
  else
  {    
  Serial.print("2진수=");
  Serial.print(value16, BIN); //16비트 입력값을 2진수로 화면에 출력
  Serial.print(" : 10진수=");
  Serial.print(value16); //16비트 입력값을 출력(10진수)
  Serial.print(" : 전압=");
  Serial.print(result1,4); //최종결과값을 출력(실수, 소숫점 4자리)
  Serial.println(" : ok");  
  delay(100);  
  }
  
  result2=result1; //오차계산을 위한 값 이동

}

 
 
 
Continuous Read Mode 동작에 대한 도표이다.
칩셀렉트를 먼저 LOW로 떨어뜨린 뒤,
AD7788의 DIN핀에 0x3C를 입력시켜주면,
AD7788은 DOUT핀으로 AD변환데이타를 출력한다. 이 출력을 아두이노에서 읽어오면 된다.

 
 
 
변환데이터에 대한 계산식은 아래와 같다.
AD7788은 Bipolar와 Unipolar에 대한 계산식이 다르다. 현재 구성된 회로는 Bipolar 구성이기 때문에 아래 식을 적용했다.
이 변환식을 이해하는 것도 다소 까다로웠다. 데이타시트를 잘 확인할 줄 아는 능력이 필요하다.

Code는 입력받은 데이타의 10진수값이다.
2의 N-1에서 N은 해상도bit수이다. 16bit 이므로 N은 16이다. 따라서 2의 (16-1)승이고, 이걸 계산하면 32768이다.
AIN은 아날로그 입력 전압값이다.
Vref는 레퍼런스 전압이다. 위 회로에서 2.5V를 사용했으므로 Vref는 2.5이다.
 
 
아두이노 시리얼 모니터로 확인한 결과 화면이다.
본 실험에선 파워서플라이의 4.00V의 전압을 읽었는데
상당히 정확하게 아날로그 값을 읽어 올 수 있었다.

 
 
 
 
 
.
.
주께서 나의 슬픔이 변하여 내게 춤이 되게 하시며 
나의 베옷을 벗기고 기쁨으로 띠 띠우셨나이다
-성경 시편 30편 11절
 
 
 
 
 


 

반응형