ADS1220的几种应用介绍(含源码)

       

         最近有好几个朋友私信问我ADS1220芯片相关的问题,之前的文章中做过一些介绍《SPI应用之驱动ADS1220》,今天再来做一个补充。

芯片简介

    一个具有 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 软件设计

        SPI的配置可参考之前的文章《SPI应用之驱动ADS1220》。

        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测温的原理、怎样设计和计算温度,提高精度等,将在以后文章中专门做介绍。

源码:(公众号不支持外部链接,请复制到浏览器打开)

链接:https://pan.baidu.com/s/1WqhXaRAcKy0qLyuifx8rvA

提取码:2ob2

推荐阅读:

STM32CubeMX系列教程

STM32F4通过U盘升级程序

远程升级单片机程序怎么设计?

    欢迎关注公众号"嵌入式技术开发",大家可以后台给我留言沟通交流。如果觉得该公众号对你有所帮助,也欢迎推荐分享给其他人。

  • 11
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 23
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值