单片机学习小组
直播中

李浯

7年用户 1080经验值
私信 关注

ADS1220芯片具体有哪几种应用呢

ADS1220芯片具有哪些功能呢?
ADS1220芯片具体有哪几种应用呢?



回帖(1)

李进锋

2022-1-25 10:23:51
芯片简介
    一个具有 PGA、VREF、2 个 IDAC 和 SPI 接口的 24 位、2kSPS、4 通道、低功耗小型 Δ-Σ ADC。配置比较丰富,所以其应用可以很广泛。本文将具体介绍以下几种应用:
    1.4个输入通道,采用内部参考电压,用于多路单端信号采集。
    2.差分信号采集,配合PGA功能,用于采集电桥式称重/压力传感器等
    3.使用2 个 IDAC,用于三线PT100温度检测。
1.多路信号采集
1.1 硬件设计

        芯片为标准的4线SPI接口,另外DRDY引脚用于指示转换完成,可用可不用(不用时,可以通过软件读取寄存器来获取状态)。
        芯片的模拟电源和数字电源是独立的,没有要求两个电源必须一样(有些芯片有这个要求,使用时要注意)。
        外部参考电压没有使用,可以悬空。
       上图中的应用是4通道信号采集。AIN0~AIN3为4个通道输入,其中输入范围为0~VREF(内部参考电压为2.048V)。
        芯片与单片机的SPI接口连接,以STM32为例,接SPI1:

1.2 软件设计
        ADS1220虽然配置丰富,但只有4个寄存器,使用起来比较简单。
        官方提供了相关的驱动程序,单片机用的是MSP430,但是芯片寄存器的一些宏定义、函数都可以借鉴,只要稍微修改一下底层函数即可,也可以参考之前的文章。废话不多说,直接看初始化程序:

void ADS1220Init(void)
{
  uint8_t ch_cfg[4]={ADS1220_MUX_0_G|ADS1220_GAIN_1|ADS1220_PGA_BYPASS, ADS1220_CC|ADS1220_DR_45, ADS1220_VREF_INT|ADS1220_PSW_SW, ADS1220_IDAC1_OFF|ADS1220_IDAC2_OFF};


  ADS1220SendResetCommand();//复位


  HAL_Delay(100);
  ADS1220WriteRegister(ADS1220_0_REGISTER,4,ch_cfg);//配置4个寄存器
  HAL_Delay(100);
  ADS1220SendStartCommand();//启动转换
}


程序中将4个寄存器的值定义在一个数组ch_cfg[4]中,然后通过写寄存器函数,一次性写入到芯片。
    4个数组元素(寄存器)的定义如下:
ADS1220_MUX_0_G|ADS1220_GAIN_1|ADS1220_PGA_BYPASS---使能通道0和GND作为输入,增益为1,旁路(不适用)PGA
ADS1220_CC|ADS1220_DR_45---连续转换模式,转换速率为45SPS
ADS1220_VREF_INT|ADS1220_PSW_SW---使用内部参考电压,打开低侧电源开关
ADS1220_IDAC1_OFF|ADS1220_IDAC2_OFF---关闭IDAC1和IDAC2电流源
    配置完成后启动ADC,然后调用下面函数读取数据:

long ADS1220ReadData()
{
  long Data;
  /* assert CS to start transfer */


  ADS1220AssertCS(1);


  /* send the command byte */
//  ADS1220SendByte(ch,ADS1220_CMD_RDATA);
  /* get the conversion result */
#ifdef ADS1120
  Data = ADS1220ReceiveByte(ch);
  Data = (Data << 8) | ADS1220ReceiveByte(ch);
  /* sign extend data */
  if (Data & 0x8000)
    Data |= 0xffff0000;
#else
  Data = ADS1220ReceiveByte();
  Data = (Data << 8) | ADS1220ReceiveByte();
  Data = (Data << 8) | ADS1220ReceiveByte();
  /* sign extend data */
  if (Data & 0x800000)
    Data |= 0xff000000;
#endif
  /* de-assert CS */


  ADS1220AssertCS(0);


  return Data;
}
      

如果需要循环读取4个通道,则每次读取数据后,需要重新配置寄存器选择下一个通道,程序如下:



//选择通道函数
void ADS1220_SelCh(uint8_t ch)
{
  uint8_t cfg[2]={ADS1220_MUX_0_G|ADS1220_GAIN_1|ADS1220_PGA_BYPASS};
  
  switch(ch)
  {
    case 0://选择通道0
      cfg[0] = ADS1220_MUX_0_G|ADS1220_GAIN_1|ADS1220_PGA_BYPASS;
      ADS1220WriteRegister(ADS1220_0_REGISTER,1,cfg);
      break;
    case 1://选择通道1
      cfg[0] = ADS1220_MUX_1_G|ADS1220_GAIN_1|ADS1220_PGA_BYPASS;
      ADS1220WriteRegister(ADS1220_0_REGISTER,1,cfg);
      break;
    case 2://选择通道2
      cfg[0] = ADS1220_MUX_2_G|ADS1220_GAIN_1|ADS1220_PGA_BYPASS;
      ADS1220WriteRegister(ADS1220_0_REGISTER,1,cfg);
      break;
    case 3://选择通道3
      cfg[0] = ADS1220_MUX_3_G|ADS1220_GAIN_1|ADS1220_PGA_BYPASS;
      ADS1220WriteRegister(ADS1220_0_REGISTER,1,cfg);
      break;
  }
}


