AD717X 驱动框架,连续读双通道ADC数据;AD7172等

目录

概要

整体架构流程

技术名词解释

使用方法:

小结


概要

        验证方案时用到了AD7172芯片,24位AD,分辨率是真的高,无敌。但是前级放大电路不给力,所以放弃这版方案了。代码贴出来供大家参考,写的一般如果有错误轻点喷,谢谢。

PS:整体代码是根据ADI给的代码改写的

整体架构流程

为了更好的移植性,以及复用代码。先写框架,然后通过注册函数的方式实例化对象,通过对象调用设备(简单说就是结构体,函数指针)。

       文件构成:

        ad717x_Frame.cad717x_Frame.h【框架文件 里面有PAD7172_Struct结构体】

        ad7172_2_regs.h【AD7172的寄存器定义文件】

        Ad7172Spi.cAd7172Spi.h硬件层、和MCU相关的文件、移植只需要重写这个文件】

        AD7172Config.cAD7172Config.h【实例化文件、配置PAD7172_Struct结构体、链接硬件和框架】

主要寄存器

        .....手册是中文的自己看吧,配合代码不难

使用方法:

AD7172Config.c【实例化文件】 在这里写一下主要配置参数

void AD7172ParmInit(void){gAd7172.regs = ad7172_2_regs;gAd7172.num_regs = sizeof(ad7176_2_regs) / sizeof(ad7176_2_regs[0]);gAd7172.active_device = ID_AD7172_2;gAd7172.num_channels = 2;// 转化模式设置gAd7172.mode = CONTINUOUS;// 设置极性 false 为单极性 Ture 为双极性gAd7172.setups[0].bi_unipolar = 0;gAd7172.setups[1].bi_unipolar = 0;// 设置参考源gAd7172.setups[0].ref_source = EXTERNAL_REF;gAd7172.setups[1].ref_source = EXTERNAL_REF;// 设置buff 7172不需要// gAd7172.setups[0].ref_buff = 0;// gAd7172.setups[0].input_buff = 0;// 设置 滤波和速率// gAd7172.filter_configuration[0].enhfilt// 输出速率gAd7172.filter_configuration[0].odr = sps_100;gAd7172.filter_configuration[1].odr = sps_100;// 设置通道映射寄存器 选择当前有效的通道、各通道使用哪些输入以及该通道使用何种设置来配置ADC。gAd7172.chan_map[0].analog_inputs.ainp.pos_analog_input = AIN0;gAd7172.chan_map[0].analog_inputs.ainp.neg_analog_input = REF_M;gAd7172.chan_map[1].analog_inputs.ainp.pos_analog_input = AIN1;gAd7172.chan_map[1].analog_inputs.ainp.neg_analog_input = REF_M;// 使用四种设置中的哪一种来配置ADC。设置由四个寄存器组成:设置配置寄存器、滤波器配置寄存器、失调寄存器和增益寄存器。gAd7172.chan_map[0].setup_sel = 0;gAd7172.chan_map[1].setup_sel = 0;//  1为开 0为关闭gAd7172.chan_map[0].channel_enable = 1;gAd7172.chan_map[1].channel_enable = 1;gAd7172.spi_write_and_read = stm32_spi_write_and_read;gAd7172.SetCsPin = SetAD7172CsPin;gAd7172.spi_receive = stm32_spi_receive;gAd7172.GetDinPin = spi_miso_input;AD717X_Init(&gAd7172);}

然后通过后台Loop循环调用下面函数即可工作(连续读取)

/*************************************************************
** Function name:       AD7176Loop
** Descriptions:        读取ADC数据的主循环函数 需要根据ADC的配置来 循环调用
** Input parameters:    None
** Output parameters:   None
** Returned value:      None
** Remarks:             None
*************************************************************/
void AD7176Loop(void){AD717X_OnlyRead32(&gAd7172);Var_WriteHoldReg32(&gdev_ADC0, gAd7172.adcValue[0]);Var_WriteHoldReg32(&gdev_ADC1, gAd7172.adcValue[1]);
}/*************************************************************
** Function name:       GetAD7176ADCChannel
** Descriptions:        提供ADC数据的接口
** Input parameters:    channel: 要获取的通道 0:ADC0 1:ADC1 2:ADC2 3:ADC
** Output parameters:   None
** Returned value:      None
** Remarks:             None
*************************************************************/
int32_t GetAD7176ADCChannel(uint8_t channel){return AD717X_GetChannelValue(&gAd7172, channel);
}

硬件层:

如果你使用的是STM32 HAL库,基本上不需要改变

/*************************************************************
** Function name:       SetAD7172CsPin
** Descriptions:        操作AD7172的片选引脚
** Input parameters:    None
** Output parameters:   None
** Returned value:      None
** Remarks:             None
*************************************************************/
void SetAD7172CsPin(uint8_t state){HAL_GPIO_WritePin(AD_CS_GPIO_Port,AD_CS_Pin,(GPIO_PinState )state);
}/*** @brief Write/read multiple messages to/from SPI.* @param desc - The SPI descriptor.* @param msgs - The messages array.* @param len - Number of messages.* @return 0 in case of success, errno codes otherwise.*/
int32_t stm32_spi_transfer(struct no_os_spi_msg *msgs, uint32_t len)
{for (uint32_t i = 0; i < len; i++) {// CS 拉低// gdesc->port->BSRR = NO_OS_BIT(sdesc->chip_select->number) << 16;SetAD7172CsPin(0);// 如果CS拉低之后需要延迟 则delayif(msgs[i].cs_delay_first){// no_os_udelay(msgs[i].cs_delay_first);}HAL_SPI_TransmitReceive(&hspi1, msgs[i].tx_buff, msgs[i].rx_buff, msgs[i].bytes_number, AD7172SPI_TIMEOUT_MS);if(msgs[i].cs_delay_last){// no_os_udelay(msgs[i].cs_delay_last);}if (msgs[i].cs_change){/* De-assert CS */// gdesc->port->BSRR = NO_OS_BIT(sdesc->chip_select->number);SetAD7172CsPin(1);}if(msgs[i].cs_change_delay){// no_os_udelay(msgs[i].cs_change_delay);}}return 0;
}int32_t stm32_spi_write_and_read(uint8_t *data, uint16_t bytes_number)
{struct no_os_spi_msg msg = {.bytes_number = bytes_number,.cs_change = true,.rx_buff = data,.tx_buff = data,};if (!bytes_number)return 0;return stm32_spi_transfer(&msg, 1);
}int32_t stm32_spi_receive(uint8_t *data, uint16_t bytes_number){struct no_os_spi_msg msg = {.bytes_number = bytes_number,.cs_change = true,.rx_buff = data,.tx_buff = data,};if (!bytes_number)return 0;HAL_SPI_Receive(&hspi1, msg.rx_buff, msg.bytes_number, AD7172SPI_TIMEOUT_MS);return 0;
}// SPI 的 MISO信号引脚 读取功能
uint8_t spi_miso_input(void){return (uint8_t)HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6);
}

 

小结

完整代码放CSDN可以下载。

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

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

相关文章

Vue 3:玩一下web前端技术(五)

前言 本章内容为VUE语法的简单学习与相关语法讨论。 上一篇文章地址&#xff1a; Vue 3&#xff1a;玩一下web前端技术&#xff08;四&#xff09;_Lion King的博客-CSDN博客 下一篇文章地址&#xff1a; &#xff08;暂无&#xff09; 一、语法的简单学习 1、导入模块 …

博客摘录「 Redis( 缓存篇 ==> 超详细的缓存介绍与数据一致性解决方案 amp; 代码实现」

Redis 旁路缓存 由于高并发原因&#xff0c;先更新数据库和先更新缓存策略都会因为延迟时间而导致数据不一致问题。 两种策略 先删除缓存&#xff0c;再更新数据库&#xff1b;先更新数据库&#xff0c;再删除缓存。 因为缓存的写入通常要远远快于数据库的写入&#xff0c;…

谈谈你对Synchronized关键字的理解及使用

synchronized关键字最主要的三种使用方式的总结 修饰实例方法&#xff0c;作用于当前对象实例加锁&#xff0c;进入同步代码前要获得当前对象实例的锁修饰静态方法&#xff0c;作用于当前类对象加锁&#xff0c;进入同步代码前要获得当前类对象的锁 。也就是给当前类加锁&…

React的hooks---useRef

useRef 用于返回一个可变的 ref 对象&#xff0c;其 .current 属性被初始化为传入的参数&#xff08;initialValue&#xff09; useRef 创建的 ref 对象就是一个普通的 JavaScript 对象&#xff0c;而 useRef() 和自建一个 {current: ...} 对象的唯一区别是&#xff0c;useRef…

centos7安装tomcat

安装tomcat 必须依赖 JDK 环境&#xff0c;一定要提前装好JDK保证可以使用 一、下载安装包 到官网下载 上传到linux 服务器 二、安装tomcat 创建tomcat 文件夹 mkdir -p /usr/local/tomcat设置文件夹权限 chmod 757 tomcat将安装包上传至 新建文件夹 解压安装包 tar zx…

自动驾驶之轨迹规划8——Apollo参考线和轨迹

1. abstract 本文主要讲解routing和planning模块中的reference line&#xff0c;我之前一直搞不明白这个reference line是如何生成的&#xff0c;有什么作用&#xff0c;和routing以及planning的关系。现在有了一些心得打算梳理一下&#xff1a; 决策规划模块负责生成车辆的行…

浅谈3D隐式表示(SDF,Occupancy field,NeRF)

本篇文章介绍了符号距离函数Signed Distance Funciton(SDF)&#xff0c;占用场Occupancy Field&#xff0c;神经辐射场Neural Radiance Field&#xff08;NeRF&#xff09;的概念、联系与区别。 显式表示与隐式表示 三维空间的表示形式可以分为显式和隐式。 比较常用的显式表…

STM32 串口基础知识学习

串行/并行通信 串行通信&#xff1a;数据逐位按顺序依次传输。 并行通信&#xff1a;数据各位通过多条线同时传输。 对比 传输速率&#xff1a;串行通信较低&#xff0c;并行通信较高。抗干扰能力&#xff1a;串行通信较强&#xff0c;并行通信较弱。通信距离&#xff1a;串…

区间预测 | MATLAB实现QRLSTM长短期记忆神经网络分位数回归多输入单输出区间预测

区间预测 | MATLAB实现QRLSTM长短期记忆神经网络分位数回归多输入单输出区间预测 目录 区间预测 | MATLAB实现QRLSTM长短期记忆神经网络分位数回归多输入单输出区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 MATLAB实现QRLSTM长短期记忆神经网络分位数回…

PTA 1043 Is It a Binary Search Tree

个人学习记录&#xff0c;代码难免不尽人意。 A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains only nodes with keys less than the node’s key. The right subtree of a no…

在CSDN学Golang云原生(Kubernetes二开)

一&#xff0c;通过client-go管理集群资源 Kubernetes提供了client-go库&#xff0c;该库可以让开发人员使用Golang编写的应用程序与Kubernetes API进行交互。通过client-go&#xff0c;你可以创建、更新和删除Kubernetes资源&#xff0c;并查询集群状态等信息。 以下是一个示…

计算机科学cs/电子信息ei面试准备——数学基础/线性代数复习

1. 中值定理 中值定理是反映函数与导数之间联系的重要定理&#xff0c;也是微积分学的理论基础&#xff0c;在许多方面它都有重要的作用&#xff0c;在进行一些公式推导与定理证明中都有很多应用。中值定理是由众多定理共同构建的&#xff0c;其中拉格朗日中值定理是核心&…

【Linux命令200例】less强大的文件内容查看工具

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜活的实操案例对各个命令进行深入…

最优除法(力扣)数学 JAVA

给定一正整数数组 nums&#xff0c;nums 中的相邻整数将进行浮点除法。例如&#xff0c; [2,3,4] -> 2 / 3 / 4 。 例如&#xff0c;nums [2,3,4]&#xff0c;我们将求表达式的值 “2/3/4”。 但是&#xff0c;你可以在任意位置添加任意数目的括号&#xff0c;来改变算数的…

苍穹外卖day07——缓存菜品套餐+购物车功能实现

缓存菜品——需求设计与分析 问题说明 用户访问量过大带来的一个直接效果就是响应速度慢&#xff0c;使用体验下降。 实现思路 使用redis缓存菜品数据&#xff0c;减少数据库查询操作。 页面展示上基本就是同一个分类在同一页&#xff0c;所以key-value结构可以使用不同的分…

HTTP改HTTPS

tomcat中http协议改https 第一步&#xff0c;配置server.xml <?xml version"1.0" encoding"UTF-8"?> <Server port"8005" shutdown"SHUTDOWN"><Listener className"org.apache.catalina.startup.VersionLogger…

【Git】版本回退与撤销修改案例

目录 一、版本回退 二、撤销修改案例 案例1&#xff1a;仅在工作区进行了修改还未进行add操作 案例2&#xff1a;仅进行了add 操作还未进行commit操作 案例3&#xff1a;进行了add与commit操作无其他操作 三、版本库中删除文件 一、版本回退 在进行版本回退之前我们需要…

Excel的使用

1.EXCEL诞生的意义 1.1 找到想要的数据 1.2 提升输入速度 2.数据分析与可视化操作 目的是提升数据的价值和意义 3.EXCEL使用的内在意义和外在形式 4.EXCEL的价值 4.1 解读及挖掘数据价值 4.2 协作板块 4.3 展示专业度 4.4 共享文档内容 5.人的需求》》软件功能

出现 Try run Maven import with -U flag (force update snapshots) 的解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 在配置Maven依赖信息的时候,出现如下问题: com.alibaba.nacos:nacos‐client:pom:1.1.3 failed to transfer from http://nexus.hepengju.cn:8081/nexus/content/groups/public/ during a previous attempt. This failu…

【UE4】局域网多人联机 Demo

效果 亲测可以打包后在两个电脑上联机运行&#xff08;前提是在同一个局域网内&#xff0c;互相能ping通&#xff09; 步骤 1. 首先新建一个第三人称角色模板工程 2. 在多玩家选项中&#xff0c;设置玩家数量为2 选择在新建编辑器窗口中运行 3. 新建一个父类为Character的蓝…