ADS8866 ADC转换芯片驱动调试

这篇具有很好参考价值的文章主要介绍了ADS8866 ADC转换芯片驱动调试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

ADS8866 ADC转换芯片驱动调试

开发环境:

ADS8866功能简介

硬件连接

SPI3的软件驱动

ADS8866通讯时序分析

ADS8866驱动


ADS8866 ADC转换芯片驱动调试

开发环境:

主控芯片:STM32F103RCT6、ADS8866转换芯片、使用HAL库进行开发。

ADS8866功能简介

ADS8866是一款16位、100kSPS单端输入模数转换器(ADC)。ADS8866是一款16位,100kSPS,单端输入,模数转换器 (ADC)。此器件以2.5V至5V的外部基准运行,从而在无需额外的信号调节情况下提供宽信号范围。此基准电压设置独立于,并且可超过,模拟电源电压(AVDD)。此器件提供一个SPI兼容串口,此串口也支持菊花链操作以实现多个器件级联。 
此器件支持-0.1V至VREF + 0.1V范围的单极单端模拟输入。器件运行针对极低功耗运行进行了优化。功耗直接与速度成比例。这个特性使得ADS8866非常适合于低速应用。
以下链接是其详细的数据手册:

https://download.csdn.net/download/qq_45143522/89216266

硬件连接

ADS8866 ADC转换芯片驱动调试,STM32,单片机,嵌入式硬件,stm32,c语言

我这边是使用STM32F103RCT6的SPI3与ADS8866进行通讯的。引脚对应如下:
    stm32f103引脚     ADS8866引脚
    PA15            CONVST作为片选引脚使用
    PB3             SCLK时钟引脚
    PB4             DOUT(MISO)
    PB5             DIN(MOSI)
由于ADS8866分为三线模式和四线模式,我这边使用的是三线模式,即不使用DIN(MISO),硬件设计时可以根据ads8866的datesheet手册根据三线模式的要求将DIN引脚直接和DVDD相连使其保持高电平即可。    

SPI3的软件驱动

这里如何使用STM32CubeMX配置SPI3的驱动,可以自己查找相关的资料进行配置,这里不再配置,直接看程序框架及驱动代码。
主函数main程序架构:
uint8_t ads8866_buf[2]; //用来存储ads8866发送来的数据     
int main()
{
    HAL_Init();
    SystemClock_Config();
    
    MX_GPIO_Init(); //初始化GPIO,片选引脚CONVST
    MX_SPI3_Init(); //初始化SPI3的相关引脚及配置SPI3
    
    while(1)
    {
        get_ads8866_data(&hspi3,ads8866_buf);   //stm32读取ads8866转换数据接口函数
        HAL_Delay(2000);
    }
}
​
MX_GPIO_Init函数主要内容如下:
MX_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    __HAL_RCC_GPIOA_CLK_ENABLE();
    
    GPIO_InitStruct.Pin = GPIO_PIN_15;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_PULLDOWN;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA,&GPIO_InitStruct);
    //这里将CONVST初始化为低电平是由ADS8866的通讯时序决定的,后面会说。
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_15,GPIO_PIN_RESET); 
}
​
MX_SPI3_Init函数主要内容如下:
void MX_SPI3_Init(void)
{       
    hspi3.Instance = SPI3;                  
    hspi3.Init.Mode = SPI_MODE_MASTER;                      //主模式
    hspi3.Init.Direction = SPI_DIRECTION_2LINES;
    hspi3.Init.DataSize = SPI_DATASIZE_8BIT;                //8位帧结构
    hspi3.Init.CLKPolarity = SPI_POLARITY_LOW;              //SCLK的空闲状态为低电平
    hspi3.Init.CLKPhase = SPI_PHASE_2EDGE;                  //在SCLK的第2个跳变沿开始传输数据
    hspi3.Init.NSS = SPI_NSS_SOFT;         
    hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; //4分频值 频率为36MHz/4 = 9MHz
    hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB;                 //数据传输从MSB位开始
    hspi3.Init.TIMode = SPI_TIMODE_DISABLE;            
    hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;   
    hspi3.Init.CRCPolynomial = 7;                            
    if(HAL_SPI_Init(&hspi3) != HAL_OK)  
    {
        Error_Handler();
    }
 
    __HAL_SPI_ENABLE(&hspi3);
}
其中:
    时钟极性CPOL和时钟相位CPHA两项的设置依然是和ADS8866芯片的通讯时序有关,后面会说到。
    
