ads124s08开发(包括源码,外围电路设计)

目录

1. 简述

1.1 功能框图

2. 引脚配置和功能

3.细节描述

3.1 低噪声可编程增益放大器(PGA)

3.1.1 PGA原理图

3.1.2 PGA 满量程范围

3.2 参考电压

3.3 数字滤波器

3.4 设备工作模式

3.4.1 复位

3.4.2 转换模式

3.4.2.1 连续转换模式

3.4.2.2 单次转换模式

4 编程

4.1 转换数据格式

4.2 命令

4.2.1 读寄存器

4.2.2 写寄存器

4.3 读取转换数据

4.3.1 直接读取转换数据

4.3.2 读命令读取转换数据

5. 寄存器映射

5.1 状态寄存器

5.2 输入多路复用器寄存器

5.3 增益设置寄存器(PGA)

5.4 数据速率寄存器

5.5 参考电压控制寄存器

5.6 系统控制寄存器

6. 外围电路设计

6.1 原理图

6.2 实物图

7.驱动代码

7.1 stm32配置

7.1.1 SPI4配置

7.1.2 SPI4_CLK需要配置为下拉模式

7.2 ads124s08.c

7.3 ads124s08.h

7.4 main.c


1. 简述

        ADS124S08具有 PGA 和电压基准的低功耗、低噪声、高集成度12 通道4kSPS、24 位 Δ-Σ ADC,串行外设接口 (SPI) 兼容接口,可选用循环冗余校验 (CRC), 其配有可配置的数字滤波器,能够在嘈杂的工业环境中提供低延迟转换结果和 50Hz 或60Hz 噪声抑制。可编程增益放大器 (PGA) 具备低噪声特性,并且可提供 1 到 128 的增益,能够为电阻桥或热电偶应用放大低幅值 信号。

1.1 功能框图

2. 引脚配置和功能

有两种封装形式

3.细节描述

3.1 低噪声可编程增益放大器(PGA)

3.1.1 PGA原理图

3.1.2 PGA 满量程范围

在使用内部参考电压2.5V的情况下,使能PGA,输入模拟电压和PGA增益的关系如下图

3.2 参考电压

参考电压的选择如下图,通过配置寄存器,寄存器配置会在后面讲

注意:选用内部参考电压需要在 REFOUT 和 REFCOM 之间连接一个1 μF 至 47 μF 范围内的电容器。较大的电容值有助于过滤更多噪声,但代价是更长的基准启动时间。并且当选择内部参考进行测量时,建议禁用参考缓冲器。

基准启动时间如下表

3.3 数字滤波器

        该器件提供数字滤波器选项,用于对来自 delta-sigma 调制器的数字数据流进行滤波和抽取。数字滤波器的实现由数据速率和滤波器模式设置决定。如图显示了数字滤波器的实现。使用数据速率寄存器 (04h) 中的 FILTER 位在三阶 sinc 滤波器 (sinc3 ) 和低延迟滤波器(具有多个组件的低延迟滤波器)之间进行选择。

3.4 设备工作模式

        包括掉电模式、待机模式和转换模式,如图 显示了不同工作模式的流程图以及设备如何从一种模式转换到另一种模式。

3.4.1 复位

通过将 RESET 引脚置于低电平至少 4·tCLK·周期(1ns),然后将引脚返回高电平来复位 ADC。

tCLK = 1 / fCLK即4.096MHz分之一

3.4.2 转换模式

        ADS124S0x 提供两种转换模式:连续转换和单次转换模式。 连续转换模式会无限期转换,直到用户停止转换。单次转换模式在 START/SYNC 引脚变为高电平或发送 START 命令后执行一次转换。如图显示了如何使用 START/SYNC 引脚和 START 命令来控制 ADC 转换。

3.4.2.1 连续转换模式

        通过在数据速率寄存器 (04h) 中将 MODE 位设置为 0,可将设备配置为连续转换模式。必须发送 START 命令或将 START/SYNC 引脚置于高电平,设备才能开始连续转换。使用命令控制设备时,请将 START/SYNC 引脚保持为低电平。将 START/SYNC 引脚置于低电平或发送 STOP 命令可在当前正在进行的转换完成后停止设备转换,DRDY 的下降沿表示转换完成。此后,设备进入待机模式。

