模数转换器件—ADC

模数转换器件—ADC,第1张

第10章 模数转换ADC与直接内存存取技术DMA

工业检测系统和日常生活中有许多物理量都是模拟量,比如温度、长度、压力、速度等等,这些物理模拟量可以通过传感器变成与之对应的电压、电流等电模拟量。由于单片机系统是一个典型的数字系统,为了实现数字系统对这些电模拟量的检测、运算和控制,就需要模数转换模块ADC。

1 10.1 模数转换器件—ADC

10.1.1 ADC的基本概念

模数转换器(Analog To Digital Converter)简称ADC(也可以写成A/D),是指将连续变化的模拟信号转换为离散的数字信号的器件。ADC分为积分型、逐次逼近型、并行/串行比较型、Σ-Δ型等多种类型,STM32F103自带的ADC属于逐次逼近型。

逐次逼近型ADC与天平称物重非常相似,从高位到低位逐位比较。首先从最重的砝码开始试放,与被称物体行进比较,若物体重于砝码,则该砝码保留,否则移去,然后用次重砝码继续比较,照此一直到最小一个砝码为止,将所有留下的砝码重量相加,就得此物体的重量。逐次逼近型A/D转换器,就是将输入模拟信号与不同的参考电压作多次比较,使转换所得的数字量在数值上逐次逼近输入模拟量对应值。

10.1.2 ADC的功能描述

STM32F103ZE系列拥有3路12位ADC,每一路ADC都有18个输入通道,为了方便理解,将ADC功能框图进行分块,然后针对每个功能块进行讲解,如图10-1所示。

模数转换器件—ADC,pYYBAGMkL-qAK9G_AAGckVu5Wuc019.png,第2张

图10-1 ADC结构图

1、电源和基准源

模拟电源VDDA和VSSA是ADC的供电引脚,输入范围为2.4V到3.6V,通常情况是和数字电源的电压一致。为了防止电源噪声影响,将3.3V数字电源通过简易滤波处理接到模拟电源VDDA,比如加一个磁珠;VSSA在不同应用场景和数字VSS连接方法也不完全一致,简易处理方式是直接接数字VSS,ST官方的DEMO板采用的是单点接地方式。

基准源,也叫基准电压或参考电压,是ADC的一个重要指标,基准源的偏差会直接影响转换结果的准确度。STM32F103系列只有100及以上引脚的型号才具备外部参考电压引脚VREF+和VREF-,其他型号参考电压引脚在内部默认连接到ADC的电源引脚VDDA和VSSA。

Kingst-32F1开发板直接将VREF+与VDDA相连,VREF-与VSSA相连,这两个引脚决定了ADC的电压输入范围,即:VREF-≤VIN ≤VREF+,ADC的电源和基准源电路如图10-2所示。

模数转换器件—ADC,poYBAGMkMBaAKQ_3AACA2jackU8970.png,第3张

图10-2 ADC电源和基准源电路

2、ADC时钟和转换时间

ADC外设挂载在APB2总线上,其输入时钟由挂载在APB2时钟(PCLK2)上的ADC预分频器经分频后产生,最高不超过14MHz。由于APB2总线上通常有多个外设同时工作时,为了保证运行速率,设置APB2为最大速率72Mhz,此时只能通过ADC预分频器设置ADC的输入时钟频率,并且还要保证其不超过最大14Mhz,ADC时钟结构如图10-3所示。

模数转换器件—ADC,pYYBAGMkMCyATHEUAADemGntL0o316.png,第4张

图10-3 ADC时钟结构示意图

ADC的预分频器位于RCC时钟配置寄存器中的[15:14] 2个寄存器位。ADC预分频器控制位为00时表示最低2分频,最高可设置8分频,具体配置库函数如下,设置参数如表10-1所示。

模数转换器件—ADC,poYBAGMkMD-AbZnVAAAWuwpQg7M662.png,第5张

模数转换器件—ADC,poYBAGMkME2ANo6LAAClM8EC7AQ496.png,第6张

ADC总转换时间如下计算:转换时间 Tconv =采样时间+ 12.5周期

通过配置ADC采样时间寄存器ADC_SMPR1和ADC_SMPR2中的SMPx[2:0]位(x为0到17,管理ADC的18个通道)可以独立选择每个通道的采样时间,分别是1.5周期、7.5周期、13.5周期、28.5周期、41.5周期、55.5周期、71.5周期和239.5周期,所以总转换时间最短14个周期,最长252个周期。

