ADS1220芯片使用STM32F103软件模拟SPI时序驱动采集数据

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。

官网介绍icon-default.png?t=N176https://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通道

 

 实验现象

 

猜你喜欢

转载自blog.csdn.net/qq_46226356/article/details/129478267