基本信息
文件名称:4.4.STM32 ADC基本功能使用.pptx
文件大小:828.6 KB
总页数:19 页
更新时间:2025-07-03
总字数:约2.13千字
文档摘要

STM32ADC基本功能使用

由于ADC在使用时与硬件连接方式有关,所以其配置方式与定时器等片上资源略有不同。首先需要确认电路与微控制器的连接方式,从而确认需要使用哪一个ADC的哪一个输入通道。

当外部待测电压点连接到STM32F103的PC4时,通过查询其数据手册,如下图所示。从数据可以看出,PC4在微控制器内部可以连接到ADC1、ADC2的输入通道14。因此在配置ADC时,需针对ADC序号与通道序号进行。

时钟初始化。ADC的时钟初始化与其他外设也存在差异。从时钟图可以看出,ADCCLK最高允许14MHz,而APB2时钟为72MHz。因此,在配置ADC时钟时,除需使能ADC时钟外,还需要根据系统时钟设置ADC分频器,以满足ADCCLK的最高时钟频率要求。

使能时钟的方法没有差别。使用我们非常熟悉的RCC_APB2PeriphClockCmd函数,即可使能ADC1时钟。此时,还需要设置ADC的分频器。该函数能够对ADC时钟进行2、4、6、8分频,当系统时钟为72Mhz时,8分频后,ADCCLK频率为9MHz,满足最大14MHz的要求。

ADC的初始化,使用的函数同样符合固件库函数的命名规则。

初始化结构体类型为ADC_InitTypeDef,该类型包含6个域。ADC_ContinuousConvMode表示连续转换模式,需要时设置为ENABLE,否则设置为DISABLE。ADC_DataAlign为转换数据对齐方式,包含左对齐和右对齐。

由于片上ADC为12位,但是C语言的变量类型中只有8位、16位、32位,不存在12位的类型,使用最接近的16位变量类型时,空余的4位是在高位还是地位则由该参数这只。如上图所示,右对齐时,高4位填充0,其余12位为转换结果;左对齐时,则低4位填充0,高12位为转换结果。

ADC_ExternalTrigConv为ADC的外部触发转换方式,即ADC可以由定时器、外部中断等方式直接触发启动转换。当不需要使用外部触发时,可以设置为无外部触发。ADC_ExternalTrigConv_NoneADC_Mode为片上ADC的工作模式。STM32F103的ADC工作模式较多,在初学阶段可以直接选择独立工作模式。ADC_Mode_Independent

ADC_NbrOfChannel是用于多输入通道顺序采样功能,当不需要使用这个功能时,可以直接设置为1。ADC_ScanConvMode为扫描模式使能控制,单通道工作时,不需要使用扫描模式,该参数设置为DISABLE即可。

如右图所示为ADC初始化代码示例。第3行定义ADC初始化结构体变量;第5、6行对ADC1时钟进行初始化;第8行,关闭连续转换模式;第9行,数据右对齐;第10行,无外部触发;第11行,独立模式;第12行,转换1个通道;第13行,关闭扫描转换模式;第15行,初始化ADC1;第16行,使能ADC1。

正如外部中断一样,若需要使用外部中断功能,首先需要对GPIO进行初始化。使用ADC功能时同样需要先对GPIO进行配置。配置代码如图所示。区别在于输入模式将设置为GPIO_Mode_AIN,满足模拟输入的要求。

配置工作完成后,即可开始进行模拟量采集。开发板上是使用一个电位器,并以电位器的中点为采样点,如图所示。随着电位器中间抽头位置的改变,相当于改变了两个串联电阻的阻值,因此中点分得的电压也将发生改变。

根据原理图,电压采样点连接到微控制器的PC4口,现已完成了对PC4口的基本设置及ADC1的初始化配置。接下来可以开始启动转换,并读取实际转换结果。开始转换非常简单,直接使用如下图所示函数即可。

但是,此时的ADC并不清楚需要将对哪个输入通道进行模数转换。ADC1虽然有多个输入通道,但是每次转换只能进行一个通道的模数转换,当有多个通道需要转换时,将按顺序依次进行转换。因此,在启动ADC转换之前,需要告诉ADC,有多少个输入通道需要转换,分别是哪些通道。此外,还需要告诉ADC,对于某个输入通道,使用多长的采样时间。实现该功能的函数如图所示。

对于ADC_RegularChannelConfig的参数:ADCx用于指定ADC序号;ADC_Channel指定需要转换的通道,例如PC4对应的是IN14,此处应使用ADC_Channel_14参数;Rank指定需要转换的通道数,当只需要转换一个通道时,填写1即可。ADC_SampleTime指定采样时间,采样时间长,可以更稳定的采集信号,但采样耗费的时间就长。采样时间不能设置任意时间,只能在其允许的参数中选择。没有特殊要求时,直接设置最长时间即可。ADC_SampleTime_239Cycles5。完整代码如下

启动ADC转换使用的函数如图所示。当需要启动ADC1转换时,直接写ADC_SoftwareSt