如何选择合适的采样时间?这是一个特别重要,并且容易被初学者忽略的问题。如果选取的采样时间不合理,就有可能出现较大的采样误差。

ADC采样的过程要对内部一个容值很小的电容进行充电,当外部阻抗(输入到ADC引脚的信号调理电路的输出阻抗)较大时,电流比较小,充电时间就比较长。在这种情况下,如果采样时间较短,可能电容还没被充满,这样便会出现采样误差,转换后的数据也会有误差。因此采样时间需要与输入阻抗相匹配,通常ADC输入阻抗越大,采样时间越长。

ADC最大输入阻抗与采样时间计算公式如下所示:(公式仅供了解,重点是后面结论)

模数转换器件—ADC,poYBAGMkMGOACvNiAAAunVH-odc269.png,第7张

RAIN:最大输入阻抗;

TS:采样周期;

fADC:ADC时钟频率;

CADC:内部采样并保持电容器,最大为8pF;

In(2N+2):Log以e为底数的对数,N表示ADC位数(N=12),其值约为9.704;

RADC:内部采样开关电阻,最大为1K;

假设外部输入阻抗为10K,ADC时钟频率为14Mhz,由公式(1)得:

模数转换器件—ADC,pYYBAGMkMMmATg82AAA2L8JrBgA836.png,第8张

经过计算可得Ts > 11.96,因此当外部输入阻抗为10K时,ADC时钟频率为14Mhz时,采样时间应该为11.96个周期,但是ADC采样周期中并无该值,因此可以选择相近的13.5个周期,注意:采样时间宁长勿短。

当fADC =14Mhz时,理论上最大输入阻抗与采样时间关系如表10-2所示。

模数转换器件—ADC,poYBAGMkMNaAJjxGAADz-z2qWtI570.png,第9张

在实际应用中,大多数模拟信号是通过运算放大器再进入ADC通道,运算放大器的阻抗通常是几十欧,在这种情况下根据表10-2,采样周期就可以用到最短1.5个周期。在一些输入阻抗比较大的场合,可以在线路中加入一个较大的电容(达到内部采样保持电容的千倍以上),可以实现用这个大电容快速给内部采样保持电容充电的效果,大幅降低采样所需时间,Kingst-32F1开发板的电压采集电路中的C89电容就是这样一个作用,10.3小节会讲到。

3、ADC输入通道

STM32F103ZE的3个ADC模块,其中ADC1提供给用户可用通道16个,其余2个通道一个接STM32内部温度传感器,另外一个接内部参考电压VREFINT;ADC2提供给用户可用通道16个,其余两个通道接VSS;ADC3提供给用户可用通道13个,其余5个通道接VSS。3个ADC模块共用了部分通道,不同ADC应用不同通道时,可以同时进行采样和转换,但不可以对相同通道同时采样,ADC输入通道引脚如表10-3所示。

模数转换器件—ADC,poYBAGMkMOaAfSNFAAGjW5XwONE260.png,第10张

在使用ADC外部通道时,可以设定为规则组和注入组。规则组就是设定好转换顺序后,按照规则正常转换;注入组类似于中断,可以插队,当触发信号触发注入组通道时,优先转换注入组,转换完后再继续转换规则组;如果正在转换规则通道期间,注入通道被触发,当前规则组转换被复位,注入通道序列被以单次扫描方式转换,完成转换后恢复上次被中断的规则通道转换。规则组最多可以使用16个通道,注入组最多可以使用4个通道,其工作模式如图10-4所示。

模数转换器件—ADC,pYYBAGMkMPWAHRXfAADFp5PSGb0566.png,第11张

图10-4 规则组与注入组工作方式示意图

4、ADC通道转换顺序

规则通道的转换顺序由ADC的规则序列ADC_SQR3、ADC_SQR2、ADC_SQR1这三个寄存器控制,使用规则组转换时,将要转换的通道序号写入到对应寄存器相应的位,并设置规则通道转换序列的通道数目。对应关系如表10-4所示。

模数转换器件—ADC,poYBAGMkMQOAUeUEAAHWtfoGslc041.png,第12张

注入通道的转换顺序由序列寄存器ADC_JSQR这个寄存器控制,特别注意的是,如果设置了4个注入通道并且转换的通道数目是4,则转换顺序是:JSQR1→JSQR2→JSQR3

→JSQR4;如果设置转换通道数目为3,但是实际配置的转换通道数目为4,则转换顺序是JSQR2→JSQR3→JSQR4,而不是从JSQR1→JSQR2→JSQR3,注入序列寄存器JSQR与通道的对应关系如表10-5所示。

