(1)配置步骤
1.配置RCC外设时钟 开启GPIO以及ADC外设
2.配置预分配ADCCLK 不能超过14MHZ 一般都是除于6
3.配置GPIO口 初始化为模拟输入的配置 设置专属模式
4.选择规则组的输入通道 选择ADCx以及通道等 去看引脚图
5.配置ADC 初始化配置
6.配置中断以及定时器等等 (需要即配置)
7.开启ADC的电源
8.开启ADC的校准
(2)代码示例
案例1 ADC1单通道 PA0单通道模拟输入实例 单次转化非扫描
void AD_Init(void)
{
//开启对应的RCC时钟外设 要用的GPIO口以及选择的ADC
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//进行预分配处理 该晶振为72MHZ除于预分频值要比14MHZ小才行
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
//进行GPIO的初始化配置 注意的是选择模式为模拟输入
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//选择规则组的输入通道 1、2参数根据引脚图 3参数是次序(1-16)4参数采样时间
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);
//初始化ADC具体函数功能下文会阐述
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;//连续转化非扫描ENABLE
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
//开启ADC电源 启动ADC
ADC_Cmd(ADC1, ENABLE);
//进行ADC校准
//复位校准
ADC_ResetCalibration(ADC1);
//等待复位校准完成
while (ADC_GetResetCalibrationStatus(ADC1) == SET);
//开始校准
ADC_StartCalibration(ADC1);
//等待校准完成
while (ADC_GetCalibrationStatus(ADC1) == SET);
//连续转化非扫描ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
//单次转化非扫描
uint16_t AD_GetValue(void)
{
//触发ADC转换
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
//获取ADC转换标志位状态的函数
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
//获取ADC转换的函数 会自动清除标志位
return ADC_GetConversionValue(ADC1);
}
/*连续转化非扫描
uint16_t AD_GetValue(void)
{
return ADC_GetConversionValue(ADC1);
}*/
案例2 ADC1多通道 PA0123多通道模拟输入实例 标黄处做修改即可
void AD_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1) == SET);
ADC_StartCalibration(ADC1);
while (ADC_GetCalibrationStatus(ADC1) == SET);
}
uint16_t AD_GetValue(uint8_t ADC_Channel)
{
ADC_RegularChannelConfig(ADC1,ADC_Channel,1, ADC_SampleTime_55Cycles5);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
return ADC_GetConversionValue(ADC1);
}
//
uint16_t AD0, AD1, AD2, AD3;
int main(void)
{
OLED_Init();
AD_Init();
OLED_ShowString(1, 1, "AD0:");
OLED_ShowString(2, 1, "AD1:");
OLED_ShowString(3, 1, "AD2:");
OLED_ShowString(4, 1, "AD3:");
while (1)
{
AD0 = AD_GetValue(ADC_Channel_0);
AD1 = AD_GetValue(ADC_Channel_1);
AD2 = AD_GetValue(ADC_Channel_2);
AD3 = AD_GetValue(ADC_Channel_3);
OLED_ShowNum(1, 5, AD0, 4);
OLED_ShowNum(2, 5, AD1, 4);
OLED_ShowNum(3, 5, AD2, 4);
OLED_ShowNum(4, 5, AD3, 4);
Delay_ms(100);
}
}
(3)函数分析
函数1:void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct)
(stm32f10x_adc.h) 该函数为初始化ADC函数,其ADC_InitTypeDef结构体成员变量如下所示。
序号 | 名称 | 参数解释 | 示例 |
参数1 | ADC_Mode | ADC的工作模式独立、双AD | ADC_Mode_Independent(就此为独立模式 其余都是双AD 相对复杂) |
参数2 | ADC_DataAlign | 数据对齐 | ADC_DataAlign_Right(右对齐) |
参数3 | ADC_ExternalTrigConv | 外部触发转换选择 触发源 | ADC_ExternalTrigConv_None(不使用外部触发 内部软件触发) |
参数4 | ADC_ContinuousConvMode | 选择连续转换还是单次转换 | DISABLE(单次模式) ENABLE(连续模式) |
参数5 | ADC_ScanConvMode | 选择扫描还是非扫描 | DISABLE(非扫描模式) ENABLE(扫描模式) |
参数6 | ADC_NbrOfChannel (非扫描模式下此参数无用) | 指定扫描模式下会用到几个通道 | 1(1-16之间) |