首页 > 其他分享 >第十六届蓝桥杯嵌入式赛道备赛---ADC+DMA多通道读取(日志四)

第十六届蓝桥杯嵌入式赛道备赛---ADC+DMA多通道读取(日志四)

时间:2024-11-16 16:17:58浏览次数:3  
标签:赛道 --- DMA void 蓝桥 LCD ADC Data uint32

前言

        ADC转换是一个比较简单的模块,但是其中有很多的细节问题需要处理到,这些问题也是我在写程序的时候遇到的。如果是用ADC+DMA,或者是ADC多通道,这些问题相信你也会遇到,接下来将详细展开讨论。

        先来看一下开发板中为我们准备的对应资源---电位器。两个的变化范围都是0~3.3v。

        其实在另外一个模块中隐藏了一个特殊的电位器。在这个可编程电阻(MCP4017)的W引脚上的位置接入PB14,而PB14刚好有ADC1_IN5的资源,而且它的电阻可变,所以这一点的电位是可以改变的,我们就可以用ADC读取这一点的电位值,到时候可以进行相应的定量计算。

HAL库配置

        我的配置以方便写程序出发用的是ADC+DMA的组合,其中包含了单通道(ADC2),还有多通道(ADC1)。

ADC配置

ADC1---有两个通道,对应的引脚如下

先去开启DMA

再回到具体的配置界面

ADC2的配置也是如此,同样记得开启DMA,采样周期也设置成对应的。接下来说说几个我遇到的问题。

ADC问题解析

开启DMA中断导致程序卡死:

        在NVIC中查看,DMA的中断是默认开启并且是灰色不可修改的状态。在我自己的程序设计中我并没有用上DMA中断,所以我是关闭的。它造成程序卡死的原因是,ADC开启了连续转换,DMA也设置为软件触发(Circular),所以DMA是一直在快速的不停的调用,这就导致程序在运行的时候会频繁的进入DMA的中断程序,实际上就只是在执行DMA的中断程序,没有执行main函数中的内容,就出现了程序卡死的现象。

        解决办法有二:其一就是直接关闭DMA的这个两个中断;其二就是更改采样时间,经过我的测试,对于这个型号的芯片,采样时间至少要设置为247.5Cycles程序就会正常,但是这样设置有个弊端,就是如果你在程序中使用了LCD的显示函数,你会发现启动程序的时候LCD的屏幕是慢慢刷新出来的,说明DMA还是在频繁进入中断,只不过是因为ADC的采样周期设置长了点有了一定的缓冲,使得DMA进入中断的时间间隔拉长了,这个办法我认为没必要采用。

采样周期至少要为6.5Cycles:

        这个设置只是我在实际操作的时候发现的,你们要是也出现这种情况就也可以这样设置来修正,有更长的采样周期这个数值就越精确,没什么负面影响。

        如果用的是默认的最短的采样周期,我在旋转R37电位器的时候,R38电位器的值有微小的改变,理论上来说他们应该是互相独立的,我R37的改变不应该会改变R38的值。既然二者会互相干扰,那我们就设置更长的采样周期来保证读取数据的精确,来修正这个干扰因素。

ADC数值的存储要用uint16_t而不是uint32_t:

        首先我们要知道,ADC的数据范围是0~4095,即它是一个12位的数据,理论上来说按照数据位的对齐,只要有一个合理的数据大小,ADC的值都可以用它们来存储。如果ADC的值较小,就算用uint8_t来存储都没问题,用uint32_t来存储,多余的数据位就会补0,也不会有什么影响。前面所描述的情况都是在ADC单通道转换的情况下,这样的设置都不会有问题,如果是多通道,我们就用数组来存储,但这个数组要设置为存储多大的数据位才行呢。

        我的这个BUG就出现在了使用DMA进行ADC多通道读取数据,使用的是这个函数

HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef *hadc, uint32_t *pData, uint32_t Length)

