1

Тема: MCP3421 — АЦП 18 bit

Микросхема MCP3421 компании Microchip представляет собой 18-битный одно канальный сигма-дельта АЦП, выпускаемый в миниатюрном 6-выводном корпусе SOT23-6 . АЦП имеет свой внутренний источник опорного напряжения и программируемый усилитель. Связь с микросхемой осуществляется по интерфейсу I2C.

http://rcl-radio.ru/wp-content/uploads/2019/06/762346632487.png

Максимальное напряжение измеряемое АЦП находится в пределах ± 2,048 В при множители усилителя 1, при множителях 2, 4 и 8 диапазон измерения равен ± 1,024 В, ± 0,512 В и ± 0,256 В соответственно. АЦП может работать в режиме измерения 18, 16, 14 и 12 бит, при скорости измерения 3.75 SPS, 15 SPS, 60 SPS и 240 SPS соответственно, при этом один бит отводится под знак результата. Напряжение питания микросхемы MCP3421 должно находится в пределах от 2,7 до 5,5 В.

MCP3421.h

#ifndef MCP3421_H
#define MCP3421_H

#define MCP3421_address 0x68 

#include <Arduino.h>

class MCP3421
{
  public:
    MCP3421();
        void setConfig(int bit, int gain); 
        int32_t readWire(void);
    
  private:
    void writeWire(char a);      
};
    
#endif //MCP3421_H

MCP3421.cpp

#include <Arduino.h>
#include <Wire.h>
#include "MCP3421.h"

MCP3421::MCP3421(){
    Wire.begin();
}

void MCP3421::setConfig(int bit, int gain){
     switch (bit){
        case 0:bit = 0b00000000;break;
        case 1:bit = 0b00000100;break;
        case 2:bit = 0b00001000;break;
        case 3:bit = 0b00001100;break;
  }
 switch (gain){
        case 0:gain = 0b00000000;break;
        case 1:gain = 0b00000001;break;
        case 2:gain = 0b00000010;break;
        case 3:gain = 0b00000011;break;
  }
        int conf = 0b00010000 + bit + gain;
     writeWire(conf);
}


void MCP3421::writeWire(char a){
     Wire.beginTransmission(MCP3421_address);
     Wire.write (a);
     Wire.endTransmission();
}

int32_t MCP3421::readWire(){
        Wire.requestFrom(MCP3421_address,3); //запросить 3 байта данных
   long value = ((Wire.read()<<8) | Wire.read());//упаковка в одну переменную.
        value = ((value<<8)| Wire.read());
   return (int32_t)value;
}