打印
[STM32F4]

【正点原子探索者STM32F407开发板】第23章ADC模数转换实验

[复制链接]
3298|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhangyang86|  楼主 | 2014-12-18 17:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
第二十三章 ADC实验
1.硬件平台:正点原子探索者STM32F407开发板2.软件平台:MDK5.13.固件库版本:V1.4.0
实验18 ADC实验.zip (519.05 KB)

第二十三章 ADC实验-STM32F4开发指南-正点原子探索者STM32开发板.pdf (1.11 MB)

本章我们将向大家介绍STM32F4的ADC功能。在本章中,我们将使用STM32F4的ADC1通道5来采样外部电压值,并在TFTLCD模块上显示出来。本章将分为如下几个部分:
23.1 STM32F4 ADC简介
23.2 硬件设计
23.3 软件设计
23.4 下载验证

23.1 STM32F4 ADC简介
STM32F4xx系列一般都有3个ADC,这些ADC可以独立使用,也可以使用双重/三重模式(提高采样率)。STM32F4的ADC是12位逐次逼近型的模拟数字转换器。它有19个通道,可测量16个外部源、2个内部源和Vbat通道的信号。这些通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。 模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。
STM32F407ZGT6包含有3个ADC。STM32F4的ADC最大的转换速率为2.4Mhz,也就是转换时间为1us(在ADCCLK=36M,采样周期为3个ADC时钟下得到),不要让ADC的时钟超过36M,否则将导致结果准确度下降。
STM32F4将ADC的转换分为2个通道组:规则通道组和注入通道组。规则通道相当于你正常运行的程序,而注入通道呢,就相当于中断。在你程序正常执行的时候,中断是可以打断你的执行的。同这个类似,注入通道的转换可以打断规则通道的转换, 在注入通道被转换完成之后,规则通道才得以继续转换。
通过一个形象的例子可以说明:假如你在家里的院子内放了5个温度探头,室内放了3个温度探头;你需要时刻监视室外温度即可,但偶尔你想看看室内的温度;因此你可以使用规则通道组循环扫描室外的5个探头并显示AD转换结果,当你想看室内温度时,通过一个按钮启动注入转换组(3个室内探头)并暂时显示室内温度,当你放开这个按钮后,系统又会回到规则通道组继续检测室外温度。从系统设计上,测量并显示室内温度的过程中断了测量并显示室外温度的过程,但程序设计上可以在初始化阶段分别设置好不同的转换组,系统运行中不必再变更循环转换的配置,从而达到两个任务互不干扰和快速切换的结果。可以设想一下,如果没有规则组和注入组的划分,当你按下按钮后,需要从新配置AD循环扫描的通道,然后在释放按钮后需再次配置AD循环扫描的通道。
上面的例子因为速度较慢,不能完全体现这样区分(规则通道组和注入通道组)的好处,但在工业应用领域中有很多检测和监视探头需要较快地处理,这样对AD转换的分组将简化事件处理的程序并提高事件处理的速度。
STM32F4其ADC的规则通道组最多包含16个转换,而注入通道组最多包含4个通道。关于这两个通道组的详细介绍,请参考《STM32F4xx中文参考手册》第250页,第11.3.3节。
STM32F4的ADC可以进行很多种不同的转换模式,这些模式在《STM32F4xx中文参考手册》的第11章也都有详细介绍,我们这里就不在一一列举了。我们本章仅介绍如何使用规则通道的单次转换模式。
STM32F4的ADC在单次转换模式下,只执行一次转换,该模式可以通过ADC_CR2寄存器的ADON位(只适用于规则通道)启动,也可以通过外部触发启动(适用于规则通道和注入通道),这时CONT位为0。
以规则通道为例,一旦所选择的通道转换完成,转换结果将被存在ADC_DR寄存器中,EOC(转换结束)标志将被置位,如果设置了EOCIE,则会产生中断。然后ADC将停止,直到下次启动。
接下来,我们介绍一下我们执行规则通道的单次转换,需要用到的ADC寄存器。第一个要介绍的是ADC控制寄存器(ADC_CR1和ADC_CR2)。ADC_CR1的各位描述如图23.1.1所示:



