从零阅读数据手册--GD32驱动ADS1118

本文介绍了ADS1118 16位模数转换模块,包括其采购链接、规格参数、产品数据手册等。详细阐述了模块原理,还讲述了将其移植到梁山派GD32F470上实现16bit模式1路ADC采集电压和检查温度的过程,包括查看资料、引脚选择、移植步骤及验证结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 模块来源
    采购链接:https://m.tb.cn/h.54FyFCS?tk=R4sNdA5qWuW
    ADS1118 16位模数转换模块 ADC开发板/SPI通信接口
    资料下载:https://www.ti.com.cn/cn/lit/ds/symlink/ads1118.pdf?ts=1695121210267&ref_url=https%253A%252F%252Fwww.ti.com.cn%252Fproduct%252Fzh-cn%252FADS1118%253FkeyMatch%253DADS1118%2526tisearch%253Dsearch-everything%2526usecase%253DGPN-ALT

在这里插入图片描述

  1. 规格参数
    工作电压:2-5.5V
    工作电流:连续模式 150μA
    通信方式:SPI
    引脚数量:12 Pin(2.54mm间距排针)
    暂时无法在飞书文档外展示此内容
    产品数据手册

  2. 模块原理(资料讲解)
    ADS1118 是一款精密、低功耗、16 位模数转换器 (ADC),提供 测量 采用超小型无引线 X2QFN-10 封装 或 VSSOP-10 封装的传感器最常见信号所需的所有功 能。ADS1118 集成了可编程增益放大器 (PGA)、电压 基准、振荡器和高精度温度传感器。这些 功能以及 2V 至 5.5V 的宽电源电压范围,使得 ADS1118 非常适合 功率受限和空间受限的传感器测量 应用。 ADS1118 数据转换速率最高可达每秒 860 次采样 (SPS)。PGA 的输入范围为 ±256mV 至 ±6.144V,能 够以高分辨率测量大信号和小信号。该器件通过输入多 路复用器 (MUX) 测量双路差分输入或四路单端输入。 高精度温度传感器用于系统级温度监控或对热电偶进行 冷结点补偿。 ADS1118 可选择以连续转换模式或单次模式运行。该 器件在单次模式下完成一次转换后自动断电。在空闲状 态下,单次模式会显著降低流耗。所有数据均通过串行 外设接口 (SPI™) 进行传输。ADS1118 的额定工作温 度范围为 -40°C 至 +125°C。

  3. 移植工程
    我们的目标是在梁山派GD32F470上能够实现16bit模式1路ADC采集电压功能,和检查温度。首先要获取资料,查看数据手册应如何实现,再移植至我们的工程。
    查看资料
    (1)ADS1118是SPI协议的,首先要知道ADS1118支持的SPI模式,根据数据手册可知ADS1118位SPImode1。
    在这里插入图片描述

(2)读取ADS1118数据,根据数据手册介绍可以知ADS1118读取数据和写入数据是同时进行的(符合SPI协议支持全双工模式),只需要配置寄存器的SS位即可启动转换,通过mode位可以设置单次模式和连续模式。
在这里插入图片描述

(3)读取ADS1118数据方式,根据数据手册ADS1118数据传输方式有两种模式32bit和16bit。
32bit:SPI一次性发送32位数据,既发送两次相同的寄存器配置(ADS1118 控制寄存器为16位),读取的数据也为32位,前16位为ADS1118数据寄存器的值(ADC转换的值),后16位配置的控制寄存器的值。
16bit:SPI发送一次16位的控制寄存器用于配置ADS1118,这个时候因为全双工模式这一时刻交换的数据没有用,之后拉高片选(CS)后等待DOUT下降沿(数据转换完成DOUT从高变低),在发送相同的转换寄存器配置用于交换数据,这次得到的数据真正的ADC值。
本次主要使用16bit模式进行数据交换。
[图片]

(4)寄存器说明
ADS1118有两个寄存器一个是控制寄存器( Config Register)和转换寄存器(Conversion Register )

  • 这两个寄存器都是16位,读写都要16位操作
    在这里插入图片描述

