STM32中ADC模块的基本原理解析

ADC:Analog-to-Digital Converter的缩写,指模/数转换器或者模拟/数字转换器,是指将连续变量的模拟信号转换位离散的数字信号的器件。典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。

STM32F4x ADC特点:

1、可配置12位、10位、8位或6位分辨率。

2、在转换结束、注入转换结束以及发生模拟看门狗或溢出时间时产生中断。

3、单次和连续转换模式。

4、用于自动将通道0转换为通道“n”的扫描模式。

5、数据对齐以保持内置数据一致性。

6、可独立设置各通道采样时间。

7、外部触发器选项,可为规则转换和注入转换配置极性。

8、不连续采样模式。

9、双重/三重模式(具有2个或则更多ADC的器件提供)。

10、双重/三重ADC模式下可配置的DMA数据存储。

11、双重/三重交替模式下可配置的转换间延迟。

12、ADC转换类型。

13、ADC电源要求:全速运行时为2.4V到3.6V,慢速运行时为1.8V。

14、ADC输入范围:Vref-<=Vin<=Vref+

15、规则通道转换期间可产生DMA请求。

STM32F40x大容量芯片带3个ADC控制器:

其中144脚芯片因为带PF脚,所以多8个通道,为24个外部通道,小于144脚芯片只有16个外部通道。

STM32F4 系列ADC外部通道和引脚对应关系:

ADC引脚:

ADC框图:

 

 

STM32通道组:

1、规则通道组:相当正常运行的程序。最多16个通道。规则通道和它的转换顺序在ADC_SQRx寄存器中选择,规则组转换的总数应写入ADC_SQR1寄存器的L[3:0]中。

2、注入通道组:相当于中断。最多4个通道。注入组和它的转换顺序在ADC_JSQR寄存器中选择。注入组里转化的总数应写入ADC_JSQR寄存器的L[1:0]中。

注入通道就相当于中断,在规则通道执行过程中加入注入通道。

STM32F4的ADC的各个通道可以单次、连续、扫描或者间断执行。

单次转化VS连续转换

单次转换模式:

在单次转换模式下,ADC执行一次转换。CONT位为0时,可通过以下方式启动此模式:

1)将ADC_CR2寄存器中的SWATART位置1(仅适用于规则通道)

2)将JSWATART位置1(仅适用于注入通道)

3)外部触发(适用于规则通道或外部通道)

完成所选通道的转换之后:

1)如果转换了规则通道

——转换数据存储在16位ADC_DR寄存器中

——EOC(转换结束)标志置1

——EOCIE位置1时将产生中断

2)如果转换了注入通道

——转换数据存储在16位ADC_JDR1寄存器中

——JEOC(注入转换结束)标志置1

——JEOCIE位置1时将产生中断

然后ADC停止。

连续转换模式:

在连续转换模式下,ADC结束一个转换后立即启动一个新的转换。CONT位为1时,可通过外部触发或将ADC_CR2寄存器中的SWSTRT位置1来启动此模式(仅适用规则通道)

每次转换之后:

1)如果转换了规则通道组:

——上次转换的数据存储在16位ADC_DR寄存器中

——EOC(转换结束)标志置1

——EOCIE位置1时将产生中断

无法连续转换注入通道。连续模式下唯一的例外情况是,注入通道配置为在规则通道之后自己动转换(使用JAUTO位)。

扫描模式:

此模式用于扫描一组模拟通道。

通过将ADC_CR1寄存器中的SCAN位置1来选择扫描模式。将此位置1后,ADC会扫描在ADC_SQRx寄存器(对于规则通道)或者ASC_JSQR寄存器(对于注入通道)中选择的所有通道。对组中的每一个通道都执行一次转换。每次转换结束之后,会自动转换该组中的下一个通道。如果将CONT位置1,规则通道转换不会在组中最后一个所选通道处停止,而是再次从第一个所选通道继续转换。

如果将DMA位置1,则在每次规则通道转换之后,均使用直接存储器访问(DMA)控制器将转换自规则通道组的数据(存储在ADC_DR寄存器中)传输到SRAM。

在以下情况下,ADC_SR寄存器中的EOC位置1:

