98|0

6253

帖子

10

TA的资源

版主

楼主
 

【英飞凌XENSIV™ PAS CO2传感器(5V版)】5、基于C的单片机驱动实现 [复制链接]

        我们根据写一下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;
else
PasCO2.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);//测量周期6s
PasCO2_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 Datasheet 技术支持

关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表