控制寄存器说明
控制寄存器有16位,用于控制工作模式、输入选择、数据速率、满量程范围等。
第15位:SS,读操作时可以知道当前设备的工作状态,写1可以开始工作
在这里插入图片描述
第14-12位:MUX为输入多路复用器,对输入模式进行选择,如下图有八种输入模式,分别是四种差分与四种单端输入,(单端输入就是测量的数据有两个引脚,一个输出一个地。差分输入就是测量两个引脚的电压差)
在这里插入图片描述
MUX位既配置下图连接。
在这里插入图片描述

第11-9位:PGA为可编程增益放大器,设置FSR(满量程范围)。
在这里插入图片描述
第8位:MODE选择持续转换模式或单次转换模式。
在这里插入图片描述
第7-5位:DR配置数据传输速率,数据传输率越低采样数据越准。
在这里插入图片描述
第4位:本位选取ADC读取内部温度传感器或外部通道。
在这里插入图片描述
第3位:本位配置DOUT是否内部上拉,推荐使能上拉。
在这里插入图片描述
第2-1位:本位配置是否更新控制寄存器,推荐配置位01。
在这里插入图片描述
第0位:只读寄存器,总是1。
在这里插入图片描述
转换寄存器说明
16位转换寄存器以二进制的补码格式保存结果,其中最高位为1为负数,最高位为0为正数。
在这里插入图片描述
4.1 引脚选择(接线方式)
使用硬件SPI0接口。
在这里插入图片描述

4.2 移植步骤

/********************************************************************************
   * 测试硬件:立创·梁山派开发板GD32F470ZGT6    使用主频200Mhz    晶振25Mhz
   * 版 本 号: V1.0
   * 修改作者: gugugu
   * 修改日期: 2022年04月19日
   * 功能介绍:          
   ******************************************************************************
   * 梁山派软硬件资料与相关扩展板软硬件资料官网全部开源  
   * 开发板官网:www.lckfb.com   
   * 技术支持常驻论坛,任何技术问题欢迎随时交流学习  
   * 立创论坛:club.szlcsc.com   
   * 其余模块移植手册:https://dri8c0qdfb.feishu.cn/docx/EGRVdxunnohkrNxItYTcrwAnnHe
   * 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
   * 不靠卖板赚钱,以培养中国工程师为己任
 *********************************************************************************/