模数转换器件—ADC,poYBAGMkMRCAGTabAACvLb0IXNI156.png,第13张

当“转换组”只有一个通道转换时称之为单通道模式,当有多个通道按顺序转换时称之为多通道模式或者扫描模式。当规则组或注入组的通道按照设定顺序执行一次采转换后即停止工作,这种模式称之为单次转换模式;如果执行完一次转换后,ADC没有停止,而是立即启动新一轮转换,这种模式称之为连续转换模式。

5、触发源

触发启动转换:触发启动转换分为两种方式,分别是软件触发和外部事件触发(外部是相对于ADC外设来讲),其中外部事件触发又分为定时器触发和外部触发(这里的外部指的是芯片外部信号)。是否启用触发转换,由寄存器ADC_CR2的EXTTRIG位(规则组)和JEXTTRIG位(注入组)决定。选用何种触发方式,是由寄存器ADC_CR2的EXTSEL[2:0]位(规则组)和 JEXTSEL[2:0]位(注入组)来控制。具体的触发方式可以通过查阅手册的ADC_CR2寄存器详细了解。

6、数据寄存器

(1)规则组数据寄存器:

在独立ADC模式下,规则组通道转换完成后,转换后的数据被存储在对应的ADC规则数据寄存器ADC_DR的低16位。

双ADC模式是ADC1和ADC2同时采集某些参数,比如要获取瞬时功率需要同时采集电压和电流参数才能准确计算结果,这种场合就必须使用双ADC模式。这种模式下ADC1所对应的ADC_DR的高16位存储ADC2的规则数据,低16位存储ADC1的规则数据。

由于ADC的精度是12位,因此在将ADC的12位数据存入16位的数据寄存器中时,可以通过ADC_CR2寄存器的ALIGN位来选择数据是左对齐还是右对齐。

规则通道最多有16个通道,但规则数据寄存器只有一个,因此当使用多通道转换时,前一个转换的通道数据,会被后一个通道转换的数据覆盖掉,因此理论上必须在后一个通道转换完毕之前就把数据取走。为了确保不产生丢失数据的情况,开启DMA传输模式,将数据传输到内存中是一个好办法,这部分相关内容后续介绍。

(2)注入组数据寄存器:

ADC注入组最多有4个通道,每个通道都有对应的数据寄存器ADC_JDRx(x=1..4),ADC_JDRx是32位的,高16位保留,低16位用来保存数据,选择数据是左对齐还是右对齐都由ALIGN决定。

6、中断处理

如果打开相应的中断,有三种情况可以进入中断。

(1)规则通道转换完成中断

1. 转换数据被存储在16位的ADC_DR寄存器中。

2. EOC(转换结束)标志被置位。

3. 如果设置了EOCIE位,则产生中断。

(2)注入通道转换完成中断

1. 转换数据被存储在16位的ADC_DRJx寄存器中。

2. JEOC(注入转换结束)标志被置位。

3. 如果设置了JEOCIE位,则产生中断。

(3)模拟看门狗中断

如果开启了模拟看门狗中断,并且设置ADC低阈值ADC_LTR和高阈值ADC_HTR,当采集到的电压高于高阈值或者低于低阈值时,就会产生模拟看门狗中断。

2 10.2 ADC 配置流程10.2.1 初始化结构体

初始化结构体中包含了ADC模块的主要配置内容,分别是ADC模式、通道模式、转换模式、触发条件、通道数目,下面通过代码对结构体每个成员介绍:

模数转换器件—ADC,poYBAGMkMSOAFX3jAABNpbE_i9o863.png,第14张

1、ADC_Mode——ADC模式

ADC分为ADC独立模式和双ADC模式,独立模式只有一种情况,而双ADC模式有多种情况,本小节先介绍独立ADC模式,因此直接选择ADC_Mode_Independent,如表10-6所示。

模数转换器件—ADC,pYYBAGMkMS6AalYVAAEpeCCV-T4558.png,第15张

2、ADC_ScanConvMode——通道模式

ADC_ScanConvMode 设置了ADC通道工作在多通道模式还是单通道模式,如表10-7所示。

模数转换器件—ADC,poYBAGMkMTuAZ8sBAABvHSdVZbM615.png,第16张

3、ADC_ConTInuousConvMode——转换模式

ADC_ConTInuousConvMode 设置了ADC采用连续转换还是单次转换模式,如表10-8所示。

模数转换器件—ADC,poYBAGMkMUiAMSIuAABwni0Wm1k268.png,第17张

