蓝桥杯嵌入式——ADC相关

不多废话,直接开始:

还是多说一句,我把很多注意事项写在了代码里面,所以大家一定要认真看代码,其他文章也是。

理论部分

基础知识:

ADC:模拟/数字转换,即将模拟信号转换为表示一定比例电压值的数字信号。

stm32103系列的ADC有12位分辨率,位数决定了精度,位数越多,采集到的信号精度也就越高。

ADC的时钟频率不能超过14MHZ,否则的话会导致采集不准确。

ADC的通道组有规则通道和注入通道。以及可以实现单次、多次转换和扫描模式。

还有一些ADC的基础知识大家参考STM32参考手册,我在这里贴出来了:
在这里插入图片描述
ADC的基础知识大家多了解了解。蓝桥杯省赛对ADC的考察还是挺简单的。大家继续往下看。

配置步骤:

CT117开发板对ADC的考察就是测量电位器的电压值,这个电位器就是LED灯旁边的那个蓝颜色的东西。通过PB0连接。因此只考察一个通道,便不会涉及注入通道和多次转换这些内容,就简单了许多。

在这里插入图片描述
配置步骤:

  1. 开启PB时钟和ADC1的时钟。
  2. 复位ADC1,同时设置ADC1分频因子
  3. 初始化ADC1参数,设置ADC1的工作模式以及规则通道的相关信息。
  4. 使能ADC,并进行校准。
  5. 配置规则通道参数
  6. 开启软件转换
  7. 等待转换完成,读取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就是转换完成。所有正如上面代码中那样写。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43690936/article/details/105346470