#include "gd32f4xx.h"
#include "SPI.h"
/******************************************************************
 * 函 数 名 称:MySPI_W_SS
 * 函 数 说 明:写片选脚
 * 函 数 形 参:BitValue = 设置的高低电平
 * 函 数 返 回:无
 * 作       者:gugugu
 * 备       注:无
******************************************************************/
void MySPI_W_SS(uint8_t BitValue)
{
        gpio_bit_write(SPI_Port,SPI_NSS,BitValue);
}
/******************************************************************
 * 函 数 名 称:MySPI_Init()
 * 函 数 说 明:初始化SPI
 * 函 数 形 参:BitValue = 设置的高低电平
 * 函 数 返 回:无
 * 作       者:gugugu
 * 备       注:无
******************************************************************/
void MySPI_Init()
{

        spi_parameter_struct spi_structure = {0};
        
        rcu_periph_clock_enable(RCU_GPIO);      //使能SPI_Port时钟
        rcu_periph_clock_enable(RCU_SPI);   //使能SPI0时钟
        
        gpio_af_set(SPI_Port,GPIO_AF_5,SPI_SCLK);//复用SPI0_SCLK
        gpio_af_set(SPI_Port,GPIO_AF_5,SPI_MOSI);//复用SPI0_MOSI
        gpio_af_set(SPI_Port,GPIO_AF_5,SPI_MISO);//复用SPI0_MISO
        
        gpio_mode_set(SPI_Port,GPIO_MODE_AF,GPIO_PUPD_NONE,SPI_SCLK);//SPI0_SCLK
        gpio_mode_set(SPI_Port,GPIO_MODE_AF,GPIO_PUPD_NONE,SPI_MOSI);//SPI0_M0SI
        gpio_mode_set(SPI_Port,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,SPI_NSS);//SPI0_NSS
        gpio_mode_set(SPI_Port,GPIO_MODE_AF,GPIO_PUPD_NONE,SPI_MISO);//SPI0_MISO
        
        gpio_output_options_set(SPI_Port,GPIO_OTYPE_PP,GPIO_OSPEED_25MHZ,SPI_SCLK);//SPI0_SCLK
        gpio_output_options_set(SPI_Port,GPIO_OTYPE_PP,GPIO_OSPEED_25MHZ,SPI_MOSI);//SPI0_MOSI
        gpio_output_options_set(SPI_Port,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,SPI_NSS);//SPI0_NSS
        gpio_output_options_set(SPI_Port,GPIO_OTYPE_PP,GPIO_OSPEED_25MHZ,SPI_MISO);//SPI0_MISO

        spi_structure.nss = SPI_NSS_SOFT;                            //软件片选
        spi_structure.endian = SPI_ENDIAN_MSB;  
        spi_structure.prescale = SPI_PSC_128;                        //时钟分频120M/128=937.5K
        spi_structure.device_mode = SPI_MASTER;                      //主机模式
        spi_structure.trans_mode = SPI_TRANSMODE_FULLDUPLEX;         //双线全双工
        spi_structure.frame_size = SPI_FRAMESIZE_16BIT;              //数据16位
        spi_structure.clock_polarity_phase = SPI_CK_PL_LOW_PH_2EDGE; //SPImode1
        spi_init(SPI0,&spi_structure);                               //初始化SPI0
        
        spi_enable(SPI0);                                            //使能SPI0
        
        MySPI_W_SS(1);                                               //拉高片选
}
/******************************************************************
 * 函 数 名 称:MySPI_SwapByte
 * 函 数 说 明:向从机交换16位数据,并从从机读取16位数据
 * 函 数 形 参:ByteSend = 发送的16位数据
 * 函 数 返 回:从机数据
 * 作       者:gugugu
 * 备       注:无
******************************************************************/
uint16_t MySPI_SwapByte(uint16_t ByteSend)
{
        while (spi_i2s_flag_get(SPI0, SPI_FLAG_TBE) != SET);   //读取发送缓冲区空标志
        
        spi_i2s_data_transmit(SPI0, ByteSend);                 //发送数据
        
        while (spi_i2s_flag_get(SPI0, SPI_FLAG_RBNE) != SET);  //读取接收缓冲区非空标志
        
        return spi_i2s_data_receive(SPI0);                     //接收数据
}
/******************************************************************
 * 函 数 名 称:MySPI_Start()
 * 函 数 说 明:拉低片选脚开始通信
 * 函 数 形 参:无
 * 函 数 返 回:无
 * 作       者:gugugu
 * 备       注:无
******************************************************************/
void MySPI_Start()
{
        MySPI_W_SS(0);
}
/******************************************************************
 * 函 数 名 称:MySPI_STOP()
 * 函 数 说 明:拉高片选脚结束通信
 * 函 数 形 参:无
 * 函 数 返 回:无
 * 作       者:gugugu
 * 备       注:无
******************************************************************/
void MySPI_STOP()
{
        MySPI_W_SS(1);
}

SPI.h

#ifndef __SPI_H
#define __SPI_H
#include "systick.h"
//SPI 端口定义
#define SPI_Port      GPIOA              //SPI端口
#define SPI_NSS       GPIO_PIN_4         //NSS_PIN
#define SPI_MOSI      GPIO_PIN_6         //MOSI_PIN
#define SPI_MISO      GPIO_PIN_7         //MOSI_PIN
#define SPI_SCLK      GPIO_PIN_5         //SCLK_PINPI

#define RCU_SPI       RCU_SPI0         
#define RCU_GPIO      RCU_GPIOA

void MySPI_W_SS(uint8_t BitValue);
void MySPI_Init();
void MySPI_Start();//拉低片选脚开始通信
void MySPI_STOP();//拉高片选脚结束通信
uint16_t MySPI_SwapByte(uint16_t ByteSend);
#endif