图23.1.1 ADC_CR1寄存器各位描述
这里我们不再详细介绍每个位,而是抽出几个我们本章要用到的位进行针对性的介绍,详细的说明及介绍,请参考《STM32F4xx中文参考手册》第11.13.2节。
ADC_CR1的SCAN位,该位用于设置扫描模式,由软件设置和清除,如果设置为1,则使用扫描模式,如果为0,则关闭扫描模式。在扫描模式下,由ADC_SQRx或ADC_JSQRx寄存器选中的通道被转换。如果设置了EOCIE或JEOCIE,只在最后一个通道转换完毕后才会产生EOC或JEOC中断。
ADC_CR1[25:24]用于设置ADC的分辨率,详细的对应关系如图23.1.2所示:
图23.1.2 ADC分辨率选择
本章我们使用12位分辨率,所以设置这两个位为0就可以了。接着我们介绍ADC_CR2,该寄存器的各位描述如图23.1.3所示:
图23.1.3 ADC_CR2寄存器各位描述
该寄存器我们也只针对性的介绍一些位:ADON位用于开关AD转换器。而CONT位用于设置是否进行连续转换,我们使用单次转换,所以CONT位必须为0。ALIGN用于设置数据对齐,我们使用右对齐,该位设置为0。
EXTEN[1:0]用于规则通道的外部触发使能设置,详细的设置关系如图23.1.4所示:
图23.1.4 ADC规则通道外部触发使能设置
我们这里使用的是软件触发,即不使用外部触发,所以设置这2个位为0即可。ADC_CR2的SWSTART位用于开始规则通道的转换,我们每次转换(单次转换模式下)都需要向该位写1。
第二个要介绍的是ADC通用控制寄存器(ADC_CCR),该寄存器各位描述如图23.1.5所示:
图23.1.5 ADC_CCR寄存器各位描述
该寄存器我们也只针对性的介绍一些位:TSVREFE位是内部温度传感器和Vrefint通道使能位,内部温度传感器我们将在下一章介绍,这里我们直接设置为0。ADCPRE[1:0]用于设置ADC输入时钟分频,00~11分别对应2/4/6/8分频,STM32F4的ADC最大工作频率是36Mhz,而ADC时钟(ADCCLK)来自APB2,APB2频率一般是84Mhz,所以我们一般设置ADCPRE=01,即4分频,这样得到ADCCLK频率为21Mhz。MULTI[4:0]用于多重ADC模式选择,详细的设置关系如图23.1.6所示:
图23.1.6 多重ADC模式选择设置
       本章我们仅用了ADC1(独立模式),并没用到多重ADC模式,所以设置这5个位为0即可。
第三个要介绍的是ADC采样时间寄存器(ADC_SMPR1和ADC_SMPR2),这两个寄存器用于设置通道0~18的采样时间,每个通道占用3个位。ADC_SMPR1的各位描述如图23.1.7所示:
                             图23.1.7 ADC_SMPR1寄存器各位描述
ADC_SMPR2的各位描述如下图23.1.8所示:
图23.1.8 ADC_SMPR2寄存器各位描述
对于每个要转换的通道,采样时间建议尽量长一点,以获得较高的准确度,但是这样会降低ADC的转换速率。ADC的转换时间可以由以下公式计算:
                                Tcovn=采样时间+12个周期