4、ADC_ExternalTrigConv——触发转换方式

ADC_ExternalTrigConv定义了规则组使用何种触发方式如表10-9所示。

模数转换器件—ADC,poYBAGMkMVWAMbO2AADwfWn280k641.png,第18张

注入组需要通过专门的ADCx 外部触发启动注入组转换函数来设置注入组触发方式,该函数如下:

模数转换器件—ADC,pYYBAGMkMWKAeVsfAAAdxB5hRnE941.png,第19张

其中ADCx外设,ADC_ExternalTrigConv为注入组触发方式,注意注入组触发方式与规则组有所不同,具体如表10-10所示。

模数转换器件—ADC,pYYBAGMkMW6ACEqrAAENgQC_GJw448.png,第20张

5、ADC_DataAlign——数据格式

ADC_DataAlign规定了ADC数据向左边对齐还是向右边对齐,存储格式如图10-5所示。图中SEXT位是扩展的符号位,因为注入组通道转换的数据值已经减去了在“注入通道数据偏移寄存器”中定义的偏移量,所以结果可以是一个负值。

模数转换器件—ADC,poYBAGMkMXuAYC1dAACgnr6Lb_o010.png,第21张

图10-5数据对齐方式

模数转换器件—ADC,poYBAGMkMY2AI3QYAAB4WMnlPZA476.png,第22张

6、ADC_NbrOfChannel——通道数目

ADC_NbreOfChannel 规定了规则转换的 ADC 通道的数目,取值范围是1到16。而注入组是通过专门的函数实现的,如下所示。

模数转换器件—ADC,pYYBAGMkMZmAGiAiAAAZ2ZYG6cw963.png,第23张

ADCx表示ADC外设,Length表示注入组通道数目,取值范围为1~4。

10.2.2 设置转换组的通道顺序及采样时间

1、规则组通道配置函数:

模数转换器件—ADC,pYYBAGMkMaeABuzwAAAcOphzr0U815.png,第24张

2、注入组通道配置函数:

模数转换器件—ADC,pYYBAGMkMbSAZ78wAAAYFKTGQf8649.png,第25张

其中ADCx表示选择使用哪个ADC,x可以是1,2或3;ADC_Channel表示配置的通道号,详情参考表10-8中ADC_Channel的值;Rank表示规则组采样顺序,规则组取值范围 1 到 16,注入组范围是1到4;ADC_SampleTIme表示ADC通道的采样时间,详情参考表10-12中ADC_SampleTIme的值。

模数转换器件—ADC,pYYBAGMkMcGALf6iAAELG3kW7ks886.png,第26张

10.2.3 使能ADC外设

ADC_CR2寄存器的第0位ADON负责控制ADC的唤醒、掉电以及软件启动转换功能。ADON位上电默认为‘0’,即默认ADC模块是不工作的,当ADON为从‘0’写入‘1’以后,ADC从断电模式下唤醒工作,这个唤醒需要1个稳定时间tSTAB,如图所示10-6所示。除了前边讲的通过触发源启动ADC外,当ADON从‘1’再次写入‘1’时,也可以启动ADC转换,这种方式大多情况下不使用。

模数转换器件—ADC,poYBAGMkMc2ABsaeAAB9NjRK3aw488.png,第27张

图10-6 ADC时序图

通过清除ADON位可以停止转换,并将ADC置于断电模式,在这个模式下,ADC几乎不耗电(仅几个uA)。

模数转换器件—ADC,poYBAGMkMdmAU7fbAAAaWtcrLno115.png,第28张

ADCx标志ADC外设,x为1、2、3;NewState 可以为ENABLE或DISABLE,分别对应使能和失能。

10.2.4 ADC校准

ADC有一个内置自校准模式,可以大幅减小由于内部电容的变化而造成的精准度误差。通过设置ADC_CR2寄存器的CAL位启动校准,一旦校准结束,CAL位被硬件复位。建议在每次上电时执行一次ADC校准,启动校准前,ADC必须处于上电状态(ADON=‘1’)至少超过两个ADC时钟周期,校准代码如下所示:

模数转换器件—ADC,poYBAGMkMeiAJjLsAAAzvWd5fAg113.png,第29张

10.2.5 使能通道触发转换

规则组和注入组触发方式方式分为软件触发和外部触发,其中外部触发包括定时器触发和外部信号触发。如果设置了规则组或注入组触发方式,还需要使能相应触发,保证在触发到来时启动转换。规则组和注入组通道触发方式使能函数如下所示;

