什么是ADC:ADC就是将模拟量转换为数字量,分为采样和转换两个过程,运用的是逐次逼近原理
ADC的应用(配置方式为ADC查询方式)
单通道检测:
1.光敏传感器检测光照强度
功能效果:每100ms测量一次光照强度并将数据使用串口打印出来且光照强 度小于30%时全部灯亮 大于30%时灯灭
原理分析:需要当光敏传感器接收到的光照产生的模拟量转换为数字量,自然我们要使用ADC转换,首先选定一个具有模拟ADC转换功能 的IO口确定号IO口以及哪个ADC哪个通道时就可以进行配置 配置方式为ADC查询方式
配置流程如下:
初始化函数配置
{
/*IO控制器配置*/
/*ADC控制器配置*/
}
获取数据函数配置
{
//ADC开始转换
//等待转换完成
//获取数据
}
优化:从得到的数据看出,光照强度越强光敏电阻阻值越小电压越小转换过来的数字量也越小,所以我们在获取数据时 用4095-得到的数据 这步操作,这样更容易让用户理解,增加直观性
2.MQ2毒气传感器检测毒气浓度
功能效果:每100ms测量一次毒气浓度,浓度大于30%时蜂鸣器报警
双通道检测:MQ2毒气传感器检测毒气浓度 光敏传感器检测光照强度
原理分析:需要当光敏传感器以及毒气传感器接收到的模拟量转换为数字量,自然我们要使用ADC双通道转换,首先选定一个具有模拟A DC转换功能的IO口确定号IO口以及哪个ADC哪个通道时就可 以进行配置配置方式为ADC查询方式
配置流程如下:
初始化函数配置
{
/*IO控制器配置*/
/*ADC控制器配置*/
}
获取数据函数配置
{
//ADC开始转换
//等待转换完成
//获取数据
}
定时中断中调用获取数据函数
注意点:双通道获取数据时我们需要获取返回两个数据,这里我们定义结构体数据类型接收我们的数据
/***********************************************
*函数名 :adc1_ch1012_init
*函数功能 :ADC1通道10通道12初始化配置
*函数参数 :无
*函数返回值:无
*函数描述 :PC2-----ADC1_CH12---光敏
PC0-----ADC1_CH10---毒气
************************************************/
/******ADC初始化函数******/
void adc1_ch10_12_init(void)
{
/*IO控制器配置*/
//IO端口时钟使能
RCC->AHB1ENR |= (1<<2);
//IO端口模式配置
GPIOC->MODER |= (3<<4);//PC2
GPIOC->MODER |= (3<<0);//PC0
/*ADC1控制器配置*/
//ADC1时钟使能
RCC->APB2ENR |= (1<<8);
//CR1
ADC1->CR1 &=~(3<<24);//12位精度
ADC1->CR1 |= (1<<8);//配置扫描
//CR2
ADC1->CR2 &=~ (1<<11);//数据右对齐
ADC1->CR2 |= (1<<10);//每一个通道转换结束标志位置1
ADC1->CR2 &=~ (1<<1);//单次转换
//SMPR1
ADC1->SMPR1 &=~ (7<<6);
ADC1->SMPR1 |= (7<<6);//通道12配置采样周期为480
ADC1->SMPR1 &=~ (7<<0);
ADC1->SMPR1 |= (7<<0);//通道10配置采样周期为480
//SQR1
ADC1->SQR1 &=~ (0xf<<20);
ADC1->SQR1 |= (1<<20);//一共2个通道转换
//SQR3
ADC1->SQR3 &=~ (0x1f<<0);
ADC1->SQR3 |= (10<<0);//通道10为第1个转换
ADC1->SQR3 &=~ (0x1f<<5);
ADC1->SQR3 |= (12<<5);//通道12为第2个转换
//CCR
ADC->CCR &=~ (3<<16);//2分频
//使能ADC
ADC1->CR2 |= (1<<0);
}
/*****获取数据函数****/
ADC1_T get_adc1_ch10_12_data(void)
{
ADC1_T adc1_data;
//开始通道转换
ADC1->CR2 |= (1<<30);//CR2
//等待10号通道转换完成
while(!(ADC1->SR & (1<<1)));//SR
//获取通道10的数据
adc1_data.mq2_val=ADC1->DR/4095.0*100;//DR
//等待12号通道转换完成
while(!(ADC1->SR & (1<<1)));//SR
//获取通道12的数据
adc1_data.light_val=(4095-ADC1->DR)/4095.0*100;//DR
return adc1_data;
}
/*定义结构体*/
typedef struct adc
{
u16 light_val;
u16 sq2_val;
}ADC1_T;
/***定时中断函数时间片里处理事件****/
ADC1_T adc1_val; //定义结构体变量
if(tim7_cnt[6]==150) //光照、毒气检测
{
tim7_cnt[6]=0;
adc1_val=get_adc1_ch10_12_data();
if(adc1_val.mq2_val>30)
{
BEEP_ON;
}
printf("毒气浓度:%d%%\r\n",adc1_val.mq2_val);
adc1_val=get_adc1_ch10_12_data();
if(adc1_val.light_val<30)
{
led_all_ON();
}
if(adc1_val.light_val>50)
{
led_all_OFF();
}
printf("光照强度:%d%%\r\n",adc1_val.light_val);
}