STM32F10x_ADC三通道DMA连续转换(3通道、软件单次触发)

Ⅰ、概述

上一篇文章讲述的内容是:三通道逐次转换(单次、单通道软件触发),也就是说3条通道要三次软件触发才能完成转换,而且是通过软件读取转换数值。

本文讲述三通道DMA连续转换(3通道、软件单次触发),也就是说3条通道只需要一次软件触发就能完成转换,使用DMA保存在数值。

上一篇文章实例是使用间断模式单次触发单条通道采集,本文是使用DMA模式单次触发三条通道采集。使用DMA传输的好处就是效率很高,我们直接读取转换的结果就是了,比如想做的示波器实例就是要求效率很高。

实例实验效果:

本文的实验效果和上一篇文章一样,只是实现的方式不一样

通道1接地、通道2接1.5V电源、通道3接VCC

上一篇文章内容:

ADC三通道逐次转换(单次、单通道软件触发)

本文讲述的知识点相对较多,若初次学习STM32的ADC转换功能,可以参考我另外一篇相对简单一点的文章:

STM32F10x_ADC1单通道单次采集

关于本文的更多详情请往下看。

Ⅱ、实例工程下载

笔者针对于初学者提供的例程都是去掉了许多不必要的功能,精简了官方的代码,对初学者一看就明白,以简单明了的工程供大家学习。

笔者提供的实例工程都是在板子上经过多次测试并没有问题才上传至360云盘,欢迎下载测试、参照学习。

提供下载的软件工程是基于Keil(MDK-ARM) V5版本、STM32F103ZE芯片,但F1其他型号也适用(适用F1其他型号: 关注微信,回复“修改型号”)。

STM32F10x_ADC三通道DMA连续转换(3通道、软件单次触发)实例源代码工程:

https://yunpan.cn/cBCmnZ58mI3Pp  访问密码

STM32F1资料:

https://yunpan.cn/crBUdUGdYKam2  访问密码 ca90

Ⅲ、关于ADC

关于ADC的介绍及功能,请下载参考手册查看,笔者这里讲述几点重要的知识:

1.12位分辨率

在STM32所有系列芯片中只有少部分是16位的,如:F373芯片。

12位分辨率意味着我们采集电压的精度可以达到:Vref /4096。

采集电压 = Vref * ADC_DR / 4096;

Vref:参考电压

ADC_DR:读取到ADC数据寄存器的值

由于寄存器是32位的,在配置的时候分左对齐和右对齐,一般我们使用右对齐,也就是对低12位数据为有效数据。

2.转换模式

A.单次和连续转换

单次:单通道单次转换、多通道单次(分多次)转换;

连续:单通道连续转换、多通道连续(循环)转换;

B.双ADC模式

也就是使用到了两个ADC,比如:ADC1和ADC2同时使用也就是双ADC模式。在该模式下可以配置为如下一些模式:同步规则模式、同步注入模式、独立模式等。

3.触发源

触发源就是触发ADC转换的来源,有外部中断线、定时器、软件等触发源。我们初学者常用软件触发,也就是需要转换一次,我们软件启动一次(本文提供实例也是软件触发)

 

 

Ⅳ、本文实例描述

本文实例中关于ADC部分的配置及知识点,针对初学者相对比较多、理解起来也相对比较难一点。

根据题目“ADC三通道逐次转换(单次、单通道软件触发)”我们不难理解其转换的过程,但如何实现是一个难点。

1、三通道:我们定义了3条通道ADC1的ADC_Channel_1、ADC_Channel_2、ADC_Channel_3.

2.逐次转换:我们使用的是间断模式(规则组),也就是在规则组中定义了触发转换的序列。

3.单次:我们是每触发一次转换一次。

4.单通道:每次触发只转换一条通道。

以简单的示意图来说明其原理

实例总共有三条通道通道1、通道2、通道3,分别对应顺序,是1、2、3。我们是通过软件来定义的顺序:

ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_55Cycles5);