3.4.2.2 单次转换模式

        通过在数据速率寄存器 (04h) 中将 MODE 位设置为 1,可将器件配置为单次转换模式。必须发送 START 命令或将 START/SYNC 引脚置于高电平,器件才能启动单次转换。转换完成后,器件再次进入待机模式。要启动新转换,必须再次发送 START 命令或将 START/SYNC 引脚置于低电平然后再次置于高电平。

4 编程

4.1 转换数据格式

输入差分电压与输出24位数据的对应关系如图

模拟输入信号到输出代码的映射如图

4.2 命令

4.2.1 读寄存器

        发送读取命令后,ADC 会以一个或多个寄存器数据字节(最高有效位优先)进行响应。 如果字节数超过最后一个寄存器地址,ADC 会开始输出零数据。

4.2.2 写寄存器

4.3 读取转换数据

        ADC 数据有两种读取方法:直接读取数据或通过命令读取数据。ADC 将新的转换数据写入输出移位寄存器和内部数据保持寄存器。数据可以从输出移位寄存器读取(直接模式),也可以从数据保持寄存器读取(命令模式)。从数据保持寄存器读取数据(命令模式)不需要将数据读回的开始与 DRDY 同步。

        ADC 数据字段长度为 3、4 或 5 个字节。数据字段由一个可选的 STATUS 字节、三个字节的转换数据和一个可选的 CRC 字节组成。读取所有字节后,在继续发送 SCLK 时,数据字节序列(包括 STATUS 字节和 CRC 字节(如果选择))会重复。字节序列从第一个字节开始重复。为了帮助验证无错误通信,请在每个转换间隔内多次读取相同的数据或使用可选的 CRC 字节。

4.3.1 直接读取转换数据

        首先判断DRDY是否为低电平,当DRDY为低电平表示数据准备好,然后拉低片选,接着进行SPI通信,读取转换数据,DRDY 在第一个 SCLK 下降沿返回高电平。

4.3.2 读命令读取转换数据

        发送 RDATA 命令时,将从 ADC 数据保持寄存器中检索数据。可以使用轮询 DRDY 来确定 ADC 数据何时准备就绪。每次读取操作都必须发送 RDATA 命令。

注:CS 可以处于低位。如果 CS 处于低位,则 DOUT/DRDY 和 DRDY 一起处于低位。

5. 寄存器映射

        ADS124S0x 寄存器映射由 18 个 8 位寄存器组成。将新数据写入某些寄存器会导致正在进行的转换重新启动,配置寄存器映射如图

5.1 状态寄存器

FL_POR :POR 标志 指示已发生上电复位 (POR) 事件。
0:寄存器已清除,且未发生 POR 事件。
1:发生 POR 事件且尚未清除。必须通过用户寄存器写入来清除标志(默认)。

RDY:设备就绪标志 指示设备已启动并准备好进行通信。
0:ADC 准备好进行通信(默认)
1:ADC 未准备好

5.2 输入多路复用器寄存器

注:测量单端输入需要选择一端输入为AINCOM,另一端输入为单端信号

5.3 增益设置寄存器(PGA)

注:测量单端信号需要旁路 PGA ,并且还必须将 GAIN[2:0] 设置为 000。

5.4 数据速率寄存器

5.5 参考电压控制寄存器

5.6 系统控制寄存器

6. 外围电路设计

6.1 原理图

模拟输入电压由AMS117-ADJ提供

6.2 实物图

7.驱动代码

7.1 stm32配置

7.1.1 SPI4配置

7.1.2 SPI4_CLK需要配置为下拉模式

7.2 ads124s08.c


#include "ads124s08.h"
#include "stm32h7xx.h"
#include "spi.h"
/*
	ADS124S08模块:
    模拟电源
	AVDD   ------  AVCC_TEC_3V3
	AVSS   ------  AGND_TEC
    数字电源
    DVDD   ------  VDD_TEC_3V3
	DGND   ------  DGND_TEC

	CS    ------  PC13/SPI4_CS/SPI_nCS_ADC
    START/SYNC ------  PD5/ADS124S08_START(nSYNC)/ADC_START(nSYNC)
	SCLK  ------  PE2/SPI4_SCK/SPI SCLK
	DIN   ------  PE6/SPI4_MOSI/SPI_DIN
	DOUT  ------  PE5/SPI4_MISO/SPI_DOUT
    DADY  ------  PB5/ADC_nDRDY/ADS124S08_DRDY
    RSTSEL------  PD4/ADC_nRST/ADS124S08_RST

	DAC8562基本特性:
	1、模拟电源:单极(2.7V 到 5.25V)或双极 (±2.5V)
       数字电源:2.7V 到 3.6V
	2、参考电压2.5V,使用内部参考

	SCLK下降沿写入数据, 每次传送24bit数据, 高位先传
    转换或寄存器数据在 SCLK 上升沿通过 DOUT/DRDY 移出
*/

