最近有好几个朋友私信问我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(){Data; /* assert CS to start transfer */
1);
/* send the command byte */// ADS1220SendByte(ch,ADS1220_CMD_RDATA); /* get the conversion result */#ifdef ADS1120DataData = (Data << 8) | ADS1220ReceiveByte(ch);dataif (Data & 0x8000)Data |= 0xffff0000;#elseDataData = (Data << 8) | ADS1220ReceiveByte();Data = (Data << 8) | ADS1220ReceiveByte();dataif (Data & 0x800000)Data |= 0xff000000; #endif /* de-assert CS */
0);
return Data;}
如果需要循环读取4个通道,则每次读取数据后,需要重新配置寄存器选择下一个通道,程序如下:
需要说明的是,程序中没有判断转换完成标志,而是直接定时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