所以,我们转换保存的顺序:ADC_Buf[0]是通道1的数据、ADC_Buf[1]是通道2的数据、ADC_Buf[2]是通道3的数据

也是按照上面来的。当然,也可以更改顺序。

Ⅴ、源代码分析

笔者以F1标准外设库(同时也建议初学者使用官方的标准外设库)为基础建立的工程,主要以库的方式来讲述(若您的F1芯片与提供工程不一样,可微信回复“修改型号”)。

下面将讲述ADC重要的几点:

1.输入引脚配置

该函数位于adc.c文件下面;

引脚与通道的对应关系请参看你使用芯片的数据手册

注意:

为什么是“ADC123_IN1”? 而不是ADC1_IN1,或者ADC2_IN1?

原因是ADC1、ADC2和ADC3共用这些引脚。

2. DMA配置

该函数位于adc.c文件下面;

1.外设地址:DMA_PeripheralBaseAddr = (uint32_t)(&(ADC1->DR));

我们使用ADC数据寄存器地址作为DMA的外设地址;

2.内存地址:DMA_MemoryBaseAddr = (uint32_t)ADC_Buf;

这里就是我们定义保存采集值数组的地址;

3.传输方向:DMA_DIR = DMA_DIR_PeripheralSRC;

DMA_DIR_PeripheralSRC:外设 -> 内存

DMA_DIR_PeripheralDST:内存 -> 外设

4.传输长度:DMA_BufferSize = ADC_BUF_SIZE;

ADC_BUF_SIZE是一个宏定义,等于3; 也就是说我们需要转换并保存3组数据(3条通道的值)。

5.外设地址增长:DMA_PeripheralInc = DMA_PeripheralInc_Disable;

由于外设的地址都是ADC数据寄存器,没有改变,所以不需要增长地址;

6.内存地址增长:DMA_MemoryInc = DMA_MemoryInc_Enable;

由于我们定义了一个数字,里面需要保存3个数值,所以需要增长;

【根据传输长度循环模式,可以循环传输数据】

7.外设数据长度:DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

DMA_PeripheralDataSize_Byte:8位数据

DMA_PeripheralDataSize_HalfWord:16位数据

DMA_PeripheralDataSize_Word:32位数据

由于我们使用16位的数据,所以使用DMA_PeripheralDataSize_HalfWord;

8.内存数据长度:DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

和“外设数据长度”类似;

9.循环模式:DMA_Mode = DMA_Mode_Circular;

这里说的循环就是我们循环采集3组数据(更加传输长度来确定);

10.优先级:DMA_Priority = DMA_Priority_VeryHigh;

优先级应该都明白他的意思,我们只使用一组DMA这个优先级可高可低;

11.优先级:DMA_M2M = DMA_M2M_Disable;

内存传输到内存:否

注意

为什么我们是使用DMA1_Channel1?

我们使用DMA通道是有要求的,需按照手册提供的规则来(如下图);请参看手册:

3. ADC配置

该函数位于adc.c文件下面;

这个函数是本文的重点,下面依次来讲述源代码内容的意思;

A.初始化基本参数:

工作模式:ADC_Mode = ADC_Mode_Independent;

总共有10种,主要都是针对双ADC下使用。针对初学者这里不多描述,感兴趣的朋友可以先自行研究一下各个模式的使用。

浏览模式:ADC_ScanConvMode = ENABLE;

主要是针对多条通道而言,也就是说你是否有多条通道。

多通道:ENABLE;

单通道:DISABLE;

转换模式:ADC_ContinuousConvMode = DISABLE;

这里是配置是否需要连续转换。

连续转换ENABLE:也就是只需要启动(触发)转换一次,后面就不用再次启动(触发)就可以连续工作了。

单次转换DISABLE:也就是根据一次转换完后需要再次启动(触发)才能工作。

触发方式:ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

触发方式也就是使用什么方法触发ADC转换。哟定时器、外部触发、软件触发,一般常用软件触发。这里有很多种触发方式,详情可以参考其参数。