/**********************************************************************************************************
*	函 数 名: ADS124S08_WriteCmd
*	功能说明: 写命令,命令是独立的,即单字节
*	形    参: Cmd:写入ADS的命令
*	返 回 值: 无
**********************************************************************************************************/
void ADS124S08_WriteCmd(uint8_t Cmd)
{

    AD_nCS_LOW;		//拉低片选线,使能SPI通信

    HAL_SPI_Transmit(&hspi4, &Cmd, 1,HAL_MAX_DELAY);

    AD_nCS_HIGH;		//通信结束,拉高片选

}

/**********************************************************************************************************
*	函 数 名: ADS124S08_ReadReg
*	功能说明: 读单个或多个寄存器
*	形    参: RegAddr:所要读取的寄存器地址
*	         Length:所要读取的寄存器数量
*	返 回 值: 无
**********************************************************************************************************/
void ADS124S08_ReadReg(uint8_t RegAddr,uint8_t *Buffer,uint8_t Length)
{
    uint8_t Cmd[2];     //存放要发送的数据

    AD_nCS_LOW;
    HAL_Delay(4);
    //ADS124S08_WriteCmd(ADC_CMD_WAKEUP);
    AD_START_HIGH;		//在写寄存器时,需要将START拉高(不让其进入睡眠模式)
    HAL_Delay(10);

    Cmd[0]=ADC_CMD_RREG|RegAddr;    //读命令加上寄存器地址
    Cmd[1]=Length-1;                //读寄存器数量减一

    HAL_SPI_Transmit(&hspi4,Cmd,2,HAL_MAX_DELAY);		            //发送命令


    HAL_SPI_Receive(&hspi4, Buffer, Length, HAL_MAX_DELAY);		//接收寄存器数据

    Cmd[0]=ADC_CMD_NOP;
    HAL_SPI_Transmit(&hspi4, Cmd,1,HAL_MAX_DELAY); 	//最后在发送一个NOP,强制拉高DOUT
    HAL_Delay(10);

    AD_nCS_HIGH;

}

/**********************************************************************************************************
*	函 数 名: ADS124S08_WriteReg
*	功能说明: 写寄存器
*	形    参: RegAddr:所要写的寄存器地址
*	         Length:所要写的寄存器数量
*	返 回 值: 无
**********************************************************************************************************/
void ADS124S08_WriteReg(uint8_t RegAddr,uint8_t *Buffer,uint8_t Length)
{
    uint8_t Cmd[2];

    AD_nCS_LOW;
    HAL_Delay(5);
    //ADS124S08_WriteCmd(ADC_CMD_WAKEUP);
    AD_START_HIGH;		//在写寄存器时吗,需要将START拉高(不让其进入睡眠模式),使器件开始转换
    HAL_Delay(10);			//硬件延迟

    Cmd[0]=ADC_CMD_WREG|RegAddr;
    Cmd[1]=Length-1;

    HAL_SPI_Transmit(&hspi4, Cmd, 2,HAL_MAX_DELAY); 	//指定向指定寄存器写入指定字节数据
    HAL_SPI_Transmit(&hspi4, Buffer, Length,HAL_MAX_DELAY); 	//发送数据字节

    HAL_Delay(10);			//硬件延迟

    AD_nCS_HIGH;
    AD_START_LOW;

}
/**********************************************************************************************************
*	函 数 名: ADS124S08_WaitBusy
*	功能说明: 判断忙状态
*	形    参: Timeout:超时时间 单位ms
*	返 回 值: 1:处于忙状态并超时
*            0:处于空闲状态
**********************************************************************************************************/
uint8_t ADS124S08_WaitBusy(uint32_t Timeout)
{
    uint32_t i = 0;
    AD_nCS_LOW;
    while(nAD_DRDY_STATE > 0)
    {
        HAL_Delay(1);
        i++;
        if(i>Timeout)
            return 1;

    }

    AD_nCS_HIGH;

    return 0;

}