ADS1118.c

 /********************************************************************************
   * 测试硬件:立创·梁山派开发板GD32F470ZGT6    使用主频200Mhz    晶振25Mhz
   * 版 本 号: V1.0
   * 修改作者: LCKFB
   * 修改日期: 2022年04月19日
   * 功能介绍:          
   ******************************************************************************
   * 梁山派软硬件资料与相关扩展板软硬件资料官网全部开源  
   * 开发板官网:www.lckfb.com   
   * 技术支持常驻论坛,任何技术问题欢迎随时交流学习  
   * 立创论坛:club.szlcsc.com   
   * 其余模块移植手册:https://dri8c0qdfb.feishu.cn/docx/EGRVdxunnohkrNxItYTcrwAnnHe
   * 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
   * 不靠卖板赚钱,以培养中国工程师为己任
 *********************************************************************************/
#include "gd32f4xx.h"
#include "ADS1118.h"
//ADS1118 supply voltage 2 - 5.5V
//analog input voltage max VDD+0.3V.    VIN<VDD!!!!!
//(VDD-->3v3,PGA-->4096,)无法获得满量程ADC输出代码,这种意味着一些动态范围的丢失.


/******************************************************************
 * 函 数 名 称:ADS1118_ADC_Continuous_Init
 * 函 数 说 明:初始化ADS1118
 * 函 数 形 参:channel = ADC外部通道选择,PGA = ADC满量程选择,SPS = ADC数据传输率选择
 * 函 数 返 回:无
 * 作       者:gugugu
 * 备       注:连续模式使用前,调用此函数完成初始化,之后调用ADS1118_Get_ADC_Continuous_Data()
******************************************************************/
void ADS1118_ADC_Continuous_Init(uint16_t channel,uint16_t PGA,uint16_t SPS)
{
        MySPI_Init();
        ADS1118_ENABLE;//拉低CS开始通信
        delay_us(1);
        MySPI_SwapByte(ADS1118_SS_START|channel|PGA|ADS1118_Continuous_MODE
                                        |SPS|ADS1118_Temp_MODE|ADS1118_PUUP_EN|ADS1118_NOP_UPDATA);//发送寄存器命令,交换数据
        delay_us(10);
        ADS1118_DISABLE;//拉高CS复位ADS1118结束通信
        delay_1ms(1);
        
}
/******************************************************************
 * 函 数 名 称:ADS1118_Get_Tempture_Data()
 * 函 数 说 明:单次获取ADC内部Temp温度
 * 函 数 形 参:无
 * 函 数 返 回:返回内部温度传感器温度
 * 作       者:gugugu
 * 备       注:无
******************************************************************/
float ADS1118_Get_Tempture_Data()
{
        uint16_t ADC_Data = 0;
        float Tempture_data= 0;
        ADS1118_ENABLE;//拉低CS开始通信
        delay_us(5);
        ADC_Data = MySPI_SwapByte(ADS1118_SS_START|ADS1118_MUX_AIN0|ADS1118_PGA_4096|
                                                          ADS1118_Sigle_SHOT_MODE|ADS1118_DR_8SPS|ADS1118_Temp_MODE|
                                                                ADS1118_PUUP_EN|ADS1118_NOP_UPDATA);//发送寄存器命令,交换数据

        delay_us(5);
        ADS1118_DISABLE;//拉高CS复位ADS1118结束通信
        
        delay_1ms(1);
        
        ADS1118_ENABLE;//拉低CS开始通信
        delay_us(5);
        while(gpio_input_bit_get(GPIOA,GPIO_PIN_6));//DOUT拉低ADC1118数据更新准备完毕

        ADC_Data = MySPI_SwapByte(ADS1118_SS_START|ADS1118_MUX_AIN0|ADS1118_PGA_4096|
                                                          ADS1118_Sigle_SHOT_MODE|ADS1118_DR_8SPS|ADS1118_Temp_MODE|
                                                                ADS1118_PUUP_EN|ADS1118_NOP_UPDATA);//发送寄存器命令,交换数据
        delay_us(5);
        ADS1118_DISABLE;//拉高CS复位ADS1118结束通信
        if(ADC_Data&0X8000)//MSB=1
        {
                ADC_Data = (~ADC_Data)+1 ;
        }
        else Tempture_data = (ADC_Data >> 2)*0.03125;
        return Tempture_data;        
}
/******************************************************************
 * 函 数 名 称:ADS1118_Get_ADC_SIGLE_SHOT_Data
 * 函 数 说 明:单次获取AD电压值
 * 函 数 形 参:channel = ADC外部通道选择,PGA = ADC满量程选择,SPS = ADC数据传输率选择
 * 函 数 返 回:AD电压值
 * 作       者:gugugu
 * 备       注:
******************************************************************/
float ADS1118_Get_ADC_SIGLE_SHOT_Data(uint16_t channel,uint16_t PGA,uint16_t SPS)
{
        uint16_t ADC_Data = 0;
        float Tempture_data= 0;
        ADS1118_ENABLE;//拉低CS开始通信
        delay_us(15);
        ADC_Data = MySPI_SwapByte(ADS1118_SS_START|channel|PGA|ADS1118_Sigle_SHOT_MODE
                                                        |SPS|ADS1118_ADC_MODE|ADS1118_PUUP_EN|ADS1118_NOP_UPDATA);//发送寄存器命令,交换数据

        delay_us(15);
        ADS1118_DISABLE;//拉高CS复位ADS1118结束通信
        
        delay_1ms(1);
        
        ADS1118_ENABLE;//拉低CS开始通信
        delay_us(15);
        while(gpio_input_bit_get(GPIOA,GPIO_PIN_6));//DOUT拉低ADC1118数据更新准备完毕

        ADC_Data = MySPI_SwapByte(ADS1118_SS_START|channel|PGA|ADS1118_Sigle_SHOT_MODE
                                                         |SPS|ADS1118_ADC_MODE|ADS1118_PUUP_EN|ADS1118_NOP_UPDATA);//发送寄存器命令,交换数据

        delay_us(15);
        ADS1118_DISABLE;//拉高CS复位ADS1118结束通信
        if(ADC_Data&0X8000)//MSB=1
        {
                ADC_Data = (~ADC_Data)+1 ;
                if(PGA == ADS1118_PGA_6144)Tempture_data=ADC_Data*0.1875;
                else if(PGA == ADS1118_PGA_6144)Tempture_data=ADC_Data*0.1875;
                else if(PGA == ADS1118_PGA_4096)Tempture_data=ADC_Data*0.125;
                else if(PGA == ADS1118_PGA_2048)Tempture_data=ADC_Data*0.0625;
                else if(PGA == ADS1118_PGA_1024)Tempture_data=ADC_Data*0.03125;
                else if(PGA == ADS1118_PGA_0512)Tempture_data=ADC_Data*0.015625;
                else Tempture_data=ADC_Data*0.0078125;
                return Tempture_data;
        }
        else if(PGA == ADS1118_PGA_6144)Tempture_data=ADC_Data*0.1875;
        else if(PGA == ADS1118_PGA_6144)Tempture_data=ADC_Data*0.1875;
        else if(PGA == ADS1118_PGA_4096)Tempture_data=ADC_Data*0.125;
        else if(PGA == ADS1118_PGA_2048)Tempture_data=ADC_Data*0.0625;
        else if(PGA == ADS1118_PGA_1024)Tempture_data=ADC_Data*0.03125;
        else if(PGA == ADS1118_PGA_0512)Tempture_data=ADC_Data*0.015625;
        else Tempture_data=ADC_Data*0.0078125;
        return Tempture_data;        
}
/******************************************************************
 * 函 数 名 称:ADS1118_Get_ADC_Continuous_Data
 * 函 数 说 明:连续获取AD电压值
 * 函 数 形 参:channel = ADC外部通道选择,PGA = ADC满量程选择,SPS = ADC数据传输率选择
 * 函 数 返 回:AD电压值
 * 作       者:gugugu
 * 备       注:使用此函数前调用ADS1118_ADC_Continuous_Init()
******************************************************************/
float  ADS1118_Get_ADC_Continuous_Data(uint16_t channel,uint16_t PGA,uint16_t SPS)
{
        uint16_t ADC_Data = 0;
        float Tempture_data= 0;
        ADS1118_ENABLE;//拉低CS开始通信
        delay_us(1);
        while(gpio_input_bit_get(GPIOA,GPIO_PIN_6));//DOUT拉低ADC1118数据更新准备完毕

        ADC_Data = MySPI_SwapByte(ADS1118_SS_START|channel|PGA|ADS1118_Continuous_MODE
                                                         |SPS|ADS1118_ADC_MODE|ADS1118_PUUP_EN|ADS1118_NOP_UPDATA);//发送寄存器命令,交换数据

        delay_us(1);
        ADS1118_DISABLE;//拉高CS复位ADS1118结束通信
        if(ADC_Data&0X8000)//MSB=1
        {
                ADC_Data = (~ADC_Data)+1 ;
                if(PGA == ADS1118_PGA_6144)Tempture_data=ADC_Data*0.1875;
                else if(PGA == ADS1118_PGA_6144)Tempture_data=ADC_Data*0.1875;
                else if(PGA == ADS1118_PGA_4096)Tempture_data=ADC_Data*0.125;
                else if(PGA == ADS1118_PGA_2048)Tempture_data=ADC_Data*0.0625;
                else if(PGA == ADS1118_PGA_1024)Tempture_data=ADC_Data*0.03125;
                else if(PGA == ADS1118_PGA_0512)Tempture_data=ADC_Data*0.015625;
                else Tempture_data=ADC_Data*0.0078125;
                return Tempture_data;
        }
        else if(PGA == ADS1118_PGA_6144)Tempture_data=ADC_Data*0.1875;
        else if(PGA == ADS1118_PGA_6144)Tempture_data=ADC_Data*0.1875;
        else if(PGA == ADS1118_PGA_4096)Tempture_data=ADC_Data*0.125;
        else if(PGA == ADS1118_PGA_2048)Tempture_data=ADC_Data*0.0625;
        else if(PGA == ADS1118_PGA_1024)Tempture_data=ADC_Data*0.03125;
        else if(PGA == ADS1118_PGA_0512)Tempture_data=ADC_Data*0.015625;
        else Tempture_data=ADC_Data*0.0078125;
        return Tempture_data;
} 