对其方式:ADC_DataAlign = ADC_DataAlign_Right;

右对其:低12位数据为有效位(常用);

左对其:高12为数据为有效位;

通道数:ADC_NbrOfChannel = 3;

这个参数比较简单,我们定义工作的通道数量。

B.设置规则组通道:

ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_55Cycles5);

我们定义通道1的转换顺序为第1、通道2的转换顺序为第2、通道3的转换顺序为第3;

C.校验:

ADC_ResetCalibration(ADC1);                    //校验复位

while(ADC_GetResetCalibrationStatus(ADC1));    //等待复位完成

ADC_StartCalibration(ADC1);                    //开始ADC1校准

while(ADC_GetCalibrationStatus(ADC1));         //等待校验完成

建议每次上电校正一次。

ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。在校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差。

Ⅵ、说明

关于STM32的ADC转换这一块功能确实交强大也相对来说比较复杂,或许文中讲述的还不够清楚,若有不清楚的可以关注微信,在微信上留言。

关于笔者提供的软件工程实例,可关注微信,在会话框回复“关于工程”,有关于工程结构描述、型号修改等讲述。

以上总结仅供参考,若有不对之处,敬请谅解。

Ⅶ、最后

更多精彩文章我将第一时间在微信公众号里面分享,该文有什么疑问可留言。

本着免费分享的原则,方便大家手机学习知识,定期在微信平台分享技术知识。如果你觉得分享的内容对你有用,又想了解更多相关的文章,请用微信搜索“EmbeddDeveloper” 或者扫描下面二维码、关注,将有更多精彩内容等着你。

时间: 2024-10-15 06:06:42

STM32F10x_ADC三通道DMA连续转换(3通道、软件单次触发)的相关文章

STM32F10x_ADC三通道逐次转换(单次、单通道软件触发)

Ⅰ.概述 本文讲述关于STM32功能比较强大的ADC模块.ADC(Analog to Digital Converter)也就是模拟量转化为数字量,而STM32的ADC模块功能比较多,本文主要讲述"三条通道逐次转换(单次.单通道软件触发)". 根据笔者的经验,STM32所有系列芯片的ADC模块功能及配置都差不多.因此,本文虽是以F1为例,其实其他系列(F0.F2.F4等)都适用. 本文提供实例代码:三条通道,配置为逐次转换(间隔模式),适用软件触发转换(每触发一次转换一条通道),一个循

STM32 ADC1单通道连续转换,转换数据通过DMA传输给USART1数据寄存器并发送