其中:Tcovn为总转换时间,采样时间是根据每个通道的SMP位的设置来决定的。例如,当ADCCLK=21Mhz的时候,并设置3个周期的采样时间,则得到:Tcovn=3+12=15个周期=0.71us。
第四个要介绍的是ADC规则序列寄存器(ADC_SQR1~3),该寄存器总共有3个,这几个寄存器的功能都差不多,这里我们仅介绍一下ADC_SQR1,该寄存器的各位描述如图23.1.9所示:
图23.1.9  ADC_ SQR1寄存器各位描述
L[3:0]用于存储规则序列的长度,我们这里只用了1个,所以设置这几个位的值为0。其他的SQ13~16则存储了规则序列中第13~16个通道的编号(0~18)。另外两个规则序列寄存器同ADC_SQR1大同小异,我们这里就不再介绍了,要说明一点的是:我们选择的是单次转换,所以只有一个通道在规则序列里面,这个序列就是SQ1,至于SQ1里面哪个通道,完全由用户自己设置,通过ADC_SQR3的最低5位(也就是SQ1)设置。
第五个要介绍的是ADC规则数据寄存器(ADC_DR)。规则序列中的AD转化结果都将被存在这个寄存器里面,而注入通道的转换结果被保存在ADC_JDRx里面。ADC_DR的各位描述如图23.1.10:
图23.1.10  ADC_ JDRx寄存器各位描述
这里要提醒一点的是,该寄存器的数据可以通过ADC_CR2的ALIGN位设置左对齐还是右对齐。在读取数据的时候要注意。
最后一个要介绍的ADC寄存器为ADC状态寄存器(ADC_SR),该寄存器保存了ADC转换时的各种状态。该寄存器的各位描述如图23.1.11所示:
                                   图23.1.11  ADC_ SR寄存器各位描述
这里我们仅介绍将要用到的是EOC位,我们通过判断该位来决定是否此次规则通道的AD转换已经完成,如果该位位1,则表示转换完成了,就可以从ADC_DR中读取转换结果,否则等待转换完成。
至此,本章要用到的ADC相关寄存器全部介绍完毕了,对于未介绍的部分,请大家参考《STM32F4xx中文参考手册》第11章相关章节。通过以上介绍,我们了解了STM32F4的单次转换模式下的相关设置,接下来我们介绍使用库函数来设置ADC1的通道5来进行AD转换的步骤,这里需要说明一下,使用到的库函数分布在stm32f4xx_adc.c文件和stm32f4xx_adc.h文件中。下面讲解其详细设置步骤:
1)开启PA口时钟和ADC1时钟,设置PA5为模拟输入。
STM32F407ZGT6的ADC1通道5在PA5上,所以,我们先要使能GPIOA的时钟,然后设置PA5为模拟输入。同时我们要把PA5复用为ADC,所以我们要使能ADC1时钟。
这里特别要提醒,对于IO口复用为ADC我们要设置模式为模拟输入,而不是复用功能,也不需要调用GPIO_PinAFConfig函数来设置引脚映射关系。
使能GPIOA时钟和ADC1时钟都很简单,具体方法为:
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC1时钟
初始化GPIOA5为模拟输入,方法也多次讲解,关键代码为:
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入
    这里需要说明一下,ADC的通道与引脚的对应关系在STM32F4的数据手册可以查到,我们这里使用ADC1的通道5,在数据手册中的表格为:
表23.1.12 ADC1通道5对应引脚查看表
这里我们把ADC1~ADC3的引脚与通道对应关系列出来, 16个外部源的对应关系如下表:
通道号
ADC1
ADC2
ADC3
通道0
PA0
PA0
PA0
通道1
PA1
PA1
PA1
通道2
PA2
PA2
PA2
通道3
PA3
PA3
PA3
通道4
PA4
PA4
PF6
通道5
PA5
PA5
PF7
通道6
PA6
PA6
PF8
通道7
PA7
PA7
PF9
通道8
PB0
PB0
PF10
通道9
PB1
PB1
PF3
通道10
PC0
PC0
PC0
通道11
PC1
PC1
PC1
通道12
PC2
PC2
PC2
通道13
PC13
PC13
PC13
通道14
PC4
PC4
PF4
通道15
PC5
PC5
PF5

表23.1.13 ADC1~ADC3引脚对应关系表


由于论坛篇幅限制,请下载附件学习。



实验详细手册和源码下载地址:http://www.openedv.com/posts/list/41586.htm


正点原子探索者STM32F407开发板购买地址:http://item.taobao.com/item.htm?id=41855882779
  




沙发
dj狂人| | 2014-12-18 21:34 | 只看该作者
学习了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:正点原子STM32开发板购买单击这里

80

主题

916

帖子

51

粉丝