ADS1118.h

#ifndef __ADS1118_H
#define __ADS1118_H
#include "SPI.h"
#include "systick.h"

#define ADS1118_ENABLE           MySPI_Start()  //PULL DOWM CS START ADC
#define ADS1118_DISABLE          MySPI_STOP()  //PULL UP CS STOP ADC

#define ADS1118_SS_START        0X8000    //0--》NO effect,1-->start ADC

#define ADS1118_MUX_AIN0_AIN1   0X0000    //000 = AINP is AIN0 and AINN is AIN1 (default)
#define ADS1118_MUX_AIN0_AIN3   0x1000    //001 = AINP is AIN0 and AINN is AIN3
#define ADS1118_MUX_AIN1_AIN3   0X2000    //010 = AINP is AIN1 and AINN is AIN3
#define ADS1118_MUX_AIN2_AIN3   0X3000    //011 = AINP is AIN2 and AINN is AIN3
#define ADS1118_MUX_AIN0        0X4000    //100 = AINP is AIN0 and AINN is GND
#define ADS1118_MUX_AIN1        0X5000    //101 = AINP is AIN1 and AINN is GND
#define ADS1118_MUX_AIN2        0X6000    //110 = AINP is AIN2 and AINN is GND
#define ADS1118_MUX_AIN3        0X7000    //111 = AINP is AIN3 and AINN is GND

