不多废话,直接开始:
还是多说一句,我把很多注意事项写在了代码里面,所以大家一定要认真看代码,其他文章也是。
理论部分
基础知识:
ADC:模拟/数字转换,即将模拟信号转换为表示一定比例电压值的数字信号。
stm32103系列的ADC有12位分辨率,位数决定了精度,位数越多,采集到的信号精度也就越高。
ADC的时钟频率不能超过14MHZ,否则的话会导致采集不准确。
ADC的通道组有规则通道和注入通道。以及可以实现单次、多次转换和扫描模式。
还有一些ADC的基础知识大家参考STM32参考手册,我在这里贴出来了:
ADC的基础知识大家多了解了解。蓝桥杯省赛对ADC的考察还是挺简单的。大家继续往下看。
配置步骤:
CT117开发板对ADC的考察就是测量电位器的电压值,这个电位器就是LED灯旁边的那个蓝颜色的东西。通过PB0连接。因此只考察一个通道,便不会涉及注入通道和多次转换这些内容,就简单了许多。
配置步骤:
- 开启PB时钟和ADC1的时钟。
- 复位ADC1,同时设置ADC1分频因子
- 初始化ADC1参数,设置ADC1的工作模式以及规则通道的相关信息。
- 使能ADC,并进行校准。
- 配置规则通道参数
- 开启软件转换
- 等待转换完成,读取ADC的值。
代码部分
void ADC_Config()
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_ADC1,ENABLE);//开启所需IO口和所需ADC的时钟
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模拟输入
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
ADC_DeInit(ADC1);//复位ADC1
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//设置ADC分频因子,最低必须是6分频。
//为什么最低是六分频?因为ADC的时钟在APB2总线上面,之前说过时钟频率不能大于14MHZ,所以是72/6<14。
ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//单次转换
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//ADC右对齐
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//独立模式
ADC_InitStructure.ADC_NbrOfChannel=1;//顺序
ADC_InitStructure.ADC_ScanConvMode=DISABLE;//扫描模式
ADC_Init(ADC1,&ADC_InitStructure);//ADC初始化
ADC_RegularChannelConfig(ADC1,ADC_Channel_8,1,ADC_SampleTime_239Cycles5);//ADC规则通道配置
ADC_Cmd(ADC1,ENABLE);
ADC_ResetCalibration(ADC1); //使能复位校准
while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
ADC_StartCalibration(ADC1); //开启AD校准
while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
}
float Read_ADC(void)//读取函数
{
float ADC_VALUE;
ADC_SoftwareStartConvCmd(ADC1,ENABLE);//开启软件转换
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换完成
ADC_VALUE = ADC_GetConversionValue(ADC1)*3.30/0xfff;//ADC是12位的寄存器,要把3.3V电压值分为0xfff份。
return ADC_VALUE;
}
float ADC_Value_Average(void)//这个函数是对捕获得到的10个ADC值取一下平均,以使结果更准确
{
int i = 0,j=0;
float ADC_Value_Array[10] ={
0};
float ADC_Average = 0;
for(i=0;i<10;i++)
{
ADC_Value_Array[i] = Read_ADC();
}
for(j=1;j<10;j++)
{
ADC_Value_Array[0] += ADC_Value_Array[j];
}
ADC_Average = ADC_Value_Array[0]/10;
return ADC_Average;
}
1.还需要掌握几个函数,都在adc.h库函数里面可以找得到:
2.通过”ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);“函数开启软件转换之后,需要等待规则通道转换结束才可以读取值。在参考手册(参考手册的重要性)中可以查到EOC标志位置1就是转换完成。所有正如上面代码中那样写。