一、ADC原理
ADC指模/数转换器或者模拟/数字转换器。是将连续变量的模拟信号转换为离散的数字信号的器件。典型的模拟数字转换器是将模拟信号转换为表示一定比例电压值的数字信号。ADC的输入时钟不得超过14MHz,否则将导致结果准确度下降,是由PCLK2经分频产生。
1、STM32F10x 类型的ADC特点 :
图1 ADC原理图
2、ADC通道和引脚对应关系
3、规则通道和注入通道
STM32 将 ADC 的转换分为 2 个通道组:规则通道组和注入通道组。规则通道相当于你正常运行的程序,而注入通道呢,就相当于中断。在你程序正常执行的时候,中断是可以打断你的执行的。同这个类似,注入通道的转换可以打断规则通道的转换, 在注入通道被转换完成之后,规则通道才得以继续转换。
规则组由多达16个转换组成,注入组由多达4个转换组成。
二、ADC常用的库函数功能与作用
(1)void ADC_DeInit(ADC_TypeDef* ADCx);
初始化ADCx外围寄存器为默认,调用RCC_APB2PeriphResetCmd()函数进行复位。
(2) void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
ADC初始化函数, ADC_TypeDef*对ADC进行选择。ADC_InitTypeDef对ADC进行配置,包括(1)模式:十种操作模式选择。(2)扫描模式:是否开启扫描。(3)转换模式:是否开启连续转换模式。(4)启动规则组外部事件: 选择是哪种启动。(5)数据对齐方式:左对齐或者右对齐。(6)通道数目:最多16个。
(3)void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct);
用默认值对ADC进行结构体形式的初始化 ,初始化参数和上面六个参数一样,但都是默认值。
(4) void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
使能或者失能指定的ADC外设。
(5)void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState);
使能或者失能指定的ADC外设的DMA请求,只有ADC1和ADC3能产生DMA请求。
(6)void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);
ADC中断配置,1.ADC外设选择。2.中断选择:EOC、JEOC、AWD。3.中断使能。
(7)void ADC_ResetCalibration(ADC_TypeDef* ADCx);
复位选中的ADC校准寄存器
(8)FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);
获取ADC复位校准状态,0.校准完成 1.开始校准。
(9) void ADC_StartCalibration(ADC_TypeDef* ADCx);
开始ADC校准。
(10)FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);
获取ADC校准状态,0.校准完成 1.开始校准。7、8、9、10是整个ADC校准过程。
(11)void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
选择使用外部事件启动转换 的软件启动,使能或者失能选定的ADC软件启动转换。
(12)FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx);
获取选定的ADC软件开始转换状态,检查转换是否开始 。
(13)void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
ADC规则通道参数配置,1.选择ADC外设。2.确定ADC通道。3.设置转换排名。4.选择采样时间。
(14)uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);
获取规则通道的最后一个ADCx转换结果数据。
(15)FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);
获取ADC状态标志,主要获取SR寄存器中五种状态标志。
三、ADC一般配置过程
GPIO_Init();
APB2PeriphClockCmd();
② 复位ADC1,同时设置ADC1分频因子。
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
ADC_DeInit(ADC1);
③ 初始化ADC1参数,设置ADC1的工作模式以及规则序列的相关信息。
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
④ 使能ADC并校准。
ADC_Cmd(ADC1, ENABLE);
⑤ 配置规则通道参数:
ADC_RegularChannelConfig();
⑥开启软件转换:ADC_SoftwareStartConvCmd(ADC1);
⑦等待转换完成,读取ADC值。
ADC_GetConversionValue(ADC1);