/**********************************************************************************************************
*	函 数 名: ADS124S08_Reset
*	功能说明: 复位ADS124S08,通过引脚复位,重置数字滤波器并将所有配置寄存器值设置为默认设置,还将设备置于待机模式。
*	         通过将 RESET 引脚置于低电平至少 4·tCLK·周期(约1ns),然后将引脚返回高电平来复位 ADC。
*	形    参: 无
*	返 回 值: 无
**********************************************************************************************************/
void ADS124S08_Reset()
{
    HAL_GPIO_WritePin(AD_nRST_GPIO_Port, AD_nRST_Pin, GPIO_PIN_RESET);
    HAL_Delay(1);          //最小4tCLK
    HAL_GPIO_WritePin(AD_nRST_GPIO_Port, AD_nRST_Pin, GPIO_PIN_SET);
    HAL_Delay(20);        //最小4096tCLK
}

/**********************************************************************************************************
*	函 数 名: ADS124S08_Chg_Channel
*	功能说明: ADS124S08输入通道选择
*	形    参: channel:输入组数:0-5组
*	返 回 值: 无
**********************************************************************************************************/
void ADS124S08_Chg_Channel(uint8_t channel)
{
    uint8_t Cmd;
    switch (channel)
    {
        case 0:
            Cmd = (POSI_AIN(0)|NEGA_AIN(1));
            ADS124S08_WriteReg(ADC_REG_INPMUX,&Cmd,1);
            break;
        case 1:
            Cmd = (POSI_AIN(2)|NEGA_AIN(3));
            ADS124S08_WriteReg(ADC_REG_INPMUX,&Cmd,1);
            break;
        case 2:
            Cmd = (POSI_AIN(4)|NEGA_AIN(5));
            ADS124S08_WriteReg(ADC_REG_INPMUX,&Cmd,1);
            break;
        case 3:
            Cmd = (POSI_AIN(6)|NEGA_AIN(7));
            ADS124S08_WriteReg(ADC_REG_INPMUX,&Cmd,1);
        case 4:
            Cmd = (POSI_AIN(8)|NEGA_AIN(9));
            ADS124S08_WriteReg(ADC_REG_INPMUX,&Cmd,1);
        case 5:
            Cmd = (POSI_AIN(10)|NEGA_AIN(11));
            ADS124S08_WriteReg(ADC_REG_INPMUX,&Cmd,1);
            break;
        default:break;
    }

}

/**********************************************************************************************************
*	函 数 名: ADS124S08_Calibrate
*	功能说明: ADS124S08系统校准  校准顺序为:自偏移校准->偏移校准->增益校准
*	        校准命令不能在设备处于待机模式时使用(当START/SYNC引脚低,或当停止命令发出时)。
*	形    参: 无
*	返 回 值: 无
**********************************************************************************************************/
static uint8_t ADS124S08_Calibrate(uint8_t Gain)
{
    uint8_t R=0;
    uint8_t Cmd;
//    ADS124S08_WriteReg(ADC_REG_PGA,&Gain,1);      // 设置增益值、ADC输出数据率

    Cmd=0x10;  	//采样8次,失能CRC和STATUS byte
    ADS124S08_WriteReg(ADC_REG_SYS,&Cmd,1);       // 设置系统监测为自偏移测量
    ADS124S08_WriteCmd(ADC_CMD_SELFOCAL);          // 自偏移校准
    R |= ADS124S08_WaitBusy(500);    							 // 等待校准完成


//		Cmd=0x21;   //001 00 001
//		ADS124S08_WriteReg(ADC_REG_SYS,&Cmd,1);       // 设置系统监测为偏移测量
//		ADS124S08_WriteCmd(ADC_CMD_SYSOCAL);           // 系统偏移校准
//		R |= ADS124S08_WaitBusy(500);   						  // 等待校准完成
//
//
//		Cmd=0x22;   //001 00 010
//		ADS124S08_WriteReg(ADC_REG_SYS,&Cmd,1);       // 设置系统监测为增益测量
//		ADS124S08_WriteCmd(ADC_CMD_SYSGCAL);           // 系统增益校准
//		R |= ADS124S08_WaitBusy(500);    							 // 等待校准完成

    return R;
}

