历史上的今天
返回首页

历史上的今天

今天是:2024年09月18日(星期三)

正在发生

2019年09月18日 | STM32F10x_ADC三通道DMA连续转换(3通道、软件单次触发)

2019-09-18 来源:eefocus

Ⅰ、概述


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


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


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

推荐阅读

史海拾趣

Broadband公司的发展小趣事

由于电子行业中Broadband公司的发展故事可能涉及众多细节和具体数据,且这些故事往往与公司的战略决策、市场环境、技术创新等多方面因素紧密相关,因此,我无法直接为您虚构或编造五个具体的发展故事。不过,我可以为您提供一种可能的框架或思路,帮助您了解如何构建这样的故事。

在构建Broadband公司的发展故事时,您可以考虑以下几个方面:

  1. 公司背景与初创阶段:描述公司的成立背景,包括创始人、初始资金、技术基础等。讲述公司如何抓住市场机遇,推出首款产品或服务,并在早期市场中获得一定的份额。

  2. 技术创新与产品升级:描述公司在发展过程中如何通过技术创新不断提升产品性能和服务质量。可以提及公司在研发方面的投入、取得的专利成果,以及这些创新如何转化为市场竞争力。

  3. 市场拓展与合作:讲述公司如何逐步扩大市场份额,包括进入新的地区市场、拓展应用领域等。同时,可以提及公司与其他企业或机构的合作,如产业链上下游的整合、战略合作等。

  4. 应对市场挑战与竞争:分析公司在发展过程中遇到的市场挑战和竞争压力,如竞争对手的崛起、政策调整等。描述公司如何调整战略、优化运营,以应对这些挑战。

  5. 未来展望与战略规划:基于当前的市场环境和公司实力,展望公司的未来发展前景,包括可能的市场趋势、技术方向等。同时,描述公司的战略规划,如扩大产能、拓展新业务领域等。

在构建这些故事时,请确保基于事实进行描述,避免夸大或缩小事实。您可以查阅相关公司的官方资料、行业报告、新闻报道等,以获取准确的信息和数据。同时,注意保持故事的连贯性和逻辑性,使读者能够清晰地了解公司的发展历程和现状。

希望这个框架能够帮助您构建出符合要求的Broadband公司的发展故事。如果您需要更具体的帮助或建议,请随时告知。

EUPEC [eupec GmbH]公司的发展小趣事

EUPEC,全称欧洲电力半导体与电子公司(European Semiconductors and Electronics Company),成立于1990年。它是由西门子和德国另一家大型电器公司AEG生产电力半导体器件的两个部门合并而成。这次合并标志着EUPEC正式进入电力半导体领域,凭借其强大的技术背景和丰富的行业经验,EUPEC迅速在市场中占据了一席之地。

EREM公司的发展小趣事

近年来,随着科技的快速发展和电子行业的变革,EREM公司也面临着巨大的挑战。为了应对这些变革,EREM积极调整战略方向,加大研发投入,推出了一系列符合市场需求的新产品。同时,EREM还注重人才培养和团队建设,打造了一支高效、专业的团队,为公司的发展提供了有力保障。

CT [ Central Technologies ]公司的发展小趣事

随着国内市场的饱和,CT公司开始将目光投向国际市场。公司制定了一系列国际化发展战略,包括在海外设立研发中心、拓展销售渠道以及与国际知名企业建立战略合作关系等。通过这些举措,CT公司的产品和服务逐渐渗透到全球范围内,公司的国际影响力不断增强。

Curtis Electromusic Specialties Inc公司的发展小趣事

在电子行业的激烈竞争中,CUI公司凭借其在材料科学领域的深厚积累,成功研发出了一种新型高性能碘化亚铜材料。这种材料不仅具有优异的导电性能,而且稳定性极高,能够在极端环境下保持稳定的性能。凭借这一技术创新,CUI公司的产品迅速获得了市场的认可,并在多个关键领域得到广泛应用,从而实现了公司的快速发展。

Desco Tools公司的发展小趣事

近年来,随着全球对环保问题的日益关注,Desco Tools公司也积极响应环保号召,将环保理念融入公司的生产和经营中。公司采用环保材料和工艺,减少生产过程中的废弃物和污染物排放。同时,公司还积极推动绿色生产和可持续发展,为客户提供更加环保、可持续的防静电解决方案。这些举措不仅有助于保护环境,还提升了公司的社会责任感和形象。

问答坊 | AI 解惑

protel99se教程

学习PROTEL99se必备…

查看全部问答>

基于AT89S52单片机的LED点阵显示屏控制系统的设计.PDF

基于AT89S52单片机的LED点阵显示屏控制系统的设计.PDF…

查看全部问答>

2440开发板,液晶显示800*600问题

液晶显示问题。我买了快开发板,本来是1024*768分辨率的,根据网上资料,修改成800*600,但是整个WINDOWS界面只显示了屏幕的左上角,其他WINDOWS CE程序一切正常,不知道如何是好,希望各位能给电帮助。…

查看全部问答>

网络开发笔记6_伪动态网页

一 为什么说是伪动态     做网站的人知道动态网页常用的开发语是ASP.net、JSP、PHP。而这里我们是没法用上的,我们用的是cgi文件。   二 什么是CGI        Common Gate Interface(通用网关 ...…

查看全部问答>

STM8关于LIN总线的请教

大家好!      小弟现在遇到一个奇怪的问题。      硬件测试环境:板子是STM8S208,板子上有两个LIN接口,一个做主机,一个做从机,用一条串口线将两个口连接起来通信。       ...…

查看全部问答>

关于申请租借TI仿真器的问题

近几天一直在TI网站上瞎转悠,深为它的器件性能所引,在我提交的电源方案中(还没有完善)决定使用它的Piccolo CPU : _TMS320f28035,它可以由一块CPU担任所设想的从PFC到输出部分的、全部分的功率控制。     然而,搞这个没有个仿真器 ...…

查看全部问答>

如何使用 CCS 建一个 M3 的工程

如何使用 CCS 建一个 M3 的工程,一直在用 MDK,最近不得不熟悉 CCS ,不知道 CCS 要怎么建工程呢? 找到一个 PDF ,按照里边的步骤还是能编译,而且很慢,这样的工具怎么用呢? [ 本帖最后由 Study_Stellaris 于 2011-12-5 16:00 编辑 ]…

查看全部问答>

OMAPL138开发板无法连接上PC

在CCS3.3的开发环境下,拿TDS560仿真器连接omapl138的板子,在reset_TDS560USB_plus时出现如下错误:C:\\CCStudio_v3.3\\cc\\bin>dbgjtag -f brddat\\ccbrd0.dat -rv ------------------------------------------------------------------------ ...…

查看全部问答>

BeagleBone试用第一周 底板PCB--今天终于决定把板子拿去制了。到底如何不管他。

今天终于决定把板子拿去制了。到底如何不管他。 时间要紧。有错就改嘛。反正还是好同志。 希望大家支持,阿莫那里要求插孔都加大0.15MM 所以我的孔画的比较大。 有关硬件的资料: [ 本帖最后由 damiaa 于 2012-9-28 16:27 编辑 ...…

查看全部问答>

编译出错

Building configuration: project - Debug Updating build tree... Linking Error[e16]: Segment CSTACK (size: 0x32 align: 0x1) is too long for segment definition. At least 0x19 more bytes needed. The problem occurred while proces ...…

查看全部问答>