「英飞凌XENSIV™ PAS CO2传感器(5V版」5、基于C的单片机驱动实现

B站影视 2024-12-27 01:07 2

摘要:static Error_PasCO2 PasCO2_CheckCom(void){uint8_t CheckData = 0;PasCO2_SetOneWord(PasCO2_RegAddr_SCRATCH_PAD,0xA5);CheckData = Pas

我们根据写一下C驱动代码,非常的简单,以设定连续采集为例,中断(数据准备好)为例进行单片机程序的设计,这里我们进行乐意下一通信接口的检查,代码如下:

复制

static Error_PasCO2 PasCO2_CheckCom(void){uint8_t CheckData = 0;PasCO2_SetOneWord(PasCO2_RegAddr_SCRATCH_PAD,0xA5);CheckData = PasCO2_GetOneWord(PasCO2_RegAddr_SCRATCH_PAD);return (CheckData == 0xA5) ? ERROR_NONE : ERROR_COM;}

这里主要就是通过SCRATCH_PAD寄存器实现的,这个寄存器没有什么实际意义,可以读也可以写,先写后读,进行校验通信。

然后就初始化函数:

复制

void PasCO2_Init(void){uint8_t SysData;if(PasCO2_CheckCom == ERROR_NONE){PasCO2.ID = PasCO2_GetOneWord(PasCO2_RegAddr_ID);SysData = PasCO2_GetOneWord(PasCO2_RegAddr_SENS_STS);if ((SysData & REG_SENS_STS_ICCER_MSK) != 0U){PasCO2.Error = ERROR_ICC;PasCO2_SetOneWord(PasCO2_RegAddr_SENS_STS,0x01);}else if ((SysData & REG_SENS_STS_ORVS_MSK) != 0U)PasCO2.Error = ERROR_ORVS;else if ((SysData & REG_SENS_STS_ORTMP_MSK) != 0U)PasCO2.Error = ERROR_ORTMP;else if ((SysData & REG_SENS_STS_SEN_RDY_MSK) == 0U)PasCO2.Error = ERROR_NOT_READY;elsePasCO2.Error = ERROR_NONE;}else{PasCO2.Error = ERROR_COM;}if(PasCO2.Error == ERROR_NONE){PasCO2_SetOneWord(PasCO2_RegAddr_MEASCFG,0x00);//切换到空闲模式delay_ms(400);PasCO2_SetTwoWord(PasCO2_RegAddr_RATE_H,0x0006);//测量周期6sPasCO2_SetTwoWord(PasCO2_RegAddr_PRES_H,0x03f6);//PasCO2_SetOneWord(PasCO2_RegAddr_INTCFG,0x14);//开启外部中断(数据就绪)PasCO2Config.MeasRate = PasCO2_GetTwoWord(PasCO2_RegAddr_RATE_H);PasCO2Config.PresRef = PasCO2_GetTwoWord(PasCO2_RegAddr_PRES_H);PasCO2Config.CalibRef = PasCO2_GetTwoWord(PasCO2_RegAddr_CALIB_H);PasCO2_SetOneWord(PasCO2_RegAddr_MEASCFG,0x02);//切换到连续采集模式delay_ms(400);}}

初始化阶段就是测量周期/测量模式等内容配置,首先需要保证通信正常,注意所有的配置过程需要在空闲模式下进行。

然后就是在中断发生后进行数据采集,代码如下:

复制

void PasCO2_GetPPM(void){uint8_t MEAS_STS = 0;MEAS_STS = PasCO2_GetOneWord(PasCO2_RegAddr_MEAS_STS);if((MEAS_STS&0x10) == 0x10){delay_ms(100);PasCO2.PPM = PasCO2_GetTwoWord(PasCO2_RegAddr_PPM_H);CO2_collect.Upflag = 1;// CO2_PreDelay.Capflag = 0;}if((MEAS_STS&0x08) == 0x08){PasCO2_SetOneWord(PasCO2_RegAddr_MEAS_STS,0x02);//清除外部中断}MEAS_STS = 0;}

采集过程相对都是比较慢的,毕竟测量周期至少也是5s,中孤单发生或进行采集,这个时候也要校验一下状态寄存器,注意完成后要清一下中断发生标志位。

我们看一下采集到的数据:

由于时间的限制,我们没法进行PCB的转接板绘制,只能通过杜邦线链接一下,不过也是比较好的是,与12V版本的差异主要就是1脚的供电,这改装也是比较方便的。数据方面,说实话确实比较高,超过2000实际上就算是一个比较浑浊的气体了,这也说明了一点,为什么我们回到家总是犯困想睡觉,也可看出来一个人在一个密闭空间中空间越小这个CO2的值越高。

对比一下GUI软件采集到的数据:

稳态下的数据基本没有什么差别,这里也作为一个提醒,尽量不要把传感器对着自己进行测试,人呼出的气体影响会比较大。

我们也看了一下12V版本的采集数据:

差异感觉有点大,我要告诉你的是刚开始的时候差异更大,稳态大概4000+,这是什么原因呢?猜测一下应该是这个传感器在这个密闭房间内放置半年之久,没有使用过,手册中也有介绍约长时间没有使用会产生漂移,这个值可能需要放到干净空气中一段时间来恢复,上面的值已经是恢复几个小时时间的值了,在存储的时候,如果不用也尽可能放置在比较干净的环境,像我家这种常年不开窗的房间,对于这款传感器影响还是很大的。原文「链接」

来源:EEWORLD电子工程世界

相关推荐