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

发布者:Qingfang最新更新时间:2017-02-05 来源: eefocus关键字:STM32F10x  ADC  三通道  DMA  连续转换 手机看文章 扫描二维码
随时随地手机看文章

Ⅰ、概述

上一篇文章讲述的内容是:三通道逐次转换(单次、单通道软件触发),也就是说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转换这一块功能确实交强大也相对来说比较复杂,或许文中讲述的还不够清楚,若有不清楚的可以关注微信,在微信上留言。

 

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

 

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


关键字:STM32F10x  ADC  三通道  DMA  连续转换 引用地址:STM32F10x_ADC三通道DMA连续转换(3通道、软件单次触发)

上一篇:STM32F10x_ADC三通道逐次转换(单次、单通道软件触发)
下一篇:STM32F10x_RTC日历

推荐阅读最新更新时间:2024-03-16 15:32

stm32cubemx 多路adc采集
采用的软件是STM32CUBEMX+KEIL5 硬件为stm32F103C8T6 我与原文作者做的区别在于 External Trigger Conversion Edge,我在进行配置的时间没有None选项,我选择的是默认的Regular Conversion launched by software 原文地址: http://www.eemaker.com/stm32cubemxadc.html 实现功能:stm32cubeMX配置ADC多通道采集(非dma和中断方式) Stm32ADC的转换模式还是很灵活,很强大,模式种类很多,那么这也导致很多人使用的时候没细心研究参考手册的情况下容易混淆。不知道该用哪种方
[单片机]
stm32cubemx 多路<font color='red'>adc</font>采集
Teledyne e2v 宣布推出最先进的多功能四通道模数转换
Teledyne e2v 推出其最先进的 12 位四核模数转换器 (ADC) EV12AQ600。该转换器具有多通道功能,采用 16×16 mm 封装。 中国,香港 - 2018 年 5 月 11 日 - Teledyne e2v 推出其最先进的模数转换器 (ADC) EV12AQ600。这款新型 ADC 可作为单通道、双通道或四通道设备使用,还有一种耐辐射款,使其成为适用于航天应用的首款四通道 ADC。 用户可设计相关系统以单独或同步操作 EV12AQ600,采用四通道每秒采样 15 亿次 (GSp)、双通道每秒采样 30 亿次、单通道每秒采样 60 亿次的模式,且仅需配置一台 ADC。因此,EV12AQ600 具有很强
[测试测量]
基于STM32的智能电机保护器设计
0 引言 电机是工业生产领域中最主要的驱动源,如何有效地监控电机的运行状态,保护电机回路,提高电机的运行时间,减少电机故障,对工厂整体电网的运行十分关键。 电动机保护装置有很多种,目前使用得比较普遍的还是基于金属片机械式的热继电器,它结构简单,在保护电动机过载方面具有反时限特性。但它的保护功能少,无断相保护,对电机发生通风不畅、扫膛、堵转、长期过载、频繁启动等故障也不能起保护作用。此外,热继电器还存在重复性能差、大电流过载或短路故障后不能再次使用、调整误差大、易受环境温度影响而误动或拒动、功耗大、耗材多、性能指标落后等缺陷。 为响应国家节能减排的要求,采用基于微控制器的电子式电机保护器替代现有热继电器,具有广大的
[单片机]
STM32 配置AD,配置DMA
STM32f105rct6:配置AD,配置DMA 两路AD取值通道: 配置AD: void ADC_Configuration(void) { ADC_InitTypeDef ADC_InitStructure; ADC_StructInit(&ADC_InitStructure); /* ADC1 configuration ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMod
[单片机]
提高数据吞吐量和系统效率,多通道DAQ很关键
在多通道多路复用数据采集系统中,增加每个 ADC 的通道数量可改善系统的整体成本、面积和效率。现代 SAR ADC 具有高吞吐量和高能效,使得系统设计人员能够实现比以往更高的通道密度。 今天我们将说明多路复用器输入端的建立瞬变(由多路复用器输出端的大尺度开关瞬变引起)导致需要较长采集时间,使得多通道数据采集系统的整体吞吐量显著降低。然后,文中将着重阐述使输入建立时间最小化以及提高数据吞吐量和系统效率所需的设计权衡。   什么是多通道 DAQ? 如何衡量多通道 DAQ 的性能? 多通道数据采集 (DAQ) 系统是一个与多路输入(通常是传感器)接口的完整信号链子系统,其主要功能是将输入端的模拟信号转换为处理单元可以理解的数
[模拟电子]
STM32的ADC和串口
如果简单的使用USART的话配置相当简单,只要配置一下波特率,数据长度,停止位长度,校验位。然后再设置一下串口的引脚,输入为上后输入,输出为利用推挽输出。这样一来串口就配置好了,如果使用库则一目了然,如果使用寄存器操作会繁琐一点找各个寄存器,因为设置波特率和设置数据长度等这些并不在一个寄存器中设置完成,还有可能忘记个别设置而无法找其原因。但寄存器操作的效率会很高。如下配置: void USART_Initial(uint32_t Baud) { USART_InitTypeDef USART_InitStruct; USART_GPIO(); //配置串口引脚 USART_InitStruct.USART_BaudRate=Bau
[单片机]
模拟工程师必知必会:带你全方位学习模数转换
ADC性能提高的建议   虽然ADC看起来非常简单,但它们必须正确使用才能获得最优的性能。ADC具有与简单模拟放大器相同的性能限制,比如有限增益、偏置电压、共模输入电压限制和谐波失真等。ADC的采样特性需要我们更多地考虑时钟抖动和混叠。以下一些指南有助于工程师在设计中充分发挥ADC的全部性能。   模拟输入   要认真对待ADC的模拟输入信号,尽量使它保持干净,“无用输入”通常会导致“数字化的无用输出”。模拟信号路径应远离任何快速开关的数字信号线,以防止噪声从这些数字信号线耦合进模拟路径。   虽然简化框图给出的是单端模拟输入,但在高性能ADC上经常使用差分模拟输入。差分驱动ADC可以提供更强的共模噪声抑制性能,由于有
[模拟电子]
模拟工程师必知必会:带你全方位学习<font color='red'>模数转换</font>器<font color='red'>三</font>
基于ADC0809和51单片机的多路数据采集系统设计
“数据采集”是指将温度、压力、流量、位移等模拟物理量采集并转换成数字量后,再由计算机进行存储、处理、显示和打印的过程,相应的系统称为数据采集系统。 本文的主要任务是对0~5V的直流电压进行测量并送到远端的PC机上进行显示。由于采集的是直流信号,对于缓慢变化的信号不必加采样保持电路,因此选用市面上比较常见的逐次逼近型ADC0809芯片,该芯片转换速度快,价格低廉,可以直接将直流电压转换为计算机可以处理的数字量。同时选用低功耗的LCD显示器件来满足其在终端显示采集结果的需求。终端键盘控制采用尽可能少的键来实现控制功能,为了防止键盘不用时的误操作,设计时还设置了锁键功能,在键盘的输入消抖方面,则采用软件消抖方法来降低硬件开销,提高
[单片机]
基于<font color='red'>ADC</font>0809和51单片机的多路数据采集系统设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved