完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
芯片简介
一个具有 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测温的原理、怎样设计和计算温度,提高精度等,将在以后文章中专门做介绍。 |
|
|
|
只有小组成员才能发言,加入小组>>
3310 浏览 9 评论
2991 浏览 16 评论
3492 浏览 1 评论
9057 浏览 16 评论
4086 浏览 18 评论
1176浏览 3评论
604浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
597浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2334浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1895浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 16:40 , Processed in 1.022126 second(s), Total 50, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号