#define ADS1118_PGA_6144        0X0000    //000 = FSR is ±6.144 V
#define ADS1118_PGA_4096        0X0200    //001 = FSR is ±4.096 V
#define ADS1118_PGA_2048        0X0400    //010 = FSR is ±2.048 V (default)
#define ADS1118_PGA_1024        0X0600    //011 = FSR is ±1.024 V
#define ADS1118_PGA_0512        0X0800    //100 = FSR is ±0.512 V
#define ADS1118_PGA_0256        0X0A00    //101 = FSR is ±0.256 V

#define ADS1118_Continuous_MODE 0X0000    //0->Continuous
#define ADS1118_Sigle_SHOT_MODE 0X0100    //1->SIGNEL ADC

#define ADS1118_DR_8SPS         0X0000    //000 = 8 SPS
#define ADS1118_DR_16SPS        0X0020    //001 = 16 SPS
#define ADS1118_DR_32SPS        0X0040    //010 = 32 SPS
#define ADS1118_DR_64SPS        0X0060    //011 = 64 SPS
#define ADS1118_DR_128SPS       0X0080    //100 = 128 SPS (default)
#define ADS1118_DR_250SPS       0X00A0    //101 = 250 SPS
#define ADS1118_DR_470SPS       0X00C0    //110 = 475 SPS
#define ADS1118_DR_860SPS       0X00E0    //111 = 860 SPS

