这一理论的意义在于,如果我们将一个处于能量状态 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保证了可以装得下复杂的程序和有足够的空间运行。
我的项目设计思路如上图,
对于3.3V的电压选择主要是考虑到芯片面积和效率,使用TLV62568,根据数据手册可知,芯片最高工作效率可达95%,且SOT563的封装尺寸仅有1.60*1.60mm
对12V的供电芯片,选择这个来自TI的这颗TLV61046A芯片还有一个化简外围的特殊设计,当芯片的FB引脚连接在Vin时,输出自动恒定在12V,可以节省外围的反馈电阻。
有了细致的原理图设计之后,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)
如图,首先在室外放置一分钟后开机监测,二氧化碳浓度为442ppm;再从窗外拿进室内,可以看出二氧化碳明显上升到600ppm;接下来开窗通风5分钟,二氧化碳浓度降低到523ppm,说明在室内勤开窗换气,有助于保持空气清新。