/**********************************************************************************************************
*	函 数 名: ADS124S08_Init
*	功能说明: ADS124S08初始化包括校准
*	形    参: 无
*	返 回 值: 无
**********************************************************************************************************/
void ADS124S08_Init(void)
{
    uint8_t status;
    uint8_t Cmd;
    uint8_t Gain;               //PGA增益

    ADS124S08_Reset();  		//系统复位

    ADS124S08_ReadReg( ADC_REG_STATUS, &status, 1);
    if ( (status & ADS_nRDY_MASK) ) {
        return;                      // Device not ready
    }
    else {
        Cmd = 0x00; //清除POR标志位
        ADS124S08_WriteReg(ADC_REG_STATUS, &Cmd, 1);
    }

    //初始化输入多路复用器寄存器,选择0组输入
    Cmd = (POSI_AIN(0)|NEGA_AIN(1));
    //Cmd = (POSI_AIN(0)|NEGA_AIN(0));
    ADS124S08_WriteReg(ADC_REG_INPMUX,&Cmd,1);

    //设置增益值、ADC输出数据率
    Gain = 0x08;
    //Gain = 0x00;
    ADS124S08_WriteReg(ADC_REG_PGA,&Gain,1);

    Cmd=0x10|ADC_SPS_100 ;//关闭斩波模式,选择内部时钟,单次转换,低延迟滤波,5k采样,50hz有陷波 0X10连续转换
    ADS124S08_WriteReg(ADC_REG_DATARATE,&Cmd,1);
    //校准时Data Rate Register将被重新赋值,因此这里可以不用对其进行赋值

    Cmd = 0x3A;    //0011 1010 内部参考始终打开即使在掉电模式下,禁用参考缓冲器
    ADS124S08_WriteReg(ADC_REG_REF,&Cmd,1);

    Cmd=0x10;  	//采样8次,失能CRC和STATUS byte 00010000即为默认值
    ADS124S08_WriteReg(ADC_REG_SYS,&Cmd,1);

//        Cmd=0x07 ;//0000 0111	设置极大恒流源电流值1500uA(1.5mA)使用 IDAC,则必须打开内部基准电源
//		ADS124S08_WriteReg(ADC_REG_IDACMAG,&Cmd,1);
//
//		Cmd=0x17 ;//0010 0111 选择第一个恒流源输出引脚 (AIN2) 选择第二个电流源输出引脚(AIN7)
//		ADS124S08_WriteReg(ADC_REG_IDACMUX,&Cmd,1);

    //上电后,等待电源和参考电压完全稳定后再进行校准
//    Cmd=ADS124S08_Calibrate(Gain);                        // 通道校准.配置转换参数

//		Cmd = 0x03;
//		ADS124S08_WriteReg(ADC_REG_GPIODAT,&Cmd,1);
//
//	  Cmd = 0x0f;
//		ADS124S08_WriteReg(ADC_REG_GPIOCON,&Cmd,1);

    //重新配置Data Rate Register
/*    Cmd=0x20|ADC_SPS_4000;  //0011 0000 关闭斩波模式,选择内部时钟,单次转换,低延迟滤波,数据转换速率4000
    ADS124S08_WriteReg(ADC_REG_DATARATE,&Cmd,1);*/

    AD_START_LOW;     //START/SYNC rising edge or START Command 进入转换模式

}

/**********************************************************************************************************
*	函 数 名: ADS124S08_Start
*	功能说明: 启动转换
*	        单次转换模式下完成转换时,器件进入待机模式,单次转换模式下拉低START引脚不会进入待机模式
*	形    参: 无
*	返 回 值: 无
**********************************************************************************************************/
void ADS124S08_Start(uint8_t CovMode)
{
    ADS124S08_WriteCmd(ADC_CMD_WAKEUP);

    AD_START_HIGH ;                          //启动ADC转换
    HAL_Delay(1);
    if(CovMode==ADC_MODE_SINGLECOV)
        AD_START_LOW;          				//产生启动脉冲
}

/**********************************************************************************************************
*	函 数 名: ADS124S08_Stop
*	功能说明: 停止转换
*	        连续转换模式下发送 STOP 命令(或将 START/SYNC 引脚拉低)时进入待机模式
*	形    参: 无
*	返 回 值: 无
**********************************************************************************************************/
void ADS124S08_Stop()
{
    AD_START_LOW;                            //停止转换
    HAL_Delay(1);
}

