在蓝桥杯嵌入式中ADC是比较重要的一个模块,ADC多次会考到,因此掌握这个ADC还是很有必要的。
在省赛中没有用到扩展板的情况下,主要就是一路的ADC采样。其采样通过主板上那个电位器R37来调节电压进行捕获考察ADC。
我们来看电路图:
这里R37电位器与PB0相连。在看数据手册上PB0挂载了ADC。并且对应着ADC的通道8。
代码部分这里分享一下如何快速的配置ADC和正常的配置;
1、正常配置
adc.c
include "adc.h"
void adc_init(void)
{
ADC_InitTypeDef ADC_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOB, ENABLE); //使能ADC1和GPIOB的时钟
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN; //模拟输入模式
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
ADC_InitStruct.ADC_Mode = ADC_Mode_Independent; //独立模式
ADC_InitStruct.ADC_ScanConvMode = DISABLE;
ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;
ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //软件触发
ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//adc数据右对齐
ADC_InitStruct.ADC_NbrOfChannel = 1; //顺序转换规则adc通道数目
ADC_Init(ADC1, &ADC_InitStruct);
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_1Cycles5); //配置通道8,采样时间1.5个周期
ADC_Cmd(ADC1, ENABLE);
ADC_StartCalibration(ADC1); //校准adc
while(ADC_GetCalibrationStatus(ADC1));//等待校准结束
}
/*读取adc的值*/
unsigned int adc_sacnf(void)
{
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
return ADC_GetConversionValue(ADC1);
}
2、快速配置:快速配置上我们使用官方给的固件库
ADC上的快速配置在打开固件库的这个路径:6-STM32固件库代码V3.5\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\ADC\ADC1_DMA
首先打开里面的main函数文件
这些直接复制
注意:我们板子上的IO是PB0这里改成PB0的IO、我们的时钟源也要改成GPIOB的时钟、在这个ADC_RegularChannelConfig()函数里本文说过PB0对应的是通道8因此要把14改成8、ADC_Init()初始化函数里面两个结构体改成DISABLE。
要改的就这些。这样初始化函数就配置完了,但是读取的话没有给出,还是要我们自己配置。