1、规则组通道触发使能

软件触发使能:

模数转换器件—ADC,pYYBAGMkMfeAbno8AAAXcVfF_KM114.png,第30张

外部触发使能:

模数转换器件—ADC,pYYBAGMkMgOAc5riAAAU-EaYIQY297.png,第31张

2、注入组通道触发使能

软件触发使能:

模数转换器件—ADC,poYBAGMkMg-ARjEYAAAaxMP5gJM511.png,第32张

外部触发使能:

模数转换器件—ADC,poYBAGMkMhuAeFotAAAXZQywc9A760.png,第33张

其中ADCx标志ADC外设,x为1、2、3;NewState 可以为ENABLE或DISABLE,分别对应使能和失能。

3 10.3 ADC独立模式单通道软件触发转换本小节通过ADC1规则组单通道模式测量KST-32开发板的USB电源输入电压,测量电路如图10-7所示。已知该电路的输入阻抗为10K,根据输入阻抗与采样时间关系,应该选择采样时间最短为13.5个周期,再短就会产生较大误差。但是如果在电路上加入了C89这个0.1uF的电容后,就可以起到快速给ADC内部采样保持电容充电的效果,因此即使使用最短采样时间1.5个周期,也可以保证测量精度。

模数转换器件—ADC,poYBAGMkMi6AN4_dAACf3hPpwC8918.png,第34张

图10-7 电压测量电路

该实验通过软件启动ADC转换,主循环中并不是实时显示ADC的转换结果,为了降低ADC的功耗,只有在读取测量结果时再启动一次转换,转换完毕后停止转换。具体配置流程如下:

1、初始化ADC1通道引脚(内部温度传感器和参照电压通道不需要进行引脚初始化)

2、配置ADC1中断优先级(如果使用ADC中断,本节未使用)

3、使能 ADC1外设时钟

4、设置ADC1预分频系数

5、复位ADC1

6、配置ADC1初始化结构体

7、设置规则组转换顺序和采样时间

8、使能ADC1中断(本节未使用)

9、使能ADC1外设

10、校准ADC1

11、使能ADC1软件触发或外部触发转换

12、编写中断服务函数(如果使用ADC中断,本节未使用)

具体代码如下:

模数转换器件—ADC,poYBAGMkMk-AC-y4AACNyuZxaaQ447.png,第35张

模数转换器件—ADC,pYYBAGMkMp6AJQwEAADfCiMUanA578.png,第36张

模数转换器件—ADC,pYYBAGMkMrOAOJTHAAESsINLXHM313.png,第37张

模数转换器件—ADC,pYYBAGMkMsiABhbIAADgoo1iBvc074.png,第38张

410.4 ADC独立模式规则组单通道外部触发转换本节依旧是通过ADC1规则组单通道模式测量KST-32开发板的USB电源输入电压,但是触发方式由软件触发,改为定时器触发,这里选择使用ADC_ExternalTrigConv_T2_CC2(定时器2输出比较触发),通过设置定时器每隔20ms触发一次ADC采样及转换,此时ADC的采样频率为50Hz。实验中对十次转换数据求平均,以此减少参考电源不稳定带来的影响。

由于ADC间隔20ms保存一次数据,为了防止数据被覆盖,为此开辟一个缓冲区用于存储转换后的数据,每转换一次就保存一次数据到缓冲区,当转换完十次后就读取前十次的数据进行处理;此时ADC继续转换,数据继续向后存储,当转换完二十次后,再读取后十次的数据处理,然后下一次转换后的数据从缓冲区起始位置存储,以此循环,这样可以有效的解决数据丢失以及覆盖的问题,具体代码如下:

模数转换器件—ADC,pYYBAGMkMtiARGJBAACvKVcesuM550.png,第39张

模数转换器件—ADC,pYYBAGMkMwyATxC4AAEKkzEByQo239.png,第40张

模数转换器件—ADC,poYBAGMkMyGAXK-PAAD2mzOASOs521.png,第41张

模数转换器件—ADC,pYYBAGMkMzWABNnnAAFPpT8OCOQ354.png,第42张

模数转换器件—ADC,pYYBAGMkM0WAcO7DAADGXi5hyyY681.png,第43张

5 10.5 直接内存存取技术——DMA

10.5.1 什么是DMA