/**********************************************************************************************************
*	函 数 名: ADS124S08_Read_CMD
*	功能说明: 底层函数:指令读取ADS124S08中转换的24位数据
*	形    参: 无
*	返 回 值: 24位转换数据
**********************************************************************************************************/
int32_t ADS124S08_Read_CMD(void)
{

    uint8_t Cmd[5]={ADC_CMD_RDATA,ADC_CMD_NOP,ADC_CMD_NOP,ADC_CMD_NOP,ADC_CMD_NOP};  //最后一个字节是为了强制拉高nDRDY
    uint8_t Buf[5];
    int32_t  Data = 0;

    AD_nCS_LOW;
    HAL_Delay(5);
    //HAL_SPI_TransmitReceive(&hspi4,Cmd,Buf,5,HAL_MAX_DELAY);    //spi全双工:三次空命令对应三次数据

    HAL_SPI_Transmit(&hspi4,Cmd,5,HAL_MAX_DELAY);		    //发送命令
    HAL_SPI_Receive(&hspi4, Buf, 5, HAL_MAX_DELAY);		//接收数据

    HAL_Delay(5);
    AD_nCS_HIGH;

    //无STATUS和CRC字节数据
    Data=Buf[1];
    Data=Data*256+Buf[2];           //*256相当于左移8位
    Data=Data*256+Buf[3];

    Data = Data*256;				//先乘再除是为了保留正负号
    return (Data/256);
}

/**********************************************************************************************************
*	函 数 名: ADS124S08_Read_DIR
*	功能说明: 底层函数:直接读取ADS124S08中转换的24位数据
*	形    参: 无
*	返 回 值: 24位转换数据
**********************************************************************************************************/
int32_t ADS124S08_Read_DIR(void)
{

    uint8_t Cmd[3]={ADC_CMD_NOP, ADC_CMD_NOP,ADC_CMD_NOP};
    uint8_t Buf[3];
    int32_t  Data = 0;

    HAL_SPI_TransmitReceive(&hspi4,Cmd,Buf,3,HAL_MAX_DELAY);    //spi全双工:三次空命令对应三次数据
    HAL_Delay(5);
    AD_nCS_HIGH;

    //无STATUS和CRC字节数据
    Data=Buf[0];
    Data=Data*256+Buf[1];           //*256相当于左移8位
    Data=Data*256+Buf[2];

    Data = Data*256;				//先乘再除是为了保留正负号
    return (Data/256);
}

/**********************************************************************************************************
*	函 数 名: ADS124S08_GetADC_CMD
*	功能说明: 指令获取ADS124S08中转换的24位数据
*	形    参: 无
*	返 回 值: 无
**********************************************************************************************************/
int32_t ADS124S08_GetADC_CMD(uint8_t mode)
{
    int32_t adcVal = 0;
    uint8_t delays = 0;
    //ADS124S08_Start(mode);
    while(nAD_DRDY_STATE==1)
    {
        delays++;
        HAL_Delay(2);
        if(delays>100) return 0;
    }
    adcVal = ADS124S08_Read_CMD();
    if(adcVal==0) {
        adcVal = 1;
    }
    return adcVal;
}

/**********************************************************************************************************
*	函 数 名: ADS124S08_GetADC_DIR
*	功能说明: 直接获取ADS124S08中转换的24位数据
*	形    参: 无
*	返 回 值: 无
**********************************************************************************************************/
int32_t ADS124S08_GetADC_DIR(void)
{
    int32_t adcVal = 0;
    //ADS124S08_Start(mode);
    if (nAD_DRDY_STATE == RESET)               // monitor Data ready(DRDY pin)
    {
        AD_nCS_LOW;
        //while (nAD_DRDY_STATE == RESET);
        adcVal = ADS124S08_Read_DIR();
    }
    if(adcVal==0) {
        adcVal = 1;
    }
    return adcVal;
}

