STM32 Cube ADC MQ135测量空气质量和氨气PPM

一 。说明

1. 什么是AD转换

AD转换是把离散的模拟量转换为数字量的过程,其原理就是使用单片机的高频率和时钟来采样x轴的点样,根据电压的变化使用曲线函数来获取y轴数字值的过程,我们叫做AD转换

2.如何确定AD采样的位数,并知道电压值

如果单片机的的ADC为12位,那么它的最大值为4095。单片机在进行AD转换前需要先设置一个参考电压。假如把参考电压设置为5V,5V=4095,0V=0;根据这样的关系,我们就可以把模拟电压进行数字化了。比如:2V=2/5*4095=1638。

3. 什么是A0 和 D0

A0 输出为模拟量的电压值

D0 根据可调电阻设置传感器的灵敏度,当达到某个阈值时候能输出 1 或者 0 ,变化波动较大

比如:MQ135 未检测到气体时,电压值为4v , 检测到后为0.1V

VCC  连接 5V ( 可查参考手册,不同的模块要求电压不同)

GND  接地

二。配置

1. 设置采样周期 55.5 cyles,和中断端口 IN1,该端口和A0连接

2. 开启中断 ,这里采用中断方式。也可以不使用中断,直接在main的 while 里来做一样

3. 根据配置的时钟知道AD的采样精度 ,这里我用的是8位的AD

二。看技术文档

 从MQ135文档中可以知道其灵敏度曲线和湿度的影响,也就是要检测气体的浓度值是受 温湿度影响的,也就是说要想获得准确的值,需要根据温湿度情况对Rs/R0的比进行矫正,从而获取真正的浓度值!

 四。代码

int main(void){
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_ADC1_Init();
    //开启中断
    HAL_ADC_Start_IT(&hadc1);
    while(1){
    }
}

//这是中断回调函数
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
	float vol,x,ppm;
	uint32_t Rs,R0,quality;
	//获取ad value m
	adc_value= HAL_ADC_GetValue(&hadc1);
	//5v  = 2的8次方,所以5V = 256
	vol = (float)adc_value*5/256;
	//空气质量的范围为0~300  而我们的采集AD范围为: 0 ~ 255
	quality = (uint16_t)adc_value*300/255;

	//使用标定值计算
	// 1. 这里我测得的可调电阻103的阻值为 2500 Ω
	// 2.根据公式 Rs = (Vc / Vrl -1 ) * RL,
	Rs = (5 / vol - 1) * 2500;
	// 其中R0 为洁净空气中的电阻(即出厂时,将传感器放入100ppm的氨气中,测得的电阻值)
	R0 = 42000; //这里做了一个假设值,没有实验环境哈~~~~
	//x 为 RS/R0的比值
	x = (float)Rs/R0;
	//咱们看图取几个关键点,从而求PPM的值
	ppm= (1078.48 - 9.52 )/( 1 + pow(x/0.064,5.36) ) + 9.52;

	//再次启动ADC转换
	HAL_ADC_Start_IT(hadc);
}

 五。演示效果

模拟量输出电压 vol : 0.66v

quality 空气质量:41

ppm值为:9.6 

当然这个值并不准确,未进行气体标定,但从公式可以看出整个气体变化的曲线,是随着ppm的增加逐渐变得平滑,符合所有气体浓度的变化曲线!

感谢您的支持,写的文章如对您有所帮助,开源不易,请您打赏,谢谢啦~

 

  • 9
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值