——如果EOCS位置清零,在每一个规则组序列转换结束时

——如果EOCS位置1,在每个规则通道转换结束时

从注入通道转换的数据始终存储在ADC_JDRx寄存器中

ADC_CR1控制寄存器1

ADC中断:

当模拟看门狗状态位和溢出状态位分别置1时,规则组和注入组在转换结束时可能会产生中断。可以使用单独的中断使能位以实现灵活性。

ADC_SR寄存器中存在另外两个标志,但这两个标志不存在中断相关性:

——JSTRT(开始转换注入组的通道)

——STRT(开始转换规则组的通道)

ADC_CCR通用控制寄存器

 

不要让ADC时钟超过36MHz,否则可能不准。

ADC_CR1寄存器

在扫描模式下,由ADC_SQRx或ADC_JSQRx寄存器选中的通达被转换,如果设置了EOCIE或则JEOCIE为0。在最后一个通道转换完毕后才会产生EOC或者JEOC中断。

ADC_CR2寄存器

数据对齐方式:

ADC_CR2寄存器中的ALIGN位选择转换后数据存储的对齐方式,数据可以左对齐或右对齐,如图29和图30所示。

注入组通道转换的数值已经减去了在ADC_JOFRx寄存器中定义的偏移亮,因此结果可以是一个负值。SEXT位是扩展的符号值。

对于规则组通道,不需减去偏移值,因此只有12个位有效。

ADC_SMPR1寄存器

ADC_SMPR2寄存器

ADC的采样时间

ADC_SQR1/SQR2/SQR3规则序列寄存器

ADC_DR规则通道数据寄存器

ADC_SR状态寄存器

常用库函数

ADC通用初始化函数ADC_Commonlnit

void ADC_Commonlnit(ADC_CommoninitTypeDef* ADC_CommoninitStruct);

typedef struct

{

  uint32_t ADC_Mode;//多重ADC模式选择

  uint32_t ADC_Prescaler;//ADC预分频

  uint32_t ADC_DMAAccessMode;//DMA访问模式

  uint32_t ADC_TwoSamplingDelay;//2个采样阶段之间的延迟

}ADC_CommonlnitTypeDef;

ADC初始化函数ADC_Init

void ADC_Init(ADC_TypeDef* ADCx_InitTypeDef* ADC_InitStruct);

typedef struct

{

  uint32_t ADC_Resoulation;//ADC分辨率

  FunctionalState ADC_SacnConvMode;//是否使用扫描模式。ADC_CR1位8:SCAN位

  FunctionalState ADC_ContinuousConvMode;

//单次转换or连续转换:ADC_CR2的位:CONT

  uint32_t ADC_ExternalTrigConvEdge;

//外部触发使能方式:ADC_CR2的位29:28,EXTEN

  uint32_t ADC_ExternalTrigConv;//触发方式:ADC_CR2的位[19:17]:EXTSEL[2:0]

  uint32_t ADC_DataAlign;//对齐方式:左对齐还是右对齐:ADC_CR2的位11:ALIGN

  uint8_t ADC_NbrOfChannel;//规则通道序列长度:ADC_SQR1的位[23:20]:L[3:0]

}ADC_InitTypeDef;

 ADC使能函数ADC_Cmd();

void ADC_Cmd(ADC_TypeDef* ADCx,FunctionalState NewState);

ADC_Cmd(ADC1,ENABLE);//使能指定的ADC1

ADC使能软件转换函数ADC_SoftwareStartConvCmd();

void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx,FunctionalState NewState);

ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能ADC1的软件转换启动

ADC规则通道配置函数ADC_RegualrChannelConfig();

void ADC_RegularChannelConfig(ADC_TypeDef* ADCx,uint8_tADC_Channel,uint8_t ADC_SampleTime);

ADC_RegularChannelConfig(ADC1,ADC_Channel_5,1,ADC_SampleTime_480Cycles);

ADC获取转换结果函数ADC_GetConversionValue();

uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);

ADC_GetConversionValue(ADC1);//获取ADC1转换结果

物联沃分享整理
物联沃-IOTWORD物联网 » STM32中ADC模块的基本原理解析

发表评论