/**********************************************************************************************************
*	函 数 名: ADS124S08_GetADC_Vol
*	功能说明: 把从ADC读来的24位数据转换成对应的电压值
*	形    参: temp----ADC读出的数据
*	返 回 值: 电压值
**********************************************************************************************************/
float ADS124S08_GetADC_Vol(volatile unsigned int temp){
    float vol = 0;
    if(temp>0x7fffff)    //ADC双极性采样,做处理
    {
        temp = temp*256;    //24位ADC数据左移8位
        temp = ~(temp - 1); //按位取反
        temp = temp/256;    //取反后右移8位,得到正电压对应的ADC值
        vol = (-1)*(float)(temp*2.5)/8388608;
    }
    else vol = (float)(temp*2.5)/8388608;
    return vol;
}

7.3 ads124s08.h

#include <stdint-gcc.h>
#include "gpio.h"

#ifndef ADS124S08_DEMO_ADS124S08_H
#define ADS124S08_DEMO_ADS124S08_H

#endif //ADS124S08_DEMO_ADS124S08_H

//ADS124S08有关定义
//ADS124S08命令码列表
#define ADC_CMD_NOP         0x00            /*!< 空操作   */
#define ADC_CMD_WAKEUP      0x02            /*!< 退出睡眠模式   */
#define ADC_CMD_POWERDN     0x04            /*掉电*/
#define ADC_CMD_RESET       0x06            /*!< 芯片复位   */
#define ADC_CMD_START       0x08            /*开始转换*/
#define ADC_CMD_STOP        0x0A            /*停止转换*/
//校准命令
#define ADC_CMD_SYSOCAL     0x16            /*!< 系统偏移校准   */
#define ADC_CMD_SYSGCAL     0x17            /*!< 系统增益校准   */
#define ADC_CMD_SELFOCAL    0x19            /*!< 系统自校准   */
//数据读命令
#define ADC_CMD_RDATA       0x12            /*!< 单次读取数据   */
//寄存器读写命令
#define ADC_CMD_RREG        0x20            /*!< 读寄存器001 00000后五位存寄存器地址   */
#define ADC_CMD_WREG        0x40            /*!< 写寄存器   */



//ADS124S08寄存器列表
#define ADC_REG_ICID        0x00
/*#define ADC_REG_STATUS      0x01*/
#define ADC_REG_INPMUX      0x02
#define ADC_REG_PGA         0x03
#define ADC_REG_DATARATE    0x04
#define ADC_REG_REF         0x05
#define ADC_REG_IDACMAG     0x06
#define ADC_REG_IDACMUX     0x07
#define ADC_REG_VBIAS       0x08
#define ADC_REG_SYS         0x09
#define ADC_REG_OFC0        0x0A
#define ADC_REG_OFC1        0x0B
#define ADC_REG_OFC2        0x0C
#define ADC_REG_FSC0        0x0D
#define ADC_REG_FSC1        0x0E
#define ADC_REG_FSC2        0x0F
#define ADC_REG_GPIODAT     0x10
#define ADC_REG_GPIOCON     0x11

/* ADS124S08 Register 0x1 (STATUS) Definition
 *|  Bit 7   |   Bit 6   |   Bit 5   |   Bit 4   |   Bit 3   |   Bit 2   |   Bit 1   |   Bit 0   |
 *------------------------------------------------------------------------------------------------
 *|  FL_POR  |    nRDY   | FL_P_RAILP| FL_P_RAILN| FL_N_RAILP| FL_N_RAILN| FL_REF_L1 | FL_REF_L0 |
 *------------------------------------------------------------------------------------------------
 */
/** STATUS register address */
#define ADC_REG_STATUS         ((uint8_t) 0x01)

/** STATUS default (reset) value */
#define STATUS_DEFAULT          ((uint8_t) 0x80)

#define ADS_FL_POR_MASK			0x80
#define ADS_nRDY_MASK			0x40
#define ADS_FL_P_RAILP_MASK		0x20
#define ADS_FL_P_RAILN_MASK		0x10
#define ADS_FL_N_RAILP_MASK		0x08
#define ADS_FL_N_RAILN_MASK		0x04
#define ADS_FL_REF_L1_MASK		0x02
#define ADS_FL_REF_L0_MASK		0x10




//ADS124S08支持的增益列表
#define ADC_GAIN_1          0x00
#define ADC_GAIN_2          0x01
#define ADC_GAIN_4          0x02
#define ADC_GAIN_8          0x03
#define ADC_GAIN_16         0x04
#define ADC_GAIN_32         0x05
#define ADC_GAIN_64         0x06
#define ADC_GAIN_128        0x07
#define ADC_GAIN_EN         0x08