#define ADS1118_ADC_MODE        0x0000    //ADC MODE
#define ADS1118_Temp_MODE       0X0010    //Temperature sensor mode

#define ADS1118_PUUP_DIS        0X0000    //inside pullup disabled
#define ADS1118_PUUP_EN         0x0008    //inside pullup enabled

#define ADS1118_NOP_UPDATA      0X0002    //update the Config register
void ADS1118_ADC_Continuous_Init(uint16_t channel,uint16_t PGA,uint16_t SPS);
void ADS1118_Temp_Init();
float ADS1118_Get_Tempture_Data();
float ADS1118_Get_ADC_SIGLE_SHOT_Data(uint16_t channel,uint16_t PGA,uint16_t SPS);
float  ADS1118_Get_ADC_Continuous_Data(uint16_t channel,uint16_t PGA,uint16_t SPS);
#endif

  1. 移植验证
    编写的main主函数中,编写如下
 /********************************************************************************
   * 测试硬件:立创·梁山派开发板GD32F470ZGT6    使用主频200Mhz    晶振25Mhz
   * 版 本 号: V1.0
   * 修改作者: LCKFB
   * 修改日期: 2022年04月19日
   * 功能介绍:          
   ******************************************************************************
   * 梁山派软硬件资料与相关扩展板软硬件资料官网全部开源  
   * 开发板官网:www.lckfb.com   
   * 技术支持常驻论坛,任何技术问题欢迎随时交流学习  
   * 立创论坛:club.szlcsc.com   
   * 其余模块移植手册:https://dri8c0qdfb.feishu.cn/docx/EGRVdxunnohkrNxItYTcrwAnnHe
   * 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
   * 不靠卖板赚钱,以培养中国工程师为己任
 *********************************************************************************/
#include "gd32f4xx.h"
#include "systick.h"
#include "stdio.h"
#include "UART.h"
#include "ADS1118.h"
#include "SPI.h"

int main(void)
{
    float AD_value;
    nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);  // 优先级分组
    systick_config();                //滴答定时器初始化 1us
        MySPI_Init();                    //初始化spi
        ADS1118_ADC_Continuous_Init(ADS1118_MUX_AIN0 ,ADS1118_PGA_4096,ADS1118_DR_8SPS);
        usart_gpio_config(115200);
    while(1)
    {
                AD_value = ADS1118_Get_ADC_SIGLE_SHOT_Data(ADS1118_MUX_AIN0 ,ADS1118_PGA_4096,ADS1118_DR_8SPS);
                //AD_value = ADS1118_Get_Tempture_Data();
                printf("%f",AD_value);
                delay_1ms(100);
        
    }
}     

案例现象1:
烧录代码,使用debug模式,成功读取返回温度值。
在这里插入图片描述
案例现象2:
烧录代码,使用debug模式,成功读取返回单端电压值。
在这里插入图片描述
在这里插入图片描述
案例现象3:
烧录代码,使用debug模式,成功读取返回差分电压值。
在这里插入图片描述
在这里插入图片描述

案例现象4:
烧录代码,使用debug模式,连续模式成功读取返回单端电压值。
在这里插入图片描述
在这里插入图片描述
!](https://img-blog.csdnimg.cn/74802e778a894c228ab5e38b66332ef2.png)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咕咕鸟bird

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值