HAL_SPI_MspInit(SPI_HandleTypeDef * spiHandle)函数的主要内容如下:
void HAL_SPI_MspInit(SPI_HandleTypeDef * spiHandle) 
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    if(spiHandle->Instance == SPI3)
    {
        __HAL_RCC_SPI3_CLK_ENABLE();
        __HAL_RCC_GPIOB_CLK_ENABLE();
        //PB3--SCLK PB4--DOUT(MISO) PB5--DIN(MOSI)
        GPIO_InitStruct.Pin = GPIO_PIN_3 | GPIO_PIN_5;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);
        
        GPIO_InitStruct.Pin = GPIO_PIN_4;
        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);
    }
}
至此,SPI3的HAL库驱动就基本完成了,接着需要与ADS8866芯片进行通讯,来获取adc采集的数据。

ADS8866通讯时序分析

在进行ADS8866驱动开发前,我们需要阅读芯片的datesheet手册来确定通讯的时序。如下图是数据手册里的三线模式的通讯时序图:

ADS8866 ADC转换芯片驱动调试,STM32,单片机,嵌入式硬件,stm32,c语言文章来源地址https://www.toymoban.com/news/detail-857657.html

根据数据手册及时序图,我们可以知道:
1、在三线模式下,CONVST引脚与DVDD引脚相连,并且将CONVST引脚作为片选引脚使用。
2、CONVST引脚的上升沿会使得DOUT进入三态的状态,并且开始与ads8866建立会话。
3、CONVST引脚由低变高后最少要持续t_conv-max的时间,这个参数为8.8微秒。
4、当建立会话的过程结束之后就进入传输数据的阶段。
5、在CONVST的下降沿,DOUT退出三态状态,ADS8866开始向外传输数据,数据传输从最高位开始。
6、之后的数据传输都是在SCLK的下降沿到来时进行传输。数据在SCLK的双边沿均有效。
7、将片选信号CONVST拉高或者在第16次SCLK时钟的下降沿到来之后DOUT将重新回到三态的状态。
除了以上信息,我们根据时序图还可以知道:
    CONVST片选信号的初始状态为低电平。
    SCLK时钟线的空闲状态为低电平。即时钟极性CPOL = 0。
    在SCLK的第2个跳变沿(下降沿)开始传输数据,即时钟相位CPHA为1。
这三点对我们编写程序非常重要。

ADS8866驱动

经过以上对ADS8866芯片的时序分析之后,我们想要通过SPI通讯读取ADS8866芯片采集转换后的adc数据将十分简单。
具体程序代码如下:
//使用到的微秒级延时函数
void delay_us(uint32_t us)
{
    uint8_t i = 0;
    while(us--)
    {
        i = 12;
        while(i--);
    }
}
​
//获取ADS8866的转换数据
void get_ads8866_data(SPI_HandleTypeDef *hspi,uint8_t *buf)
{
    //建立会话
    ADC_CS3_HIGH;   //片选信号初始化为低,在DIN为高的时候,片选信号给个上升沿开始与adc芯片建立会话
    delay_us(10);   //片选信号拉高后的持续时间要超过8.8微秒
    //传输数据
    ADC_CS3_LOW;    //片选信号拉低开始传输数据
    HAL_SPI_Receive(hspi,buf,2,100);  //接收ADS8866发送的2字节数据到buf缓存中
}