ADC单通道连续采集数据,通过DMA传输给串口发送给上位机.使用DMA传输即可让数据绕开CPU,数据不需要进出SRAM.DMA控制器使用系统总线,直接将ADC数据寄存器的数据传输给串口发送数据寄存器,对串口发送数据寄存器的写操作将触发串口传输,从而将数据发送给上位机.在DMA传输过程中,CPU可以进行其他操作,DMA与CPU分时使用系统总线. 为了让ADC1转换与串口发送同步,将DMA传输模式设置为常规(一次传输),即完成指定数量数据的传输后,DMA将自动关闭,而不再响应DMA请求(当传输模式为

STM32F207 两路ADC连续转换及GPIO模拟I2C给Camera Sensor初始化参数

1.为了更好的方便调试,串口必须要有的,主要打印一些信息,当前时钟.转换后的电压值和I2C读出的数据. 2.通过GPIO 模拟I2C对镁光的MT9V024进行参数初始化.之前用我以前公司SP0A19芯片,是I2C是8位宽的,而镁光的地址是8位,而数据位是16个字节, 其实不管是8位还是16位,每次发送都是8个字节然后一个应答位,所以只要稍微改下代码即可. 3.实现两路ADC连续转换,两路ADC转换:一路是检测锂电池电压:一路是检测压力传感器,其实都是检测电压,当检测到压力为零,并累计多长时间后进

动态规划题目(三)——最大连续乘积子串

动态规划题目(三)--最大连续乘积子串 1. 题目描述 给一个浮点数序列,取最大乘积连续子串的值,例如 -2.5,4,0,3,0.5,8,-1,则取出的最大乘积连续子串为3,0.5,8.也就是说,上述数组中,3 0.5 8这3个数的乘积30.58=12是最大的,而且是连续的. 2. 动态规划求解 动态规划求解题目的时候最重要的是要找到状态转移方程! 针对这道题目,我们使用两个变量记录当前最大值maxEnd, 和当前最小值minEnd.为什么记录当前最小值呢?因为数组中会出现负数,乘以一个负数的话

把ppt转换成pdf软件

把ppt转换成pdf软件 如何将PDF.PPT等转换成PDF格式的文档,方法虽然很多但能够保质保量的实现文档转换的专门的转换软件并不多,利用迅捷PPT转换成PDF转换器就可实现PPT多文档转换,转换速度也很快,本经验就是根据自己的实践携程的,本章以PPT转PDF为例,全程为大家解析软件的操作流程. 一.准备工作,勾选需要转换的目标文件格式:PPT转PDF 二.执行“转换向导”,添加需要转换的PPT文件 三.最后只需要点击“开始转换”即可完成最终的文件转换功能. 将PPT转换成PDF的优点是显而易

关于电子书下载源、转换、阅读软件、个人图书馆的建立

深夜学堂2018/10/09 共学关于电子书下载源.转换.阅读软件.个人图书馆的建立 作者:沉默的大多数&深夜学堂全体同学 [引言]为什么要和大家一起学这个? 开始看到群内经常有同学求网上很容易找到的“得到书,多少会有些气愤:这些书这么容易找到,为什么还要占用别人的时间再发给你?后来反思,很多同学是因为“找书无方”,不知道在哪里找.所以今天,有我和大家一起探讨一下关于电子书的方方面面.最终我会整理一份完整的文稿发给在群和不在群的所有人. ” 一.电子书的下载 1.1关于下载电子书的网站和app

扫描ppt转换成pdf软件

扫描ppt转换成pdf软件目前,许多信息资料需要转化成电子文档以便于各种应用及管理,但因信息数字化处理的方式落后,不但费时费力,而且资金耗费巨大,造成了大量文档资料的积压,因此急需一种快速高效的软件系统来满足这种海量录入需求.迅捷ppt转换成pdf转换器软件系统正是适用于个人.小型图书馆.小型档案馆.小型企业进行大规模文档输入.图书翻印.大量资料电子化的软件系统. 专业的计算机公司团队为帮助办公人员更好的解决文档格式转换的问题,也是推出了多款软件.其中最有口碑的就是ppt转换成pdf转换器201

怎么将ppt转换成pdf软件

怎么将ppt转换成pdf软件是否使用过PPT的用户看到别人有做得非常好的PPT自己也想拷贝一份留下来?那么,笔者向你推荐迅捷PPT转换成PDF转换器来转换你的PPT格式文档,使它变得容量更小的PDF文件供你在在上传至网上或保存在电脑里面,让你远方份亲朋好友都能欣赏到你的作品. 下载安装好PPT转换PDF软件之后,进入页面,勾选“PPT转PDF”转换模式,然后可将制作好的PPT演示文稿上传到软件界面上,点击一键转换,即可实现完美的转换效果. 从PPT转PDF文件的实际效果和质量来看,当前最新发布升

UI标签库专题三:JEECG智能开发平台 FormValidation(表单提交及验证标签)

?? 1. FormValidation(表单提交及验证标签) 1.1.  参数 属性名 类型 描述 是否必须 默认值 action string 表单提交路径 否 null formid string 表单唯一标示 是 formobj refresh boolean dialog为true时是否刷新父页面 否 true callback string 表单提交完成后的回调函数 否 null beforeSubmit string 表单提交前的处理函数 否 null btnsub string