CKS32F107xx系列MCU中ADC介绍

描述

CKS32F107xx系列产品提供2个12位的模拟/数字转换器(ADC),每个ADC共用多达16个外部通道,各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。

A/D转换器的供电和参考电压

为了提高转换的精确度,ADC使用一个独立的电源供电,其电源引脚为VDDA和VSSA,从而过滤和屏蔽来自印刷电路板上的毛刺干扰。在进行硬件设计的时候,VDDA和VSSA必须分别连接到VDD和VSS。对于100脚封装的,为了确保输入为低压时获得更好精度,用户可以连接一个独立的外部参考电压ADC到VREF+和VREF-脚上,其中,VREF-引脚必须连接到VSSA,而VREF+的电压范围为2.4V~VDDA。对于64引脚封装的,没有VREF+和VREF-引脚,他们在芯片内部与ADC的电源(VDDA)和地(VSSA)相联。

ADC转换时间

ADC输入时钟ADC_CLK由PCLK2 经过分频产生,最大是14M,分频因子由RCC时钟配置寄存器RCC_CFGR的位15:14 ADCPRE[1:0]设置,可以是2/4/6/8分频,注意这里没有1分频。一般我们设置PCLK2=HCLK=72M。ADC使用若干个ADC_CLK周期对输入电压采样,采样周期数目可以通过ADC_SMPR1和 ADC_SMPR2寄存器中的SMP[2:0]位更改。每个通道可以分别用不同的时间采样。 总转换时间如下计算:TCONV=采样时间+12.5个周期。例如当ADCCLK=14MHz,采样时间为1.5周期,则总的转换时间TCONV=1.5+12.5=14周期=1us。

ADC数据寄存器

ADC转换完成后的数据输出寄存器。根据转换组的不同,规则组的完成转换的数据输出到ADC_DR寄存器,注入组的完成转换的数据输出到ADC_JDRx寄存器。假如是使用双重模式,规则组的数据也是存放在ADC_DR寄存器。ADC规则组数据寄存器ADC_DR是一个32位的寄存器,独立模式时只使用到该寄存器低16位保存ADC1/2的规则转换数据。在双ADC模式下,高16位用于保存ADC2转换的数据,低16位用于保存ADC1转换的数据。因为ADC的精度是12位的,ADC_DR寄存器无论高16位还是低16位,存放数据的位宽都是16 位的,所以允许选择数据对齐方式。由ADC_CR2寄存器的ALIGN位设置数据对齐方式,可选择:右对齐或者左对齐。如果使用多通道转换,那么这些通道的数据 也会存放在ADC_DR里面,按照规则组的顺序,上一个通道转换的数据,会被下一个通道转换的数据覆盖掉,所以当通道转换完成后要及时把数据取走。比较常用的方法是使用DMA模式。当规则组的通道转换结束时,就会产生DMA请求,这样就可以及时把转换的数据搬运到用户指定的目的地址存放。注意:只有ADC1可以产生DAM请求,而由ADC2转换的数据可以通过双ADC模式,利用ADC1的 DMA功能传输。

ADC中断

ADC中断可分为三种:规则组转换结束中断、注入组转换结束中断、设置了模拟看门狗状态位中断。它们都有独立的中断使能位,分别由ADC_CR 寄存器的EOCIE、JEOCIE、AWDIE位设置,对应的标志位分别是EOC、JEOC、AWD。

ADC初始化结构体详解

ADC_InitTypeDef结构体用于设置ADC的工作参数,并由标准库函数ADC_Init()调用这些设定参数进入设置外设相应的寄存器,达到配置外设工作环境的目的。其具体的定义如下:

typedef struct

{

uint32_t ADC_Mode;                     

FunctionalState ADC_ScanConvMode;     

FunctionalState ADC_ContinuousConvMode;

uint32_t ADC_ExternalTrigConv;          

uint32_t ADC_DataAlign;                

uint8_t ADC_NbrOfChannel;              

}ADC_InitTypeDef;

ADC_Mode:配置ADC的模式,当使用一个ADC时是独立模式,使用两个ADC 时是双模式,在双模式下还有很多细分模式可选,具体配置ADC_CR1:DUALMOD位。