到了这里,关于ADS8866 ADC转换芯片驱动调试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32驱动ADS1256串口输出-AD转换

    ADS1256是TI推出的一款微功耗、高精度、8 通道、24 位高性能模数转换器。该芯片还带有4个可编程的I/O口、输入缓冲器和可编程增益放大器等,芯片本身可以测量0-5v的信号,高电压采集可以通过把信号分压成0-5v的范围内再给模块输入,所以ADS1256可以采集市面上大多数的标准电

    2024年02月16日
    浏览(50)
  • STM32读取24位模数转换(24bit ADC)芯片TM7711数据

    TM7711是一款国产低成本24位ADC芯片,常用于与称重传感器配合实现体重计的应用。这里介绍STM32读取TM7711的电路和代码实现。TM7711与HX710A是兼容的芯片,而与HX711在功能上有所不同: HX711具有双通道信号采样,三种放大倍数,支持设置模拟电压AVDD(也是内部参考电压)输出给外

    2023年04月08日
    浏览(74)
  • STM32读取24位模数转换(24bit ADC)芯片HX711数据

    HX711是一款国产低成本24位ADC芯片,常用于与称重传感器配合实现体重计的应用。这里介绍STM32读取HX711的电路和代码实现。 HX711的内部原理如下图所示: 市面上有普通和带屏蔽的两种模块: STM32可直接与HX711进行连接,选择2个具有FT(5V耐压)的管脚,将其中对应时钟输出的管

    2023年04月08日
    浏览(81)
  • STM32配置读取双路24位模数转换(24bit ADC)芯片CS1238数据

    CS1238是一款国产双路24位ADC芯片,与CS1238对应的单路24位ADC芯片是CS1237,功能上相当于HX711和TM7711的组合。其功能如下所示: 市面上的模块: CS1238内部原理如下所示, VDD是DVDD和AVDD的合并: 有单独的参考电压输入设置管脚,以及内部输出与VDD同电压的参考输出电压,可选连接到

    2024年02月16日
    浏览(46)
  • STM32模拟SPI协议获取24位模数转换(24bit ADC)芯片AD7791电压采样数据

    STM32大部分芯片只有12位的ADC采样性能,如果要实现更高精度的模数转换如24位ADC采样,则需要连接外部ADC实现。AD7791是亚德诺(ADI)半导体一款用于低功耗、24位Σ-Δ型模数转换器(ADC) ,适合低频测量应用,提供50 Hz/60 Hz同步抑制。 这里介绍基于AD7791的24位ADC采样实现。 AD7791的管脚

    2024年02月09日
    浏览(61)
  • STM32 ADS1263驱动源码

    目录 简介: ADS1263.c: ADS1263.h: 测试结果:         ADS1262 和 ADS1263 (ADS126x) 是具有集成 PGA 、 电压基准和内部故障监视器的低噪声、低漂移、 38.4kSPS、Δ - Σ ADC 。 ADS1263 集成了一个 24 位辅助 Δ- Σ ADC , 适用于后台测量。这种支持传感器的 ADC 提供了一套完备的高精度、单芯片

    2024年04月13日
    浏览(32)
  • STM32F103硬件SPI驱动ADS1256

    最近实验室有几个项目都需要用到高分辨率AD转换,于是就开始了ADS1256的开发。 新手,焊得丑,见谅(能用就行) 二: 本以为很容易就能做完,结果被采样速率的问题困扰了很久。 代码如下,使用2.5V基准源进行测试,结果在读ADS时经常出现读出0xFFFFFF的情况,只能忍住悲伤

    2024年02月12日
    浏览(76)
  • stm32-ADC转换

    ADC(Analog-Digital Converter)为模拟-数字转换器,可以将引脚上连续变化的电压值等效为数字变量。 12位为其分辨率0~2^12-1,将能够检测到的电压范围通过线性等效为0-4095其中的一个数字变量,分辨率越高越精确。 1us为转换时间 实现原理: 通过通道选择开关选择输入引脚,然后通

    2024年02月22日
    浏览(36)
  • STM32-ADC模数转换

    ADC的概念 Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。 ADC的作用 采集传感器的数据,测量输入电压,检查电池电量剩余,监测温湿度等。 典型的模拟数字转换器将模拟信号转换为表示一定

    2024年01月20日
    浏览(41)
  • STM32--ADC模数转换

    STM32的ADC(Analog-Digital Converter)模拟-数字转换器 , 是一种逐次逼近型模拟数字转换器,可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁 。拥有18个输入通道,可测量16个外部通道和2个内部信号源。各通道的A/D转换可以单次、

    2024年02月12日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包