当处理单片机外设数据时,通常的流程是CPU先将外设产生的大量数据加载到存储器中,然后CPU再从存储器中读取并处理数据。按照这种处理方式,外设和存储器之间的数据传输是通过CPU执行一段程序来实现的,但是当外设产生的数据量比较大的时候,就会大幅降低CPU的执行效率。为了解决这个问题,工程师们设计出一项不需要CPU执行,便可以直接控制数据在外设和存储器之间或者存储器和存储器之间传输的技术,称之为直接存储器存取技术(Direct Memory Access,简称DMA)。

DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省CPU的资源可以做其他 *** 作。DMA传输的本质是地址到地址的 *** 作,可以把DMA理解为CPU的“秘书”。之所以称之为“秘书”是因为它只听从CPU的支配,并且它的能力也是有限的,只能帮助CPU传递数据,并不能发号施令。

10.5.2 DMA工作流程

STM32F103ZE系列具有2个DMA控制器,其中DMA1拥有7个通道,DMA2拥有5个通道。DMA的每个通道都直接连接专用的硬件DMA请求,每个通道也都支持软件触发,并且也可以设置优先权。每个通道都有3个事件标志(DMA半传输、DAM传输完成、DMA传输出错)可以请求中断。通道传输的数据量是可编程的,最大65535个字节,DMA功能框图如图10-8所示。

模数转换器件—ADC,poYBAGMkM9SAfdGkAAEJQ2udJTk461.png,第44张

图10-8 DMA结构图

1、DMA请求

当外设需要传输数据时,外设向DMA发送DMA请求,DMA控制器会先回应一个应答信号。当获取到DMA的应答信号时,外设立即释放它的请求,如果有更多请求时,外设可以启动下一个周期。

DMA传输通常作用在数据量较大的外设到存储器、存储器到外设以及存储器到存储器中,比如ADC、SPI、外部SRAM、定时器等设备,每个外设都有对应的DMA传输通道,具体DMA请求映像如表10-13和10-14所示,这两张表的内容即用即查。

模数转换器件—ADC,pYYBAGMkM-qAP0wUAACPpZNCF8c073.png,第45张

模数转换器件—ADC,pYYBAGMkM_aAAn4ZAACSTz2_mcY192.png,第46张

2、DMA仲裁

多个DMA通道出现请求时,就要有处理先后的顺序问题,这和中断优先级处理是类似的。DMA请求可以通过软件编程设置优先级(很高、高、中等和低),高优先级的优先执行;如果多个DMA请求的优先级一样,则通道号小的优先执行,比如通道0优先于通道1,注意DMA通道不存在嵌套问题,只有当前通道传输执行完毕,才会执行下一个优先级较高的通道。

3、DMA数据传输

每个通道都可以在有固定地址的外设寄存器和存储器地址之间执行DMA传输。在启动DMA数据传输之前需要设定数据源地址和目标地址,以及传输的数据宽度和数据对齐方式,这样才能保证数据传输的可靠性。

当传输一半的数据后,半传输标志位(HTIF)被置1,如果设置了允许半传输中断位(HTIE),将产生一个中断请求;当数据传输结束后,传输完成标志位(TCIF)被置1,如果设置了允许传输完成中断位(TCIE),将产生一个中断请求。

4、DMA传输模式

DMA拥有两种工作模式,一种是非循环模式,一种是循环模式。

非循环模式下,结束传输后将不再产生DMA *** 作。要重新开始新的DMA传输,需要在关闭DMA通道的情况下,重新在传输数量寄存器DMA_CNDTRx中写入传输数目。

在循环模式下,数据传输的数目DMA_CNDTRx寄存器变0以后,会自动被重新加载为初始值。

由于循环模式会自动重新开启传输,就有可能造成刚刚存入的数据还未被取走,新的数据进入。在实际工程中如何解决这类问题呢?这个时候过半传输标志位就要发挥作用了。

假如要传输的字节数是10个,那么可以将数目寄存器设定为20,然后开辟20个字节的缓冲空间。当传输完10个字节的后,过半传输标志位置1,进入中断,将数据取出;同时在这个过程中,如果有新的数据进入,会直接继续往缓冲区后半段送,当数目寄存器变0,缓冲区存满,传输完成标志位置1,进入中断,将后半段取出。此时由于在循环模式下,DMA数目寄存器被复位成为20,进入下一轮循环。

10.5.3 配置DMA

1、初始化DMA

DMA初始化结构体的相关内容如下所示:

模数转换器件—ADC,pYYBAGMkNAKAYJdmAABzkPXhBUk124.png,第47张

(1)DMA_PeripheralBaseAddr——DMA传输的外设基地址,一般该地址为外设的数据寄存器地址,如果使用存储器到存储器传输,则为其中一个存储器的基地址。