__IO uint16_t ADS1220_Tick = 0;
float Vin[4];
//循环读取4个通道
void ADS1220_GetData()
{
  uint32_t temp;
  static uint8_t ads_ch = 0;
   
  if(ADS1220_Tick<50)return;
  ADS1220_Tick=0;
  
  switch(ads_ch)
  {
    case 0://读取通道0 然后切换到通道1
        temp = ADS1220ReadData();
        Vin[0] = temp*2.048f/8388608;//转换为电压 单位V
        ads_ch = 1;
        ADS1220_SelCh(ads_ch);
        break;
    case 1://读取通道1 然后切换到通道2
        temp = ADS1220ReadData();
        Vin[1] = temp*2.048f/8388608;//转换为电压 单位V
        ads_ch = 2;
        ADS1220_SelCh(ads_ch);
        break;
    case 2://读取通道2 然后切换到通道3
        temp = ADS1220ReadData();
        Vin[2] = temp*2.048f/8388608;
        ads_ch = 3;
        ADS1220_SelCh(ads_ch);
        break;
    case 3://读取通道3 然后切换到通道0
        temp = ADS1220ReadData();
        Vin[3] = temp*2.048f/8388608;
        ads_ch = 0;
        ADS1220_SelCh(ads_ch);
        break;
    }
}

        需要说明的是,程序中没有判断转换完成标志,而是直接定时50ms读取,因为转换速率高于读取速率,且测量的是直流信号,所以这里影响不大。
2.电桥传感器应用
2.1 硬件设计
        AIN1和AIN2作为信号输入端,REFP1和REFN1用做参考电压。数字接口与上面的应用一样。

2.2 软件设计
        驱动程序与上面的应用一样,只是寄存器的配置不同,需要修改的也只有存储寄存器的数组ch_cfg[4]。电桥信号一般比较小,需要使能PGA功能。具体配置如下:
uint8_t ch_cfg[4]={ADS1220_MUX_1_2|ADS1220_GAIN_128, ADS1220_CC| ADS1220_DR_20, ADS1220_VREF_EX_AIN|ADS1220_PSW_SW, ADS1220_IDAC1_OFF|ADS1220_IDAC2_OFF};
4个数组元素(寄存器)的定义如下:
ADS1220_MUX_1_2|ADS1220_GAIN_128---使能通道1和通道2作为差分输入,增益为128
ADS1220_CC| ADS1220_DR_20---连续转换,转换速率为20SPS
ADS1220_VREF_EX_AIN|ADS1220_PSW_SW---使用 AIN0/REFP1 和 AIN3/REFN1 输入选择的外部基准电压,打开低测电源开关
ADS1220_IDAC1_OFF|ADS1220_IDAC2_OFF---关闭IDAC1和IDAC2电流源
该应用不用切换通道,直接调用ADS1220ReadData()函数定时读取数据即可。
3.三线PT100测温
3.1 硬件设计
        威廉希尔官方网站 图如下,用到了IDAC1和IDAC2两个可编程电流源,配置到AIN2和AIN3用于输出电流,参考电压配置为REFP0和REFN0。

3.2 软件设计:
寄存器配置如下:
uint8_t ch3_cfg[4]={ADS1220_MUX_0_1|ADS1220_GAIN_32, ADS1220_CC| ADS1220_DR_20, ADS1220_VREF_EX_DED|ADS1220_PSW_SW|ADS1220_IDAC_250, ADS1220_IDAC1_AIN2|ADS1220_IDAC2_AIN3};  
4个数组元素(寄存器)的定义如下:
ADS1220_MUX_0_1|ADS1220_GAIN_128---使能通道0和通道1作为差分输入,增益为32
ADS1220_CC| ADS1220_DR_20---连续转换,转换速率为20SPS
ADS1220_VREF_EX_DED|ADS1220_PSW_SW|ADS1220_IDAC_250---使用 REFP0 和 REFN0 输入选择的外部基准电压,打开低测电源开关,可编程电流源配置为250uA
ADS1220_IDAC1_AIN2|ADS1220_IDAC2_AIN3---IDAC1和IDAC2电流源分别配置到AIN2和AIN3通道。
        与电桥应用类似,该应用不用切换通道,直接调用ADS1220ReadData()函数定时读取数据即可。
        PS:至于PT100测温的原理、怎样设计和计算温度,提高精度等,将在以后文章中专门做介绍。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分