本项目是参加FastBond3节能环保方向,使用超小型传感器和低功耗的电路设计完成项目功能。
项目设计思路
如下图所示,高CO2含量会让人昏昏欲睡甚至危害人类的健康,尤其是在封闭的教室或办公室还有汽车内,所以需要制作一个能够帮我监测二氧化碳浓度,并且可以在必要时刻报警提醒通风的设备。
为此我查找了市面上常见的二氧化碳检测传感器,发现了一些有趣的事情,市面上有很多检测其他气体的传感器,如一氧化氮,氨气,空气中的水分等,这些气体传感器总是能快速的和被测物质结合,又在别的条件下恢复(如加热,施加电压等),从而实现重复测量。但是二氧化碳作为一种不活泼的气体,常温常压下很难和大多数物质反应(某些碳酸矿物沉淀不考虑,谁也不想要传感器每天产生一堆石头吧),作为一个传感器,不可以每检测一次就要换探头,所以二氧化碳在传统监测思路中的检测就是一件不太容易事情。
但是总难不倒科学家,化学性质没办法咱就从物理性质找手段,二氧化碳,学名Carbon dioxide,是由一个碳原子和两个氧原子组成的分子,每个分子大约是这个样子
吸收光谱学告诉我们:一个给定的分子可以有多种能量状态,例如,它可以通过围绕重心的旋转而具有旋转能;或是由于原子周期性地偏离平衡位置而具有振动能;也可以是由于与每个原子或键相关的电子都在持续运动而具有电子能。
这一理论的意义在于,如果我们将一个处于能量状态 E1 的分子直接被一束频率为 ν 的单色辐射光束照射,能量就会被光束吸收,分子就会跃迁到更高能量状态 E2。如果放置一个探测器来收集与分子作用后的辐射,就会发现辐射强度有所下降。而被吸收掉的能量会转换为其他形式(如热能)。此外,如果我们使用的光束包含多种频率(如白光),我们可以观察到能量只被某一特定频率吸收,而其他频率的辐射强度没有减弱。这就是吸收光谱学的基础。如下是常见的被测气体和他们对应的吸收光谱,可以看出二氧化碳针对约4.2um波长有极高的吸收率。
基于如上的原理,开发出了NDIR(非色散红外)光声学传感器,即是用被测物质吸收频率相同的单一波长光源照射被测气体,比如将空气通入一个腔体,然后对空气照射4.2um的窄带激光脉冲,这种激光周期加热二氧化碳,就会引起气体中二氧化碳的周期膨胀与收缩,从而形成了声波。二氧化碳的浓度越高,吸收的光照更多,膨胀也就越明显,发出的声波幅度就会更大。传统的NDIR传感器为了获得足够的气体以提高精度,需要很大的气体检测腔体,通常尺寸非常大(半个手掌大),但是!随着技术的进步,检测精度和尺寸都得到了优化!
设计中用到的核心元器件及介绍
本次项目中,我选择了来自英飞凌科技的XENSIV™ PAS CO2传感器 – 基于光声光谱学(PAS)的革命性二氧化碳传感器,这是一款超小尺寸的真实二氧化碳传感器。基于光声光谱学概念设计的该传感器,相比现有的商用真实二氧化碳传感器,可节省75%以上的空间。直接以ppm为单位的高精度、高稳定性读数,以上的优点尤其适合室内空气质量监测。
为了与传感器搭配,我选择了一个低功耗的高性能MCU,来自ADI的MAX32660一颗带基于FPU的Arm Cortex-M4F微控制器(MCU),256KB Flash和96KB SRAM保证了可以装得下复杂的程序和有足够的空间运行。
项目方案框图和原理图介绍
我的项目设计思路如上图,
- 首先此设备需要能够不插电运行,所以就需要一个电池存储电力,而且需要加入锂电池的充电芯片。
- 有了锂电池作为供电,系统就有了4.2V~3.7V的宽范围电压,那么为了各芯片可以正常工作,需要加上稳压芯片,为了供电效率高我选择了一个DCDC转换芯片,转换出芯片的3.3V电压,还有传感器工作所需的12V电压。
对于3.3V的电压选择主要是考虑到芯片面积和效率,使用TLV62568,根据数据手册可知,芯片最高工作效率可达95%,且SOT563的封装尺寸仅有1.60*1.60mm
对12V的供电芯片,选择这个来自TI的这颗TLV61046A芯片还有一个化简外围的特殊设计,当芯片的FB引脚连接在Vin时,输出自动恒定在12V,可以节省外围的反馈电阻。
- 接下来是MCU的设计,参考官方数据手册找到芯片的管脚复用表,为了方便下载程序和调试,保留SWD调试接口,且屏幕需要使用SPI接口,传感器需要I2C接口,为了低功耗待机和计时,需要加上一颗晶体,综上考虑,所以如下是MCU电路。
- 但是只用MAX32660作为主控有两个小缺点,一是GPIO一共只有14个,所以与其降低功能,删去触摸或者传感器的中断管脚,不如加上一颗I2C接口的低功耗扩展IO芯片,既保证了低功耗,也能发挥出设备的全部性能;二是芯片其实并没有ADC采集,没法监测设备供电情况,在锂电池过低时提出报警,所以我加入了一个比较器电路并设置了比较电压。
PCB设计介绍
有了细致的原理图设计之后,PCB设计的主要考虑则简单了很多,电源的器件布局尽可能靠近,主要参考各芯片的原厂layout即可
上图分别为3.3V和12V电源芯片的推荐布局,绘制软件则使用了参加活动赠送课程学习的KiCad,优先保证电源部分的连接和布局,然后在两层的空间内连完所有的线段。
遇上最多的问题就是只在一面走线,无法保证顺利连接,越是到最后,就会发现有时导线需要来回交换很多层才能顺利接上。
关键代码及说明
几年前参加过Funpack活动,当时正好学习了MAX32660的用法,所以这次用起来很快,配置好每个片内外设就可以写功能代码了
PWMTimer();//屏幕背光
MXC_GPIO_Config(&gpio_LCD);
MXC_GPIO_Config(&gpio_INT);
MXC_GPIO_IntConfig(&gpio_INT, MXC_GPIO_INT_FALLING);
MXC_GPIO_EnableInt(gpio_INT.port, gpio_INT.mask);
NVIC_EnableIRQ(MXC_GPIO_GET_IRQ(MXC_GPIO_GET_IDX(MXC_GPIO0)));
MXC_GPIO_Config(&gpio_RST);
MXC_GPIO_Config(&gpio_IIC_SCL);
MXC_GPIO_Config(&gpio_IIC_SDA_OUT);//IIC管脚
MXC_SPIMSS_Init(SPIMSS, 0, 24000000, MAP_A);//LCD使用SPI通信
Lcd_Init();//初始化屏幕
PAS_i2c_req.tx_len = 2;
PAS_i2c_req.rx_len = 0;
PASTxdata[0] = 0x02;
PASTxdata[1] = 0x00;
NEW_I2C_MasterTransaction(&PAS_i2c_req);
PASTxdata[0] = 0x03;
PASTxdata[1] = 0x0a;
NEW_I2C_MasterTransaction(&PAS_i2c_req);
PASTxdata[0] = 0x04;
PASTxdata[1] = 0x02;
NEW_I2C_MasterTransaction(&PAS_i2c_req);
//初始化PAS传感器
为了保证屏幕有一个好看的UI界面,所以加入了LVGL图形库
lv_init();
lv_port_disp_init();
lv_port_indev_init();
最后在主程序里面写入读取和换算的代码
if(1==CO2ReadFlag)
{
CO2ReadFlag = 0;
PAS_i2c_req.tx_len = 1;
PAS_i2c_req.rx_len = 2;
PASTxdata[0] = 0x05;
PASRxdata[0] = 0;
NEW_I2C_MasterTransaction(&PAS_i2c_req);
CO2ppm = PASRxdata[0]*256+PASRxdata[1];
lv_label_set_text_fmt(label, "CO2:%d ppm", CO2ppm);
lv_chart_set_next_value(chart, ser1, CO2ppm);
lv_chart_refresh(chart);
}
功能展示
如图,首先在室外放置一分钟后开机监测,二氧化碳浓度为442ppm;再从窗外拿进室内,可以看出二氧化碳明显上升到600ppm;接下来开窗通风5分钟,二氧化碳浓度降低到523ppm,说明在室内勤开窗换气,有助于保持空气清新。
总结
感谢科技的发展,让我能有传感器监测身边的空气质量,也感谢在制作过程中请教的各位群友,感谢活动的主办方!
祝活动越来越好!!