ADC转换 光敏传感器 毒气传感器

什么是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);		
		
	}		

  • 16
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值