ADS1220芯片说明
ADS1220 是一款精密 24 位模数转换器 (ADC),所集成的多种 特性 能够降低系统成本并减少小型传感器信号测量 应用 中的组件数量。该器件 具有 通过输入多路复用器 (MUX) 实现的两个差分输入或四个单端输入,一个低噪声可编程增益放大器 (PGA),两个可编程激励电流源,一个电压基准,一个振荡器,一个低侧开关和一个精密温度传感器。
此器件能够以高达 2000 次/秒 (SPS) 采样数据速率执行转换,并且能够在单周期内稳定。针对噪声环境中的工业应用,当采样频率为 20SPS 时,数字滤波器可同时提供 50Hz 和 60Hz 抑制。内部 PGA 提供高达 128V/V 的增益。此 PGA 使得 ADS1220 非常适用于小型传感器信号测量 应用 ,例如电阻式温度检测器 (RTD)、热电偶、热敏电阻和阻性桥式传感器。该器件在使用 PGA 时支持测量伪差分或全差分信号。此外,该器件还可配置为禁用内部 PGA,同时仍提供高输入阻抗和高达 4V/V 的增益,从而实现单端测量。
在禁用 PGA 后的占空比模式下运行功耗可低至 120µA。ADS1220 采用无引线 VQFN-16 或薄型小外形尺寸 (TSSOP)-16 封装,额定工作温度范围为 -40°C 至 +125°C。
官网介绍https://www.ti.com.cn/document-viewer/cn/ADS1220/datasheet
开发手册下载https://www.ti.com.cn/cn/lit/gpn/ADS1220
市面上常见的模块
本次实验使用的
实验平台:
STM32F103C8T6最小系统
/**************************************************************************
接线顺序
*************************************************************************/
//PB0 DRDY
//PB1 CS
//PA5 MOSI
//PA6 SCK
//PA7 MISO
MIAN函数
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "tm1637.h"
#include "oled.h"
#include "bmp.h"
#include "ADS1220.h"
int main(void)
{
unsigned long tempA;
float dianya;
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
uart_init(115200);
printf("串口初始化成功");
delay_ms(1000);
ADS1220_GPIOInit();
while(1)
{
LED0=0;
delay_ms(300); //延时300ms
LED0=1;
delay_ms(300); //延时300ms
//--------------测试单极性-------------------------
tempA = GetAD(0);//配置为单极性输入模式,通道0输入
printf("ADC采样数值%d \r\n",tempA);
dianya = (float)tempA*2.048/8388608;
printf("电压%10f.4 v\r\n",dianya);//显示电压V
dianya = dianya*1000;
printf("电压%10f.4 mv\r\n",dianya);//显示电压mV
dianya = dianya*1000;
printf("电压%10f.4 uv\r\n",dianya);//显示电压uV
printf("*********************\r\n");
//---------------测试双极性------------------------------------------------
// tempA = GetAD(4);//配置为单极性输入模式,通道4输入
// dianya = (float)tempA*2.048/8388608;
// dianya = dianya*1000000;
// printf("电压 dianya=%10f uv\r\n",dianya);//unsigned long 0~4294967295
//-------------------------------------------------------------------------
delay_ms(100);
}
}
H文件
#ifndef _ADS1220_H_
#define _ADS1220_H_
#include "sys.h"
extern unsigned char PolarFlag;
#define RESET 0X03
#define START 0X08
#define POWERDOWN 0X02
#define RDATA 0X10
#define RREG 0X20
#define WREG 0X40
/*-----------输入多路复用器配置 -------------------------
**这些位配置输入多路复用器。
**对于 AINN = AVSS 的设置,PGA 必须禁用 (PGA_BYPASS = 1),
**并且仅可使用 增益 1、2 和 4。
-------------------------------------------------------*/
#define MUX_0 0X00//0000:AINP = AIN0,AINN = AIN1(默认设置)
#define MUX_1 0X10//0001:AINP = AIN0,AINN = AIN2
#define MUX_2 0X20//0010:AINP = AIN0,AINN = AIN3
#define MUX_3 0X30//0011:AINP = AIN1,AINN = AIN2
#define MUX_4 0X40//0100:AINP = AIN1,AINN = AIN3
#define MUX_5 0X50//0101:AINP = AIN2,AINN = AIN3
#define MUX_6 0X60//0110:AINP = AIN1,AINN = AIN0
#define MUX_7 0X70//0111:AINP = AIN3,AINN = AIN2
#define MUX_8 0X80//1000:AINP = AIN0,AINN = AVSS
#define MUX_9 0X90//1001:AINP = AIN1,AINN = AVSS
#define MUX_10 0XA0//1010:AINP = AIN2,AINN = AVSS
#define MUX_11 0XB0//1011:AINP = AIN3,AINN = AVSS
#define MUX_12 0XC0//1100:(V(REFPx) – V(REFNx)) / 4 监视(旁路 PGA)
#define MUX_13 0XD0//1101:(AVDD – AVSS) / 4 监视(旁路 PGA)
#define MUX_14 0XE0//1110:AINP 和 AINN 短接至 (AVDD + AVSS) / 2
//1111:保留
/*------------增益配置----------------------------------
**这些位用于配置器件增益。 在不使用 PGA 的情况下,
**可使用增益 1、2 和 4。在这种情况下,通过开关电容结 构获得增益。
------------------------------------------------------*/
#define PGA_0 0X00//000:增益 = 1(默认设置)//FS=6.144V
#define PGA_1 0X02//001:增益 = 2//FS=4.096V
#define PGA_4 0X04//010:增益 = 4//FS=2.048V
#define PGA_8 0X06//011:增益 = 8//FS=1.024V
#define PGA_16 0X08//100:增益 = 16//FS=0.512V
#define PGA_32 0X0A//101:增益 = 32//FS=0.256V
#define PGA_64 0X0C//110:增益 = 64//FS=0.256V
#define PGA_12 0X0E//111:增益 = 128//FS=0.256V
/*-----------------禁用和旁路内部低噪声 PGA----------------------
**禁用 PGA 会降低整体功耗,并可将共模电压范围 (VCM) 扩展为 AVSS – 0.1V 至AVDD + 0.1V。
**只能针对增益 1、2 和 4 禁用 PGA。
无论 PGA_BYPASS 设置如何,都始终针对增益设置 8 至 128 启用 PGA。
**0:PGA 已启用(默认设置)
**1:PGA 已禁用和旁路
---------------------------------------------------------------------*/
#define PGA_BYPASS_Enable 0x00//PGA 已启用(默认设置)
#define PGA_BYPASS_Disable 0x01//已禁用和旁路
/*----------------------数据速率----------------------------------
**这些位控制数据速率设置,取决于所选工作模式。
**表 18 列出了正常模式、占空比 模式和 Turbo 模式对应的位设置。
-----------------------------------------------------------------*/
#define DR_20SPS 0X00
#define DR_45SPS 0X20
#define DR_90SPS 0X40
#define DR_175SPS 0X60
#define DR_330SPS 0X80
#define DR_600SPS 0XA0
#define DR_1000SPS 0XC0
/*-----------------工作模式 ---------------------------------------
**这些位控制器件所处的工作模式。
00:正常模式(256kHz 调制器时钟,默认设置)
01:占空比模式(内部占空比 1:4)
10:Turbo 模式(512kHz 调制器时钟)
11:保留
------------------------------------------------------------------*/
#define MODE_0 0x00 //正常模式(256kHz 调制器时钟,默认设置)
#define MODE_1 0x08 //占空比模式(内部占空比 1:4)
#define MODE_2 0x10 //Turbo 模式(512kHz 调制器时钟)
/*------------------转换模式----------------------------------------
此位用于为器件设置转换模式。
0:单次模式(默认设置)
1:连续转换模式
-------------------------------------------------------------------*/
#define ConverMode_0 0x00//单次模式(默认设置)
#define ConverMode_1 0x04//连续转换模式
/*--------------------温度传感器模式------------------------------
此位用于启用内部温度传感器以及将器件置于温度传感器模式下。
启用温度传感器模式后,配置寄存器 0 的设置不会产生任何影响,
器件会使用内部 基准进行测量。
0:禁用温度传感器(默认设置)
1:启用温度传感器
--------------------------------------------------------------------*/
#define TS_Disable 0x00//禁用温度传感器(默认设置)
#define TS_Enable 0x02//启用温度传感器
/*---------------------烧毁电流源-----------------------------------
此位用于控制 10μA 烧毁电流源。
烧毁电流源可用于检测传感器故障(例如,传感器断路和短路)。
0:电流源关断(默认设置)
1:电流源接通
-------------------------------------------------------------------*/
#define BCS_Disable 0x00//电流源关断(默认设置)
#define BCS_Enable 0x01//电流源接通
/*--------------------基准电压选择---------------------------------
这些位用于选择转换所使用的基准电压源。
00:选择 2.048V 内部基准电压(默认设置)
01:使用专用 REFP0 和 REFN0 输入选择的外部基准电压
10:使用 AIN0/REFP1 和 AIN3/REFN1 输入选择的外部基准电压
11:用作基准的模拟电源 (AVDD – AVSS)
--------------------------------------------------------------------*/
#define VREF_0 0X00//选择 2.048V 内部基准电压(默认设置)
#define VREF_1 0X40//使用专用 REFP0 和 REFN0 输入选择的外部基准电压
#define VREF_2 0X80//使用 AIN0/REFP1 和 AIN3/REFN1 输入选择的外部基准电压
#define VREF_3 0XC0//用作基准的模拟电源 (AVDD – AVSS)
/*----------------------FIR 滤波器配置------------------------------
这些位用于为内部 FIR 滤波器配置滤波器系数。
在正常模式下,这些位仅与 20SPS 设置结合使用;
在占空比模式下,这些位仅与
5SPS 设置结合使用。对于所有其他数据速率,这些位均设置为 00。
00:无 50Hz 或 60Hz 抑制(默认设置)
01:同时抑制 50Hz 和 60Hz
10:只抑制 50Hz
11:只抑制 60Hz
------------------------------------------------------------------*/
#define FIR_Mode0 0x00//无 50Hz 或 60Hz 抑制(默认设置)
#define FIR_Mode1 0x10//同时抑制 50Hz 和 60Hz
#define FIR_Mode2 0x20//只抑制 50Hz
#define FIR_Mode3 0x30//只抑制 60Hz
/*----------------------低侧电源开关配置 --------------------------
此位用于配置 AIN3/REFN1 和 AVSS 之间连接的低侧开关的行为。
0:开关始终处于断开状态(默认设置)
1:开关会在发送 START/SYNC 命令时自动闭合,并在发出 POWERDOWN 命令 时自动断开。
------------------------------------------------------------------*/
#define PSW_ON 0X00//开关始终处于断开状态(默认设置)
#define PSW_OFF 0X08//开关会在发送 START/SYNC 命令时自动闭合,并在发出 POWERDOWN 命令 时自动断开。
/*---------------------IDAC 电流设置-----------------------------
这些位用于为 IDAC1 和 IDAC2 激励电流源设置电流。
----------------------------------------------------------------*/
#define IDAC_0 0X00 //000:关断(默认设置)
#define IDAC_1 0X00 //001:10μA
#define IDAC_2 0X02 //010:50μA
#define IDAC_3 0X03 //011:100μA
#define IDAC_4 0X04 //100:250μA
#define IDAC_5 0X05 //101:500μA
#define IDAC_6 0X06 //110:1000μA
#define IDAC_7 0X07 //111:1500μA
/*------------------------IDAC1 路由配置-------------------------
这些位用于选择 IDAC1 将路由到的通道。
111:保留
----------------------------------------------------------------*/
#define IDAC1_0 0X00 //000:IDAC1 已禁用(默认设置)
#define IDAC1_1 0X20 //001:IDAC1 已连接至 AIN0/REFP1
#define IDAC1_2 0X40 //010:IDAC1 已连接至 AIN1
#define IDAC1_3 0X60 //011:IDAC1 已连接至 AIN2
#define IDAC1_4 0X80 //100:IDAC1 已连接至 AIN3/REFN1
#define IDAC1_5 0XA0 //101:IDAC1 已连接至 REFP0
#define IDAC1_6 0XC0 //110:IDAC1 已连接至 REFN0
/*------------------------IDAC2 路由配置-------------------------
这些位用于选择 IDAC2 将路由到的通道。
111:保留
----------------------------------------------------------------*/
#define IDAC2_0 0X00 //000:IDAC2 已禁用(默认设置)
#define IDAC2_1 0X04 //001:IDAC2 已连接至 AIN0/REFP1
#define IDAC2_2 0X08 //010:IDAC2 已连接至 AIN1
#define IDAC2_3 0X0c //011:IDAC2 已连接至 AIN2
#define IDAC2_4 0X10 //100:IDAC2 已连接至 AIN3/REFN1
#define IDAC2_5 0X14 //101:IDAC2 已连接至 REFP0
#define IDAC2_6 0X18 //110:IDAC2 已连接至 REFN0
/*-----------------------DRDY 模式 -----------------------------
该位用于控制新数据就绪时 DOUT/DRDY 引脚的行为。
---------------------------------------------------------------*/
#define DRDY_Mode0 0x00 //0:仅专用 DRDY 引脚用于指示数据何时就绪(默认设置)
#define DRDY_Mode1 0x02 //1:同时通过 DOUT/DRDY 和 DRDY 指示数据就绪。
void ADS1220_Init(void);
unsigned long GetAD(unsigned char channel);
void ADS1220_GPIOInit(void);
#endif
C文件
#include "ADS1220.h"
#include "delay.h"
unsigned char PolarFlag;
unsigned char Init_Config[4],channel0[8],channel1[8],channel2[8],channel3[8];
unsigned char i;
/***************************************************************************
接线顺序
*************************************************************************/
//PB0 DRDY
//PA7 MISO
#define DIN_H GPIO_SetBits(GPIOA,GPIO_Pin_5) //PA5 MOSI
#define DIN_L GPIO_ResetBits(GPIOA,GPIO_Pin_5) //PA5 MOSI
#define SCK_H GPIO_SetBits(GPIOA,GPIO_Pin_6) //PA6 SCK
#define SCK_L GPIO_ResetBits(GPIOA,GPIO_Pin_6) //PA6 SCK
#define CS_H GPIO_SetBits(GPIOB,GPIO_Pin_1) //PB1 CS
#define CS_L GPIO_ResetBits(GPIOB,GPIO_Pin_1) //PB1 CS
void ADS1220_GPIOInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA, ENABLE); //使能端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6; //PA5 PA6 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化
GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; // 端口配置 PA7
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 端口配置 PB0 DRDY
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // 端口配置 PB1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/***************************************************************************
函数名称:WriteOneByte(unsigned char 命令)
用途:写入一个字节到ADS1220
*************************************************************************/
void WriteOneByte(unsigned char command)
{
unsigned char i;
for(i = 0; i < 8;i++)
{
if(command&0x80)
DIN_H;//ADS1220_DIN = 1;
else
DIN_L;//ADS1220_DIN = 0;/
command <<= 1;
delay_us(10);
SCK_H;//ADS1220_SCK = 1;
delay_us(10);
SCK_L;//ADS1220_SCK = 0;
delay_us(10);
}
}
/***************************************************************************
*函数名称:ReadOneByte()
*用途:从ADS1220读取一个字节
*************************************************************************/
unsigned char ReadOneByte(void)
{
unsigned char result,i;
SCK_L;//SCLK_L;
for(i = 0;i<8; i++)
{
SCK_H;
result <<= 0x01;
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7))
result |= 0X01;
SCK_L;
delay_us(10);
}
return result;
}
/***************************************************************************
*函数名称:ReadData()
*用途:从ADS1220读取数据
*************************************************************************/
unsigned long ReadData(void)
{
unsigned long adval;
unsigned char a,b,c;
CS_L;
WriteOneByte(RDATA);
a = ReadOneByte();
b = ReadOneByte();
c = ReadOneByte();
adval = a;
adval = (adval<<8) | b;
adval = (adval<<8) | c;
CS_H;
return adval;
}
/***************************************************************************
*函数名称:ADReset()
*用途:复位ADS1220
*************************************************************************/
void ADReset(void)
{
CS_L;
WriteOneByte(RESET);
CS_H;
}
/***************************************************************************
函数名称:ADS1220_Init()
*用途:ADS120初始化
*************************************************************************/
void ADS1220_Init(void)
{
CS_H;
SCK_H;
DIN_H;
ADReset();
}
/***************************************************************************
*函数名称:关闭电源()
*************************************************************************/
void ADPowerDown(void)
{
CS_L;
WriteOneByte(POWERDOWN);
CS_H;
}
/***************************************************************************
*函数名称:ADStartConversion()
*用途:开始转换
*参数:
*************************************************************************/
void ADStartConversion(void)
{
CS_L;
WriteOneByte(START);
CS_H;
}
/***************************************************************************
*函数名称:ReadRegister()
*用途:从寄存器中读取数据
*参数:数据
*************************************************************************/
void ReadRegister(void)
{
unsigned char i;
unsigned long Data;
CS_L;
WriteOneByte(RREG|0x03);
for (i=0; i< 4; i++)
{
Data += ReadOneByte();
}
CS_H;
return;
}
/***************************************************************************
*函数名:WriteRegister(unsigned char StartAddress, unsigned char NumRegs, unsigned char * pData)
*用途:向寄存器写入数据
*步骤:写地址2。写入数据
* Params NumRegs-----寄存器的数字
*************************************************************************/
void WriteRegister(unsigned char StartAddress, unsigned char NumRegs, unsigned char * pData)
{
unsigned char i;
CS_L;
WriteOneByte(WREG | (((StartAddress<<2) & 0x0c) |((NumRegs-1)&0x03)));
for (i=0; i< NumRegs; i++)
{
WriteOneByte(*pData);
pData++;
}
CS_H;
return;
}
/***************************************************************************
函数名称:CofigAD(unsigned char channel)
*用途:设置采样通道
*参数:
*
*************************************************************************/
void CofigAD(unsigned char channel)
{
switch(channel)
{
case 0: Init_Config[0] = MUX_8 | PGA_0 | PGA_BYPASS_Disable;//单端模式,选择通道AINP = AIN0,AINN = AVSS ,PGA = 1,禁用PGA
break;
case 1: Init_Config[0] = MUX_9 | PGA_0 | PGA_BYPASS_Disable;//单端模式,选择通道AINP = AIN1,AINN = AVSS ,PGA = 1,禁用PGA
break;
case 2: Init_Config[0] = MUX_10 | PGA_0 | PGA_BYPASS_Disable;//单端模式,选择通道AINP = AIN2,AINN = AVSS,PGA = 1,禁用PGA
break;
case 3: Init_Config[0] = MUX_11 | PGA_0 | PGA_BYPASS_Disable;//单端模式,选择通道AINP = AIN3,AINN = AVSS,PGA = 1,禁用PGA
break;
case 4: Init_Config[0] = MUX_0 | PGA_0 | PGA_BYPASS_Disable;//差分模式,选择通道AINP = AIN0,AINN = AIN1(默认设置),PGA = 1,禁用PGA
break;
}
Init_Config[1] = 0XC0;
Init_Config[2] = 0X00;
Init_Config[3] = 0X00;
WriteRegister(0x00,0x04,Init_Config);
ReadRegister();
}
/***************************************************************************
*函数名:GetAD(unsigned char channel)
*目的:得到结果
*************************************************************************/
unsigned long GetAD(unsigned char channel)
{
unsigned long Result;
CofigAD(channel);
ADStartConversion();
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0));//while(ADS1220_DRDY);
Result = ReadData();
ADPowerDown();
if(Result & 0x800000)
{
PolarFlag = 1;
Result = ~Result;
Result =Result&0xffffff;
Result = Result+1;
}
else PolarFlag =0;
return Result;
}
实验用了3.3V分一半电压R1=R2,送去AN0通道
实验现象