(2)DMA_MemoryBaseAddr——DMA传输的存储器基地址,通常是程序开辟的一段内存的起始地址。

(3)DMA_DIR——DMA传输方向,可以设定外设到存储器,存储器到外设,配置参数如表10-15所示。

模数转换器件—ADC,pYYBAGMkNA2AZRSdAABZ7MjmTNI462.png,第48张

(4)DMA_BufferSize——DMA数据传输的数量,其数据单位与结构体中的外设数据宽度和存储器数据宽度单位一致,有三种类型:Byte(8位)、HalfWord(16位)、word(32位)。DMA_BufferSize设置的是DMA_CNDTRx寄存器的值,范围为0至65535。

(5)DMA_PeripheralInc——外设地址寄存器是否递增,配置参数如表10-16所示。

模数转换器件—ADC,poYBAGMkNCSAZwi2AABdWblchu0187.png,第49张

(6)DMA_MemoryInc——内存地址是否递增,配置参数如表10-17所示。

模数转换器件—ADC,poYBAGMkNDyAAsDzAABgCckfCf4320.png,第50张

(7)DMA_PeripheralDataSize——外设数据宽度,根据外设数据寄存器的宽度可以选择8位、16位、32位数据长度,配置参数如表10-18所示。

模数转换器件—ADC,pYYBAGMkNEyAVLIVAABrujXQZVc287.png,第51张

(8)DMA_MemoryDataSize——存储器数据宽度,可以选择8位、16位、32位数据长度,如果没有特殊要求,应与外设数据宽度保持一致,配置参数如表10-19所示。

模数转换器件—ADC,poYBAGMkNG-AecQ3AABs0hiraWk145.png,第52张

(9)DMA_Mode ——DMA工作模式,可以设置为循环模式和非循环模式,配置参数如表10-20所示。

模数转换器件—ADC,pYYBAGMkNHuAACPKAABHxHug5GA983.png,第53张

(10)DMA_Priority——DMA通道的优先级,配置参数如表10-21所示。

模数转换器件—ADC,pYYBAGMkNIiAKnbVAAB9XMAZf94045.png,第54张

(11)DMA_M2M——使能DMA通道的存储器到存储器传输,配置参数如表10-22所示。

模数转换器件—ADC,poYBAGMkNJSAMGXIAABNO9FCEuI137.png,第55张

2、使能DMA通道

根据所使用的外设,选择使能对应的DMA通道,代码如下:

模数转换器件—ADC,pYYBAGMkNKGAXOoUAAAUxQv56Ig685.png,第56张

DMAy_Channelx:表示DMAx的通道号;NewState:表示使能或使能,ENABLE-使能,DISABLE-失能。比如使能DMA1通道1,代码如下:

模数转换器件—ADC,poYBAGMkNKyAdURfAAANwMFDcxU760.png,第57张

3、DMA中断初始化

DMA的每个通道都有3个事件标志分别为DMA半传输、 DMA传输完成和DMA传输出错,通过检测这三个标志位可以判断当前DMA的传输状态。

DMA通道中断初始化函数如下,对应中断标志位参数如表10-23。

模数转换器件—ADC,poYBAGMkNLaAZhhdAAAaHlGGC2Q088.png,第58张

DMAy_Channelx:表示DMAx的通道号;DMA_IT:表示使能的中断类型;NewState:表示使能或使能,ENABLE-使能,DISABLE-失能。比如使能DMA1通道1的传输完成中断和传输错误中断,代码如下:

模数转换器件—ADC,poYBAGMkNMGARBFQAAALCPIdsE0775.png,第59张

模数转换器件—ADC,pYYBAGMkNOmABRw4AACAyXwna4k711.png,第60张

4、中断服务函数

DMA控制器的每个通道都有一个中断服务函数,以STM32F103ZE系列为例,一共有12通道,对应着12个DMA通道服务函数。DMA通道服务函数名称如下:

模数转换器件—ADC,poYBAGMkNPiATl1UAAAQYMS6008828.png,第61张

模数转换器件—ADC,pYYBAGMkNQWAVf3fAAANl6XWfSw523.png,第62张

进入中断函数后需要检测中断类型,DMA通道中断标志位如表10-24所示。如果检测到DMA传输完成后边可以处理数据,如果检测到传输错误标志位,则需要舍弃数据或者重新开始传输。中断标志位检测函数如下:

模数转换器件—ADC,poYBAGMkNRWADIa7AAAR4HQVJR0795.png,第63张

对应清除中断标志位函数如下:

