淘宝上有各种VOC空气质量监测产品,有些产品根本就没有温补功能,我写这个文章的初衷就是让设计给自己用还是做产品的工程师们一个正确用法的说明,少走弯路,如文章有什么错误请指正!
MEMS 与 传统半导体气敏传感器比较
传统VOC 气体传感器在市面上大多数都是半导体气敏传感器,例如TGS2602 气敏传感器内的加热丝使气敏传感器工作在高温状态,加速被测气体的吸附和氧化还原反应,以提高灵敏度和响应速度。
MEMS传感器即微气体传感器, MEMS 工艺在 Si 基衬底上制作微热板, 所使用的气敏材料是在清洁空气中电导率较低的金属氧化物半导体材料。当传感器处存在敏感气体环境中时,传感器的电导率随空气中被检测气体的浓度而发生改变。 这种传感器具有体积小、 快速响应 、功耗低、高灵敏度等特点。
首次使用 金属氧化物半导体传感器需要老化一段时间,例如CCS811因为在首次使用48小时前敏感性方面的电阻变化比较大所以手册上写明需要老化48小时以稳定。
温度湿度补偿
不要忽略了气体传感器对温湿度的影响
环境湿度是影响金属氧化物气体传感器性能的重要因素,水吸附会显着降低金属氧化物气体传感器的灵敏度。另外,长时间暴露于潮湿的环境中会导致稳定化学吸附逐渐形成OH¯在表面,引起气体传感器的灵敏度的进行性恶化。然而通过加热到高于400℃的温度可以除去氢氧根离子。但是低功耗的气体传感器并没有那么热!
温度也是金属氧化物气体传感器的重要因素,不同成分的气体传感器具有相似的形状。响应在一定温度下增加并达到最大值,然后随着温度的升高而迅速下降。所以一般设计的VOC气体传感器都带有外部或者内部温湿度补偿。
图1 华为探空精灵VOC传感器和旁边的温度传感器
下面可以看到TGS2602普通金属氧化物传感器在温湿度变化的曲线是比较大的:
图2 TG2602金属氧化物传感器在温湿度变化曲线
CCS811也不是神仙,MEMS变化可能比TGS2602大,所以程序处理要加上温湿度补偿的程序。
CCS811说明书看了几遍后没看到 温湿度补偿传感器放在哪里,应该是补偿空气中的温湿度。图1华为是放在VOC传感器旁边,CCS811的官方套件是离得比较远了,华为有自己一套算法吧。这个自己各种尝试吧!
参考文章:Metal Oxide Gas Sensors: Sensitivity and Influencing Factors Sensors (Basel). 2010; 10(3): 2088–2106.
基线的读取与恢复
使用数字化VOC空气质量传感器一般都会在一定时间内更新基线,这个基线计算洁净空气。如果使用模拟的传感器因为传感器特性原因则要自己计算并且保存这个基线。如果掉电后没有恢复掉电前的基线,则会重新计算,如果你在一个很差的环境下恢复基线你会发现数值比掉电前的数值小很多,差的很离谱。
- CCS811手册说明保存基线的时间要求
器件工作时间>24小时:
在500小时前每24-48小时保存一次。
500小时后每5-7天保存一次。 -
器件工作时间小于24小时:
保存基线的正确时间将取决于你用的方法。
如果使用多个操作模式,则应为每个模式存储单独的基线,基线应仅在电阻稳定时恢复(通常为20-30分钟)。
如果从低功率模式切换到高功率模式(不消耗至少10分钟空闲),应等待传感器稳定下来之后再恢复之前的基线。 -
空气流动
所有的半导体气敏传感器都不应该直接接触风的的流动,更不要用嘴去吹传感器,这样会导致传感器温度瞬间降低,半导体传感器灵敏度下降,采样的数据不正确,所以风道设计就很重要了。
CCS811 启动程序
CCS811启动需要先判断bootloader是否存在、硬件ID是否错误,然后才能加载启动CCS811的主程序,启动后设定每秒测量一次。
#define CSS811_STATUS 0x00
#define CSS811_HW_ID 0x20
#define CSS811_HW_VERSION 0x21
#define CSS811_APP_START 0xF4
//传感器上的WAKE_PIN为低电平有效,在任何通信之前触发并保持低电平
WEAK_ENABLE();
//检测硬件ID是否错误
status = i2cGetData(CSS811_HW_ID);
if(status != 0x81)while(1); //检测到错误的硬件ID
//检查固件是否加载
status = i2cGetData(CSS811_HW_VERSION);
if((status & (1 << (5-1))) == 0)while(1); //没有加载应用程序固件
//启动应用程序
uint8_t TxBuff = CSS811_APP_START;
i2cWrite(&TxBuff, 1); //Write 0 bytes to this register to start app
//判断启动成功失败
status = i2cGetData(CSS811_STATUS); //读取状态寄存器读FW_MODE位
if((status & (1<<7)) == 0)while(1);//固件仍处于启动模式
if((status & (1<<0)) == 1)while(1);//I2C或传感器发生错误
secondsetDriveMode(0x01);//恒功率模式,每秒测量IAQ
WEAK_DISABLE();
CCS811 读取程序
获取传感器数值和获取寄存器都是差不多,下面是获取CCS811的TVOC和eCO2的数据:
#define CSS811_ALG_RESULT_DATA 0x02
uint8_t data[4];
WEAK_ENABLE();
i2cGetData(CSS811_ALG_RESULT_DATA, data, 4);
WEAK_DISABLE();
eCo2 = ((uint16_t)data[0] << 8) | data[1];
tVOC = ((uint16_t)data[2] << 8) | data[3];
最后,程序只贴上了启动和读取,还有温补、基线恢复等程序Github有我就不贴上来了,善用搜索,CCS811文档有十多个!空气传感器不单单只是读取数据然后显示出来就搞定的,还有风口、基准、自己加上一套算法、校准等等都要做。能力强的比如华为,直接用模拟加上自己算法和校准就能应对自如,没有华为的实力也没关系,像CCS811这种只要认真读说明书,用起来也就简单了。