首先我们要知道什么是ADC?
单片机中的baiADC是Analog-to-Digital Converter的缩写,指模/数转换器或者模数du转换器。
ADC是指将连续变化的模拟信号转换为离dao散的数字信号的器件。真实世界的模拟信号,例如温度、压力、声音或者图像等,需要转换成更容易储存、处理和****的数字形式。模/数转换器可以实现这个功能,在各种不同的产品中都可以找到它的身影。
典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。然而,有一些模拟数字转换器并非纯的电子设备,例如旋转编码器,也可以被视为模拟数字转换器。
这莫多字,反正我是懒得看。。。。。。
ok一句话说明:ADC就是数模转换,将模拟量转换为数字量
我使用的ADC是12位的,具体转换过程我们先来看一下,12位的ADC模拟量范围是多少呢?当然是2^12也就是4096,也就是说我的12位ADC模拟量的范围是0~4096.
看一下上图,X是0~4096间的一个模拟数,我们现在要把它转换为0——3.3V间的一个数字电压,我们要怎么做呢?
首先计算每一个模拟量对应的数字量:3.3/4091
然后乘上模拟量X不就可以了嘛:(3.3*X)/4096
下面我们来看一下具体ADC的配置过程:
首先你是不是要找到你那个传感器对应的引脚,我这里用的是MQ2烟雾
传感器,我这里他对应的是PC1所以第一步是不是配置这个GPIO口模式
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//开时钟mq2
GPIO_InitTypeDef ADC_MQ2;
ADC_MQ2.GPIO_Mode = GPIO_Mode_AIN;//浮空输入
ADC_MQ2.GPIO_Speed = GPIO_Speed_50MHz;
ADC_MQ2.GPIO_Pin = GPIO_Pin_1;
GPIO_Init(GPIOC,&ADC_MQ2);
然后我们是不是要查询数据手册中看一下PC1这个引脚对应的ADC
ADC12_IN11这个意思就是我这个引脚可以用ADC1或者ADC2,第11个通道。接下来我们就开始配置ADC1
void mq2_adc_init(void)
{
/*MQ2 PC1 模拟输入*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//开时钟mq2
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//ADC1时钟
GPIO_InitTypeDef ADC_MQ2;
ADC_MQ2.GPIO_Mode = GPIO_Mode_AIN;
ADC_MQ2.GPIO_Speed = GPIO_Speed_50MHz;
ADC_MQ2.GPIO_Pin = GPIO_Pin_1;
GPIO_Init(GPIOC,&ADC_MQ2);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//时钟分频
ADC_InitTypeDef adc_config;
adc_config.ADC_Mode=ADC_Mode_Independent;//独立工作模式
adc_config.ADC_ContinuousConvMode=ENABLE;//连续转换模式
adc_config.ADC_DataAlign=ADC_DataAlign_Right;//数据右对齐
adc_config.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//软件触发
adc_config.ADC_NbrOfChannel=1;//转换通道个数
adc_config.ADC_ScanConvMode=DISABLE;//单通道转换
ADC_Init(ADC1,&adc_config);
ADC_Cmd(ADC1,ENABLE);//使能ADC1
ADC_RegularChannelConfig(ADC1,ADC_Channel_11,1,ADC_SampleTime_55Cycles5);//设置规则组转换通道
ADC_StartCalibration(ADC1);//复位校准
while(ADC_GetResetCalibrationStatus(ADC1));//等待校准完成
ADC_StartCalibration(ADC1);//再次校准
while(ADC_GetCalibrationStatus(ADC1));
ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能规则组转换
}
//不要让ADC的时钟超过14MHZ
//我的系统时钟是72MHZ,所以我6分频RCC_ADCCLKConfig(RCC_PCLK2_Div6);这样12MHz就满足条件了