ScanConvMode:可选参数为ENABLE和DISABLE,配置是否使用扫描。如果是单通道AD转换使用DISABLE,如果是多通道AD转换使用ENABLE,具体配置 ADC_CR1:SCAN位。

ADC_ContinuousConvMode:可选参数为 ENABLE 和 DISABLE,配置是启动自动连续转换还是单次转换。使用ENABLE配置为使能自动连续转换;使用 DISABLE 配置为单次转换,转换一次后停止需要手动控制才重新启动转换,具体配置 ADC_CR2:CON位。

ADC_ExternalTrigConv:外部触发选择,ADC有很多外部触发条件,可根据项目需求配置触发来源。实际上,我们一般使用软件自动触发。

ADC_DataAlign:转换结果数据对齐模式,可选右对齐ADC_DataAlign_Right 或者左对齐ADC_DataAlign_Left。

ADC_NbrOfChannel:AD转换通道数目,根据实际设置即可。具体的通道数和通道的转换顺序是配置规则序列或注入序列寄存器。

CKS32F103XX ADC单通道采集实验

本实验使用规则组单通道的单次转换模式,并且通过软件触发,即由ADC_CR2寄存器的SWSTART位启动。下面讲解其详细设置步骤:

1) 开启PA口时钟和ADC1时钟,设置PA1为模拟输入。

CKS32F107xx的ADC通道1在PA1上,所以,我们先要使能PORTA的时钟和ADC1时钟,然后设置PA1为模拟输入。使能GPIOA和ADC时钟用RCC_APB2PeriphClockCmd函数,设置 PA1的输入方式,使用GPIO_Init函数即可。

2) 复位 ADC1,同时设置 ADC1 分频因子。 

开启ADC1时钟之后,我们要复位ADC1,将ADC1的全部寄存器重设为缺省值之后我们 就可以通过RCC_CFGR设置ADC1的分频因子。分频因子要确保ADC1的时钟(ADCCLK)不要超过14Mhz。这个我们设置分频因子位6,时钟为72/6=12MHz,库函数的实现方法是: 

RCC_ADCCLKConfig(RCC_PCLK2_Div6);

ADC 时钟复位的方法是:

ADC_DeInit(ADC1);

3) 初始化ADC1参数,设置ADC1的工作模式以及规则序列的相关信息。 

在设置完分频因子之后,我们就可以开始 ADC1 的模式配置了,设置单次转换模式、触发方式选择、数据对齐方式等都在这一步实现。同时,我们还要设置ADC1规则序列的相关信息,我们这里只有一个通道,并且是单次转换的,所以设置规则序列中通道数为1。这些在库函数中是通过函数ADC_Init实现的。

4) 使能ADC并校准。 

在设置完了以上信息后,我们就使能AD转换器,执行复位校准和AD校准,注意这两步 是必须的!不校准将导致结果很不准确。 使能指定ADC的方法是:

ADC_Cmd(ADC1, ENABLE);

执行复位校准的方法是:

ADC_ResetCalibration(ADC1);

执行ADC校准的方法是:

ADC_StartCalibration(ADC1);

每次进行校准之后要等待校准结束。这里是通过获取校准状态来判断是否校准是否结束。等待复位校准结束函数为:

while(ADC_GetResetCalibrationStatus(ADC1));

等待AD校准结束函数为:

while(ADC_GetCalibrationStatus(ADC1));

5)读取ADC值。 

在上面的校准完成之后,ADC就算准备好了。接下来我们要做的就是设置规则序列1里面的通道,采样顺序,以及通道的采样周期,然后启动ADC转换。在转换结束后,读取ADC 转 换结果值就是了。我们这里是规则序列中的第1个转换,同时采样周期为239.5,所以设置为:

ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );

软件开启ADC转换的方法是:

ADC_SoftwareStartConvCmd(ADC1, ENABLE);

开启转换之后,就可以获取转换ADC转换结果数据,方法是:

ADC_GetConversionValue(ADC1);

同时在AD转换中,我们还要根据状态寄存器的标志位来获取AD转换的各个状态信息。库函数获取AD转换的状态信息的函数是:

FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);

比如我们要判断ADC1d的转换是否结束,方法是: 

while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));

通过以上几个步骤的设置,我们就能正常的使用CKS32F107xx的ADC1来执行AD转换操作了。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分