//ADS124S08支持的转换速率列表
#define ADC_SPS_5           0x01
#define ADC_SPS_10          0x02
#define ADC_SPS_16_6        0x03
#define ADC_SPS_20          0x04
#define ADC_SPS_50          0x05
#define ADC_SPS_60          0x06
#define ADC_SPS_100         0x07
#define ADC_SPS_100         0x07
#define ADC_SPS_400         0x09
#define ADC_SPS_1000        0x0b
#define ADC_SPS_2000        0x0c
#define ADC_SPS_4000        0x0d
//x代表AINX
#define POSI_AIN(x)    (x<<4)       //AIN_P PGA正极输入
#define NEGA_AIN(x)    (x)          //AIN_N PGA负极输入

//ADS124S08转换模式
#define ADC_MODE_SINGLECOV      0x00        //单次转换
#define ADC_MODE_CONTINUOUS     0x01        //连续转换

//Fixed timing delays
#define DELAY_4TCLK   	(uint16_t) (1) // 1usec ~= (4.0 /ADS124S08_FCLK) which is the minimum required low time for RESET or START/SYNC.





//定义引脚有关宏函数
#define AD_nCS_GPIO_Port    MCU_ADS124S08_CS_GPIO_Port
#define AD_nCS_Pin          MCU_ADS124S08_CS_Pin

#define AD_START_GPIO_Port  MCU_ADS124S08_START_GPIO_Port
#define AD_START_Pin        MCU_ADS124S08_START_Pin

#define nAD_DRDY_GPIO_Port  MCU_ADS124S08_DRDY_GPIO_Port
#define nAD_DRDY_Pin        MCU_ADS124S08_DRDY_Pin

#define AD_nRST_GPIO_Port    MCU_ADS124S08_RST_GPIO_Port
#define AD_nRST_Pin          MCU_ADS124S08_RST_Pin

#define   AD_nCS_LOW	HAL_GPIO_WritePin(AD_nCS_GPIO_Port,AD_nCS_Pin, GPIO_PIN_RESET)
#define   AD_nCS_HIGH	HAL_GPIO_WritePin(AD_nCS_GPIO_Port,AD_nCS_Pin, GPIO_PIN_SET)

#define   AD_START_LOW	HAL_GPIO_WritePin(AD_START_GPIO_Port,AD_START_Pin,GPIO_PIN_RESET)
#define   AD_START_HIGH	HAL_GPIO_WritePin(AD_START_GPIO_Port,AD_START_Pin,GPIO_PIN_SET)

#define   nAD_DRDY_STATE  HAL_GPIO_ReadPin( nAD_DRDY_GPIO_Port,nAD_DRDY_Pin )


//引进外部变量(SPI1)

//extern SPI_HandleTypeDef hspi4;





//函数定义,供主函数调用
//指令读取ADS124S08中的转换数据
int32_t ADS124S08_Read_CMD(void);
int32_t ADS124S08_Read_DIR(void);


//启动转换
void ADS124S08_Start(uint8_t CovMode);


//停止转换
void ADS124S08_Stop(void);


//ADS124S08初始化
void ADS124S08_Init(void);

//void ADS124S08_WriteReg(uint8_t RegAddr,uint8_t Data,uint8_t Length);
void ADS124S08_WriteReg(uint8_t RegAddr,uint8_t *Buffer,uint8_t Length);
//读寄存器
void ADS124S08_ReadReg(uint8_t RegAddr,uint8_t *Buffer,uint8_t Length);


//复位ADS124S08
void ADS124S08_Reset(void);
void ADS124S08_Chg_Channel(uint8_t channel);

int32_t ADS124S08_GetADC_CMD(uint8_t mode);
int32_t ADS124S08_GetADC_DIR(void);

float ADS124S08_GetADC_Vol(volatile unsigned int temp);

//判断忙状态
uint8_t ADS124S08_WaitBusy(uint32_t Timeout);

void ADS124S08_WriteCmd(uint8_t Cmd);

7.4 main.c

ADS124S08_Init();
ADS124S08_WriteCmd(ADC_CMD_START);    //启动转换
while (1)
{
    adcVal = ADS124S08_GetADC_DIR(); //直接读取转换数据
    v = ADS124S08_GetADC_Vol(adcVal);
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值