模数转换器件—ADC,poYBAGMkNSuAIp1-AAARAWh9lCs299.png,第64张

模数转换器件—ADC,poYBAGMkNTiAZHmlAACEaPj87aI272.png,第65张

6 10.6 ADC独立模式规则组多通道转换—DMA模式

由于ADC规则组多通道转换时,只能读取到最后一个通道的数据,因此ADC的多通道转换天生适合DMA模式,当每个通达转换完毕后,发送DMA请求,通过DMA直接传输到设定的内存缓存区中,从而解决了ADC多通道转换数据被覆盖的问题,同时CPU不需要频繁读取ADC的数据,大幅提高执行效率。

单ADC模式下,只有ADC1和ADC3拥有DMA功能。而双ADC模式下ADC2转换的数据通过ADC1的DMA功能传输。

STM32F103内部温度传感器可以检测芯片周围的温度,支持的温度范围为:-40~125度,精度为±1.5℃左右。计算公式为:T(℃) ={(V25-Vsense)/ Avg_Slope}+25,式中:V25表示:Vsense 在25度时的数值(典型值为1.43),Vsense为测得的通道16的电压值;Avg_Slope表示:温度与 Vsense 曲线的平均斜率(单位: mv/℃或 uv/℃)(典型值: 4.3mv/℃)。

STM32F103内部还有一个标准电压测量点VREFINT,这个电压不随外部供电电压的波动而变化,因此有相对较高的精度。因此在外部参考电压VREF+精确度不高时,可以用内部参考电压来校正。

校准方式如下:

首先读出ADC1通道1转换结果,记为ADch1;然后读取内部参照电压VREFINT所在通道17的转换结果,记为ADch17;记通道1被测量的模拟信号电压为Uch1,则有:

模数转换器件—ADC,pYYBAGMkNUmABodgAAAg0T12Ipk246.png,第66张

注:VREFINT的典型值是1.20V,最小值是1.16V,最大值是1.24V。一般取VREFINT = 1.2V。

通过公式(2)和(3)得出

模数转换器件—ADC,poYBAGMkNVSALWuNAAAzF-BOSEU184.png,第67张

VREF+由于容易受外界干扰,并不是标准的3.3V,而VREFINT是相对准确的,因此通过内部参考电压校准后,既可以测量通道电压,又可以提高测量精度。

如果使用ADC1的内部温度传感器(通道16)和参照电压功能(通道17)需要使能这两个功能。具体函数如下:

模数转换器件—ADC,poYBAGMkNWGAVVS1AAAKvfMAWwA142.png,第68张

本节通过TIM3更新事件触发ADC规则组3路通道转换,分别用来测量板载电压、内部温度传感器、以及参照电压的值,同时通过参照电压计算板载电压值,以此减少由于参考电压VREF+不准确导致的测量误差。

首先ADC转换时要避免因循环工作造成资源浪费,本节依旧采用外部触发ADC规则组转换,采用定时器3更新事件作为触发源,间隔500ms触发一次转换。

其次,由于DMA工作在循环模式,如果读取数据不及时,容易出现数据读取时被覆盖。为此,将DMA缓冲区设置为被测数据的2倍大小,当第一次规则组3通道依次转换完毕后,DMA将数据依次传输到缓冲区的前半区,同时设置DMA传输过半标志位,此时可以读取当前3通道转换的数据。同时规则组继续转换,当第二次3个通道依次转换完毕时,转换数据被存储到缓冲区的后半区,同时设置DMA传输完成标志位,此时可以读取第二次转换的数据。

具体代码如下:

模数转换器件—ADC,poYBAGMkNXaAeF0vAAEMBEeb7pE764.png,第69张

模数转换器件—ADC,pYYBAGMkNYuAMNFtAAFMmGBerhQ747.png,第70张

模数转换器件—ADC,pYYBAGMkNZ2AdP2KAAFOuT5vLD4793.png,第71张

模数转换器件—ADC,poYBAGMkNbGAdq-bAAE-Pjjso0Y409.png,第72张

模数转换器件—ADC,poYBAGMkNb-ALShPAAC_W2Bq54Q750.png,第73张

7 10.7 练习

熟悉规则组与注入组混合转换,通过TIM3_TRGO触发规则组测量板载电压和内部温度传感器,通过TIM2_CCR1触发注入组测量参照电压值,并且通过内部参照电压的测量值,校准板载电压和内部温度传感器。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2997597.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-26
下一篇 2022-09-26

发表评论

登录后才能评论

评论列表(0条)

保存