ADS8866 ADC转换芯片驱动调试

news2024/12/23 23:28:37

目录

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

硬件连接

我这边是使用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手册来确定通讯的时序。如下图是数据手册里的三线模式的通讯时序图:

根据数据手册及时序图,我们可以知道:
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缓存中
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1622290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Chitosan-Rhodamine B 罗丹明B标记壳聚糖

Chitosan-Rhodamine B 罗丹明B标记壳聚糖 【中文名称】罗丹明B标记壳聚糖 【英文名称】Chitosan-RB 【结 构】 【品 牌】碳水科技(Tanshtech) 【纯 度】95%以上 【保 存】-20℃ 【规 格】50mg,100mg,500mg,1g,5g,10g 【产品特性】 Rh…

libVLC 专栏介绍

本专栏主要界面libVLC的使用,详细介绍了相关用法,使用Qt作为显示界面,不仅可以了解Qt的使用,QSS的美化,更能够熟悉libVLC核心接口的使用,最后打造一款属于自己的精美播放器。 每一节都有单独的源码供查看。…

企业微信hook接口协议,ipad协议http,发送小程序

发送小程序 参数名必选类型说明uuid是String每个实例的唯一标识,根据uuid操作具体企业微信send_userid是long要发送的人或群idisRoom是bool是否是群消息 请求示例 {"uuid":"543ed7f3-6ec1-4db8339a140f7","send_userid":788130255…

gps路径压缩算法

公司的gps点位特别多,导致数据存储以及查询都会造成一定的压力. 所以我们需要使用gps路径压缩算法 我调研了两种: k-means 和 Douglas-Peucker k-means 压缩的底层原理是: 自定义簇的数量,假设是100个,那么就会计算所有gps点,把最相近的点,放在一个簇里,以此类推,计算出100个…

你如何看待AIGC技术?

你如何看待AIGC技术? AIGC技术(Artificial Intelligence Generated Content)是指由人工智能生成的内容。它在许多领域都有应用,包括自然语言处理、图像生成、音频合成等。虽然这些技术可以提高效率和创造力,但也需要注…

机器学习和深度学习-- 李宏毅(笔记与个人理解)Day22

Day 22 Transformer seqence to seqence 有什么用呢? Encoder how Block work 仔细讲讲Residual 的过程? 重构 Decoder - AutoRegressive Mask 由于是文字接龙,所以无法考虑右边的 info 另一种decoder Encoder to Decoder – Cross Attend…

【算法】五子连线

题目描述 五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏,通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成连续的五子连线(横、竖、斜)者获胜。 棋盘一般为…

电脑回收站的东西还原后会在哪里?一文给你答案!

“很奇怪,想问问大家,我电脑回收站里还原的文件会被保存在哪里呀?刚刚恢复文件的时候本来想直接将它拖出,却发现文件不见了,这种情况应该怎么解决呢?” 电脑回收站是一个特殊的文件夹,用于临时存…

解决IDEA中Tomcat控制台乱码问题(包括sout输出乱码)

文章目录 前言一、控制台直接输出乱码二、sout输出内容在控制台显示乱码 前言 今天在使用Tomcat的时候发现控制台输入出现了乱码问题,其实之前就出现过一次,解决了,但是新创建一个项目后又会出现sout的内容在控制台输出的乱码问题&#xff0…

【漏洞复现】云时空社会化商业ERP系统LoginName SQL注入漏洞

漏洞描述: 云时空社会化商业ERP系统loginName存在SQL注入漏洞,攻击者可以通过此漏洞获取数据库敏感信息。 搜索语法: Fofa-Query: app"云时空社会化商业ERP系统" 漏洞详情: 1.云时空社会化商业ERP系统。 2.漏洞POC&#xff1a…

redis中的双写一致性问题

双写一致性问题 1.先删除缓存或者先修改数据库都可能出现脏数据。 2.删除两次缓存,可以在一定程度上降低脏数据的出现。 3.延时是因为数据库一般采用主从分离,读写分离。延迟一会是让主节点把数据同步到从节点。 1.读写锁保证数据的强一致性 因为一般放…

svg图标填充渐变色及CSS鼠标悬停纯色渐变色转换

svg图标填充渐变色及CSS鼠标悬停纯色渐变色转换&#xff1a; HTML&#xff1a; <!--底部导航--> <ul class"milliaNav"> <li class"active"><a href"#"> <svg class"icon" viewBox"0 0 1024 1024&qu…

06.JAVAEE之线程4

1.定时器 1.1 定时器是什么 定时器也是软件开发中的一个重要组件. 类似于一个 " 闹钟 ". 达到一个设定的时间之后 , 就执行某个指定好的代码. 约定一个时间,时间到达之后,执行某个代码逻辑, 定时器非常常见,尤其是在进行网络通信的时候, 需要有等待的最大时间&…

xilinx Mailbox 中的ipi message地址计算方式

适用于openAmp mailbox ipi id对应的ipi message地址计算方式 官方openamp硬件配置解析 OpenAMP Base Hardware Configurations - Xilinx Wiki - Confluence openamp官方设备树 meta-openamp/meta-xilinx-tools/recipes-bsp/device-tree/files/zynqmp-openamp.dtsi at rel-v2…

政安晨:【Keras机器学习示例演绎】(十四)—— 用于弱光图像增强的零 DCE

目录 简介 下载 LOL 数据集 创建 TensorFlow 数据集 零 DCE 框架 了解光线增强曲线 DCE-Net 损失函数 色彩恒定损失 曝光损失 光照平滑度损失 空间一致性损失 深度曲线估计模型 训练 推论 测试图像推理 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点…

遥感卫星影像地表温度反演

近年来&#xff0c;随着遥感技术的不断发展和卫星遥感数据的广泛应用&#xff0c;遥感卫星地表温度反演成为了地球科学和环境监测领域的重要研究内容。地表温度反演是指利用遥感卫星数据推算地表温度的过程&#xff0c;其原理基于地物表面的辐射特征与温度之间的关系。本文将介…

Github2024-04-25 开源项目日报Top10

根据Github Trendings的统计,今日(2024-04-25统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4非开发语言项目2TypeScript项目2PowerShell项目1C++项目1Dart项目1JavaScript项目1GPT4All: 在边缘运行开源大型语言模型 创建周期:…

C++:拷贝构造函数的初始化列表

拷贝构造函数的初始化列表是在拷贝构造函数的定义中出现的一组初始值&#xff0c;用于初始化新创建的对象的成员变量。它的语法是在构造函数的声明后面使用冒号&#xff08;:&#xff09;来开头&#xff0c;然后列出要初始化的成员变量和它们的初始值。初始化列表的优点在于它允…

从国内盲盒小程序看国外市场的发展机遇与挑战

近年来&#xff0c;盲盒小程序在国内市场迅速崛起&#xff0c;凭借其独特的营销模式和消费者体验&#xff0c;赢得了大量年轻消费者的喜爱。从国内盲盒小程序的发展中&#xff0c;我们可以窥见国外市场的一些发展机遇与挑战&#xff0c;为进军国际市场提供有益的参考。 首先&a…

[Swift]单元测试

编写单元测试是确保你的代码质量和功能正确性的重要步骤 一、编写单元测试的详细流程 1. 创建一个新的Xcode项目 如果你尚未创建一个项目&#xff0c;首先你需要在Xcode中创建一个新的iOS项目&#xff1a; 打开Xcode&#xff0c;选择“File” > “New” > “Project”…