你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 4032|回复: 1

【连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第二十二章 ADC实验

[复制链接]

50

主题

7

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2013-1-30 18:24:05 | 显示全部楼层 |阅读模式
<span class="postbody" id="post_body_66138">第二十二章 ADC实验

本章我们将向大家介绍STM32ADC功能。在本章中,我们将使用STM32ADC1通道0来采样外部电压值,并在TFTLCD模块上显示出来。本章将分为如下几个部分:
22.1 STM32 ADC简介
22.2 硬件设计
22.3 软件设计
22.4 下载验证
22.1 STM32 ADC简介

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

 
 
22.1.1 ADC_CR1寄存器各位描述

这里我们不再详细介绍每个位,而是抽出几个我们本章要用到的位进行针对性的介绍,详细的说明及介绍,请参考《STM32参考手册》第11章的相关章节。
ADC_CR1SCAN位,该位用于设置扫描模式,由软件设置和清除,如果设置为1,则使用扫描模式,如果为0,则关闭扫描模式。在扫描模式下,由ADC_SQRxADC_JSQRx寄存器选中的通道被转换。如果设置了EOCIEJEOCIE,只在最后一个通道转换完毕后才会产生EOCJEOC中断。
       ADC_CR1[1916]用于设置ADC的操作模式,详细的对应关系如图22.1.2所示:
 

 
 
22.1.2 ADC操作模式

本章我们要使用的是独立模式,所以设置这几位为0就可以了。接着我们介绍ADC_CR2,该寄存器的各位描述如图22.1.3所示:
 

 
 
22.1.3 ADC_CR2寄存器操作模式

该寄存器我们也只针对性的介绍一些位:ADCON位用于开关AD转换器。而CONT位用于设置是否进行连续转换,我们使用单次转换,所以CONT位必须为0CALRSTCAL用于AD校准。ALIGN用于设置数据对齐,我们使用右对齐,该位设置为0
EXTSEL[20]用于选择启动规则转换组转换的外部事件,详细的设置关系如图22.1.4所示:
 


 
 
22.1.4 ADC选择启动规则转换事件设置

我们这里使用的是软件触发(SWSTART),所以设置这3个位为111ADC_CR2SWSTART位用于开始规则通道的转换,我们每次转换(单次转换模式下)都需要向该位写1AWDEN为用于使能温度传感器和VrefintSTM32内部的温度传感器我们将在下一节介绍。
第二个要介绍的是ADC采样事件寄存器(ADC_SMPR1ADC_SMPR2),这两个寄存器用于设置通道0~17的采样时间,每个通道占用3个位。ADC_SMPR1的各位描述如图22.1.5所示:
 

 
22.1.5  ADC_SMPR1寄存器各位描述

ADC_SMPR2的各位描述如下图22.1.6所示:
 


22.1.6  ADC_SMPR2寄存器各位描述

对于每个要转换的通道,采样时间建议尽量长一点,以获得较高的准确度,但是这样会降低ADC的转换速率。ADC的转换时间可以由以下公式计算:
                               Tcovn=采样时间+12.5个周期
