一蓑烟雨任平生!
AD单通道
AD初始化配置
1.开启RCC时钟包括ADC和GPIO时钟,此外ADC CLK的分频器也需要配置一下
2.配置GPIO,把需要的GPIO配置成模拟输入的模式
3.配置多路开关,把左边的通道接入到右边的规则组列表里
4.配置ADC转换器,在库函数中使用的是结构体配置,可以配置一大块电路的参数
5.调用ADC_Cmd函数开启ADC
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//此函数是配置ADC的CLK的,可以对APB2的72M时钟选择2,4,6,8分频,输入到ADCCLK
ADC_Cmd()用于给ADC上电的也就是开关控制
ADC_DMACmd();用于开启DMA输出信号,如果使用DMA转运数据,就得调用这个函数
void AD_Init(void)
{
//1.开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//选择6分配 72/6=12MHZ
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模拟输入模式 ,Ain模式下GPIO是无效,断开GPIO防止GPIO的输入输出对模拟电压产生干扰 也就是说AIN模式是ADC的专属模式
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//以上GPIOA就被配置成模拟输入的引脚
//选择规则组的输入通道
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);//55个ADC的采样周期
//使用结构体初始化 ADC
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//连续转换模式,可以选择连续或者非连续
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//数据对齐,选择左对齐还是右对齐
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//触发源使用软件触发,也就是不选择外部触发
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//选择ADC独立模式
ADC_InitStructure.ADC_NbrOfChannel=1;//在扫描模式下指定会使用到几个通道
ADC_InitStructure.ADC_ScanConvMode=DISABLE;//扫描模式
ADC_Init(ADC1,&ADC_InitStructure);
//若需要中断或者看门狗可以接着在下面配置,若不需要可以直接开启ADC电源开启使用
ADC_Cmd(ADC1,ENABLE);
//adc校准
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1)==SET);
ADC_StartCalibration(ADC1);//启动校准
while(ADC_GetCalibrationStatus(ADC1)==SET);}
/**
* 函 数:获取AD转换的值
* 参 数:无
* 返 回 值:AD转换的值,范围:0~4095
*/
uint16_t AD_GetValue(void)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //软件触发AD转换一次
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); //等待EOC标志位,即等待AD转换结束 EOC规则组转换单位
return ADC_GetConversionValue(ADC1); //读数据寄存器,得到AD转换的结果
}
AD多通道只需要对单通道模式做一个简单修改即可
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
ADC_RegularChannelConfig(ADC1,ADC_Channel,1,ADC_SampleTime_55Cycles5);
uint16_t AD_GetValue(uint ADC_Channel)
{
ADC_SoftwareStartConvCmd(ADC_Channel, ENABLE); //软件触发AD转换一次
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); //等待EOC标志位,即等待AD转换结束 EOC规则组转换单位
return ADC_GetConversionValue(ADC1); //读数据寄存器,得到AD转换的结果
}
最后只需要在Main函数中调用此函数,把参数改成通道1,通道2。。。等依次调用即可