본문 바로가기
Embedded System/센서&액추에이터

ADS1115 (16bit ADC)

by MachineJW 2024. 7. 10.

1. 개요

TI 사의 ADS1115 IC와 IC를 사용한 ADC 모듈

센서를 구현하다 보면 ADC를 꼭 사용해야 하는 경우가 있다. ESP32의 경우 12bit 해상도의 ADC를 내장하고 있지만 더 정밀하게 센서로 부터 나오는 아날로그 신호 (0~3.3V)를 다루고 싶어졌다.

외부 ADC로 유명한게 TI 회사의 ADS IC인데 그중 ADS1115 모델은 무려 16비트의 해상도를 지원하고 있다! 

 

2. 데이터시트

ADS1115의 내부 구성도와 칩 도면

ADS1115는 1초당 860회의 샘플링 속도를 갖추고 있으며 차동신호일경우 ADC 입력을 2개로 받아 차동신호와 싱글엔디드 신호로 나눌수가 있다.

그리고 해당되는 데이터는 I2C 통신으로 값을 얻어올 수 있다.

특이해 보이는 건 ALERT/RDY 핀 인데, IC에서 출력되어 나오는 신호인 것 같다.

ADS1115의 ADC가 (변환, 출력등이)준비된 상태일 경우 HIGH가 출력되는 구조로 보인다.

전원의 VDD 부분에는 0.1uF 정도의 바이패스 커패시터가 권장되고 있다.

아날로그 INPUT은 역시 IC의 입력되는 전원 Voltage 수준까지 변환한다. 근데 I2C 통신라인은 최대 5.5V 까지 허용할 수 있도록 만들어졌나보다 ㅎㅎ

ADDR 핀을 다음과 같은 핀에 연결하면 I2C 슬레이브주소 값을 설정할 수 있다.

3. 라이브러리 CPP 확인

class Adafruit_ADS1X15 {
protected:
  // Instance-specific properties
  Adafruit_I2CDevice *m_i2c_dev; ///< I2C bus device
  uint8_t m_bitShift;            ///< bit shift amount
  adsGain_t m_gain;              ///< ADC gain
  uint16_t m_dataRate;           ///< Data rate

public:
  bool begin(uint8_t i2c_addr = ADS1X15_ADDRESS, TwoWire *wire = &Wire);
  int16_t readADC_SingleEnded(uint8_t channel);
  int16_t readADC_Differential_0_1();
  int16_t readADC_Differential_0_3();
  int16_t readADC_Differential_1_3();
  int16_t readADC_Differential_2_3();
  void startComparator_SingleEnded(uint8_t channel, int16_t threshold);
  int16_t getLastConversionResults();
  float computeVolts(int16_t counts);
  void setGain(adsGain_t gain);
  adsGain_t getGain();
  void setDataRate(uint16_t rate);
  uint16_t getDataRate();

  void startADCReading(uint16_t mux, bool continuous);

  bool conversionComplete();

private:
  void writeRegister(uint8_t reg, uint16_t value);
  uint16_t readRegister(uint8_t reg);
  uint8_t buffer[3];
};

/**************************************************************************/
/*!
    @brief  Sensor driver for the Adafruit ADS1015 ADC breakout.
*/
/**************************************************************************/
class Adafruit_ADS1015 : public Adafruit_ADS1X15 {
public:
  Adafruit_ADS1015();
};

/**************************************************************************/
/*!
    @brief  Sensor driver for the Adafruit ADS1115 ADC breakout.
*/
/**************************************************************************/
class Adafruit_ADS1115 : public Adafruit_ADS1X15 {
public:
  Adafruit_ADS1115();
};

헤더파일에 선언된 클래스, 변수 들이다. 메모리 주소값둘아 #define 형태로 많이 선언되어 있었지만, 가독성을 위하여 클래스 선언부만 가져왔다.

4. 회로 구현하기

Adafruit 회사의 ADC 모듈 회로도

Adafruit 사의 ADS1115모듈에는 I2C SDA와 SCL 신호선에 10K옴의 풀업이 되어 있으며, 다른 사항은 특별한게 딱히 없다. 슬레이브 주소값에 따라 잘 연결하여 잘 사용하면 될것 같다.