其中:Tcovn为总转换时间,采样时间是根据每个通道的SMP位的设置来决定的。例如,当ADCCLK=14Mhz的时候,并设置1.5个周期的采样时间,则得到:Tcovn=1.5+12.5=14个周期=1us
第三个要介绍的是ADC规则序列寄存器(ADC_SQR1~3,该寄存器总共有3个,这几个寄存器的功能都差不多,这里我们仅介绍一下ADC_SQR1,该寄存器的各位描述如图22.1.7所示:
 

 
 
22.1.7  ADC_ SQR1寄存器各位描述

L[30]用于存储规则序列的长度,我们这里只用了1个,所以设置这几个位的值为0。其他的SQ13~16则存储了规则序列中第13~16个通道的编号(0~17)。另外两个规则序列寄存器同ADC_SQR1大同小异,我们这里就不再介绍了,要说明一点的是:我们选择的是单次转换,所以只有一个通道在规则序列里面,这个序列就是SQ1,通过ADC_SQR3的最低5位(也就是SQ1)设置。
第四个要介绍的是ADC规则数据寄存器(ADC_DR)。规则序列中的AD转化结果都将被存在这个寄存器里面,而注入通道的转换结果被保存在ADC_JDRx里面。ADC_DR的各位描述如图22.1.8
 

 
 
22.1.8  ADC_ JDRx寄存器各位描述

这里要提醒一点的是,该寄存器的数据可以通过ADC_CR2ALIGN位设置左对齐还是右对齐。在读取数据的时候要注意。
最后一个要介绍的ADC寄存器为ADC状态寄存器(ADC_SR),该寄存器保存了ADC转换时的各种状态。该寄存器的各位描述如图22.1.9所示:
 

 

 
22.1.9  ADC_ SR寄存器各位描述

这里我们要用到的是EOC位,我们通过判断该位来决定是否此次规则通道的AD转换已经完成,如果完成我们就从ADC_DR中读取转换结果,否则等待转换完成。
通过以上介绍,我们了解了STM32的单次转换模式下的相关设置,本章我们使用ADC1的通道1来进行AD转换,其详细设置步骤如下:
1)开启PA口时钟,设置PA1为模拟输入。
STM32F103ZET6ADC通道1PA1上,所以,我们先要使能PORTA的时钟,然后设置PA1为模拟输入。
2)使能ADC1时钟,并设置分频因子。
要使用ADC1,第一步就是要使能ADC1的时钟,在使能完时钟之后,进行一次ADC1的复位。接着我们就可以通过RCC_CFGR设置ADC1的分频因子。分频因子要确保ADC1的时钟(ADCCLK)不要超过14Mhz
3)设置ADC1的工作模式。
在设置完分频因子之后,我们就可以开始ADC1的模式配置了,设置单次转换模式、触发方式选择、数据对齐方式等都在这一步实现。
4)设置ADC1规则序列的相关信息。
接下来我们要设置规则序列的相关信息,我们这里只有一个通道,并且是单次转换的,所以设置规则序列中通道数为1,然后设置通道1的采样周期。
5)开启AD转换器,并校准。
在设置完了以上信息后,我们就开启AD转换器,执行复位校准和AD校准,注意这两步是必须的!不校准将导致结果很不准确。
6)读取ADC值。
在上面的校准完成之后,ADC就算准备好了。接下来我们要做的就是设置规则序列1里面的通道,然后启动ADC转换。在转换结束后,读取ADC1_DR里面的值就是了。
这里还需要说明一下ADC的参考电压,战舰STM32开发板使用的是STM32F103ZET6,该芯片有外部参考电压:Vref-Vref+,其中Vref-必须和VSSA连接在一起,而Vref+的输入范围为:2.4~VDDA。战舰STM23开发板通过P7端口,设置Vref-Vref+设置参考电压,默认的我们是通过跳线帽将Vref-接到GNDVref+接到VDDA,参考电压就是3.3V。如果大家想自己设置其他参考电压,将你的参考电压接在Vref-Vref+上就OK了。本章我们的参考电压设置的是3.3V
通过以上几个步骤的设置,我们就能正常的使用STM32ADC1来执行AD转换操作了。
22.2硬件设计

本实验用到的硬件资源有:
1)  指示灯DS0
2)  TFTLCD模块
3)  ADC
4)  杜邦线 
前面2个均已介绍过,而ADC属于STM32内部资源,实际上我们只需要软件设置就可以正常工作,不过我们需要在外部连接其端口到被测电压上面。本章,我们通过ADC1的通道1PA1)来读取外部电压值,战舰STM32开发板没有设计参考电压源在上面,但是板上有几个可以提供测试的地方:13.3V电源。2GND3,后备电池。注意:这里不能接到板上5V电源上去测试,这可能会烧坏ADC!
因为要连接到其他地方测试电压,所以我们需要1跟杜邦线,或者自备的连接线也可以,一头插在多功能端口P14ADC插针上(与PA1连接),另外一头就接你要测试的电压点(确保该电压不大于3.3V即可)。
22.3 软件设计

找到上一章的工程,首先在HARDWARE文件夹下新建一个ADC的文件夹。然后打开USER文件夹下的工程,新建一个adc.c的文件和adc.h的头文件,保存在ADC文件夹下,并将ADC文件夹加入头文件包含路径。
打开adc.c,输入如下代码:
#include "adc.h"
#include "delay.h"                      
//初始化ADC
//这里我们仅以规则通道为例
//我们默认仅开启通道1     
void Adc_Init(void)
{   
       //先初始化IO

<span lang="EN-US">      RCC->APB2ENR|=1APB2ENR|=1

《STM32开发指南》第二十二章 ADC实验.rar

下载

998.43 KB, 下载次数: 35, 下载积分: ST金币 -1

实验17 ADC实验.rar

下载

106.23 KB, 下载次数: 50, 下载积分: ST金币 -1

回复

使用道具 举报

5

主题

53

回帖

0

蝴蝶豆

初级会员

最后登录
2019-7-5
发表于 2013-3-8 17:12:13 | 显示全部楼层

RE:【连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第二十二章 ADC实验

首先谢谢版主分享宝贵的设计经验。
请问版主,有没有试过多通道ADC一起采样?我在没有添加ucos系统的情况下能正常工作,但是在加了系统后,两路ADC一起转换,程序的设置在有无系统的情况下基本一致,但是加了系统的两路ADC转换就有问题,感觉就像是第二通道的转换结果页串到了第一通道的转换结果中,导致ADC采样输出的波形很复杂,但观看复杂波形的上包络却是ADC输入IO的波形,请问这是什么原因?
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版