其中出问题就出在 uint32_t *pData,这个指针参数。由于它使用的是uint32_t的数据类型,我就定义了 uint32_t ADC_Data[2],这样一个数组,结果在实操的时候显示出来的ADC的数据非常的奇怪,具体表现在一个通道 ADC_Data[0]的值是一个远远大于4095的数字,超过了它的最大范围,ADC_Data[1]就没有值一直显示为0。最后我把数组的数据类型修改为uint16_t,在传参的时候把数据类型强转为uint32_t就可以正常显示了。后来我又去查找ADC数据位对齐的资料,最后从学姐那得到了具体的解答。(向学姐致敬

标签:赛道,---,DMA,void,蓝桥,LCD,ADC,Data,uint32
From: https://blog.csdn.net/aldrich_131/article/details/143817379

相关文章

  • 【大语言模型】ACL2024论文-12 大型语言模型的能力如何受到监督式微调数据组成影响
    【大语言模型】ACL2024论文-12大型语言模型的能力如何受到监督式微调数据组成影响论文:https://arxiv.org/pdf/2310.05492目录文章目录【大语言模型】ACL2024论文-12大型语言模型的能力如何受到监督式微调数据组成影响论文:https://arxiv.org/pdf/2310.05492![在这......
  • 南开高级语言程序设计2-1
    南开高级语言程序设计2-1的oj题目答案,本人亲测AC,供大家参考。2-2的见主页字符串旋转题目描述定义字符串的旋转操作为:左旋转L:把字符串前面的若干个字符移动到字符串的尾部,如把字符串abcdef左旋转2位得到字符串cdefab。右旋转R:把字符串后面的若干个字符移动到字符串的头......
  • KBPC3510-ASEMI整流桥KBPC3510参数、封装、尺寸
    编辑:llKBPC3510-ASEMI整流桥KBPC3510参数、封装、尺寸型号:KBPC3510品牌:ASEMI封装:KBPC-4正向电流:35A反向电压:1000V引脚数量:4芯片个数:4芯片尺寸:50MIL漏电流:>10ua恢复时间:>2000ns浪涌电流:400A芯片材质:GPP硅芯片正向电压:1.10V封装尺寸:如图特性:整流桥、插件桥堆工作结......
  • 一文讲透 FPGA CDC 多bit跨时钟域同步-hand-shanking机制
    一、背景数据的跨时钟域处理是FPGA开发过程中的常见问题,存在两种情况慢时钟向快时钟同步:只需在快时钟域打两拍即可。其RTL如下:打拍同步的原理:大家在初学FPGA时,经常听过FPGA中对信号打拍可以有效得避免亚稳态,而且一般要打两拍,其数学本质是如果打一拍发生错误得概率是1/1000......
  • C. Penchick and BBQ Buns (python解)-codeforces
    C.PenchickandBBQBuns(python解)-codeforces原题链接:点击传送问题分析:我们需要为给定数量的BBQ包子分配填料,满足以下条件:每种填料必须至少使用两次,或者不使用。任何两个相同填料的包子之间的距离必须是一个完全平方数。思路:为了满足条件,我们可以利用完全平方数的......
  • 2024-11-16:哈沙德数。用go语言,如果一个整数能够被它的各个数位上数字的和整除, 我们称
    2024-11-16:哈沙德数。用go语言,如果一个整数能够被它的各个数位上数字的和整除,我们称这个整数为哈沙德数(Harshadnumber)。给定一个整数x,如果x是哈沙德数,则返回x各个数位的数字和;如果不是,则返回-1。输入:x=18。输出:9。解释:x各个数位上的数字之和为9。18能被9......
  • Java-面向对象(下)
    下面让我们继续学习面向对象类的继承在现有类的基础上去构建一个新的类。现有类叫做基类(baseclass)、超类(superclass)新的类叫做派生类(derivedclass)、子类(孩子类)(childclass)如果一个类想要继承另外一个类,需要用到extends关键字。class基类{}class子类extends......
  • 20222406 2024-2025-1 《网络与系统攻防技术》实验五实验报告
    202224062024-2025-1《网络与系统攻防技术》实验五实验报告1.实验内容对网站进行DNS域名查询,包括注册人、IP地址等信息,还通过相关命令查询IP地址注册人及地理位置。尝试获取QQ好友IP地址并查询其地理位置。使用nmap对靶机环境扫描,获取靶机IP活跃状态、开......
  • 6-tree
    树基本概念树的基本概念树:nnn个结点的有限集(树是一种递归的数据结构,适合于表示具有层次的数据结构)。是递归定义的。根结点:只有子结点没有父结点的结点。除......
  • 20222310 2024-2025-1 《网络与系统攻防技术》实验六实验报告
    一、实验内容学习掌握Metasploit工具的使用。下载靶机Metasploitable2,完成以下实验内容。1.前期渗透(1)主机发现(可用Aux中的arp_sweep,search一下就可以use)(2)端口扫描(可以直接用nmap,也可以用Aux中的portscan/tcp等)(3)扫描系统版本,漏洞等2.Vsftpd源码包后门漏洞(21端口)3.SambaMS-R......