【mcuclub】CO2及TVOC检测-SGP30

慈云数据 12个月前 (05-14) 技术支持 47 0

一、实物图

二、原理图

编号名称功能
1VCC电源正
2GND电源地
3SDA串行地址和数据输入/输出
4SCL串行时钟输入

三、简介

SGP30是一款单一芯片上具有多个传感元件的金属氧化物室内气体传感器,内部集成4个气体传感元件,具有完全校准的空气质量输出信号,主要是对空气质量进行检测。可以输出:

TVOC(Total Volatile Organic Compounds,总挥发性有机物),量程为0~60000ppb;CO2浓度,量程400~60000ppm。

四、工作原理

SGP30的传感(MEMS)部分基于金属氧化物(MOx)纳米颗粒的加热膜。气敏材料——金属氧化物颗粒上吸附的氧气与目标气体发生反应,从而释放出电子。这导致由传感器测量的金属氧化物层的电阻发生改变。简而言之,还原性气体的出现造成气敏材料表面氧浓度降低,改变了半导体的电阻(或电导率)。后续通过电路(ASIC)部分对电阻进行检测、信号处理与转换等,最终获取到气体值。

五、通信协议(I2C通信)

1、I2C总线介绍

I2C总线(Inter IC bus)是由Philips公司开发的一种通用数据总线。

两根通信线:SCL(Serial Clock串行时钟线)、SDA(Serial Data串行数据线)。

同步、半双工,带数据应答。

*注:同步(因为它有单独的时钟线)、半双工(SDA只有一根线,并且还要来回通信)

通用的I2C总线,可以使各种设备的通信标准统一,对于厂家来说,使用成熟的方案可以缩短芯片设计周期、提高稳定性,对于应用者来说,使用通用的通信协议可以避免学习各种各样的自定义协议,降低了学习和应用的难度。

2、I2C电路规范

所有I2C设备的SCL连在一起,SDA连在一起

设备的SCL和SDA均要配置成开漏输出模式(硬件IIC)

*开漏输出模式——断开时引脚成浮空状态(电路断开,电压不稳定)

SCL和SDA各添加一个上拉电阻,阻值一般为4.7K~10K左右

开漏输出和上拉电阻的共同作用实现了“线与”的功能,此设计主要是为了解决多机通信互相干扰的问题。

3、I2C时序结构

起始信号:SCL高电平期间,SDA从高电平切换到低电平

停止信号:SCL高电平期间,SDA从低电平切换到高电平

代码如下:

/****

*******I2C总线启动信号

*****/

void SGP30_IIC_Start(void)

{

   SGP30_SDA = 1;

   SGP30_SCL = 1;

   SGP30_IIC_Delay(DELAY_TIME);

   SGP30_SDA = 0;

   SGP30_IIC_Delay(DELAY_TIME);

   SGP30_SCL = 0;

}

/****

*******I2C总线停止信号

*****/

void SGP30_IIC_Stop(void)

{

   SGP30_SDA = 0;

   SGP30_SCL = 1;

   SGP30_IIC_Delay(DELAY_TIME);

   SGP30_SDA = 1;

   SGP30_IIC_Delay(DELAY_TIME);

}

发送应答:在接收完一个字节之后,主机在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答。

接收应答:在发送完一个字节之后,主机在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)。

代码如下:

/****

*******发送应答或非应答信号

*****/

void SGP30_IIC_SendAck(bit ackbit)

{

   SGP30_SCL = 0;

   SGP30_SDA = ackbit;

   SGP30_IIC_Delay(DELAY_TIME);

   SGP30_SCL = 1;

   SGP30_IIC_Delay(DELAY_TIME);

   SGP30_SCL = 0;

   SGP30_SDA = 1;

   SGP30_IIC_Delay(DELAY_TIME);

}

/****

*******等待应答信号

*****/

bit SGP30_IIC_WaitAck(void)

{

   bit ackbit;

   SGP30_SDA = 1;

   SGP30_SCL = 1;

   SGP30_IIC_Delay(DELAY_TIME);

   ackbit = SGP30_SDA;

   SGP30_SCL = 0;

   SGP30_IIC_Delay(DELAY_TIME);

   return ackbit;

}

发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位在前),然后拉高SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节。

代码如下:

/****

*******I2C总线发送一个字节数据

*****/

void SGP30_IIC_SendByte(uchar byte)

{

   uchar i;

   SGP30_SCL = 0;

   for(i=0; i

微信扫一扫加客服

微信扫一扫加客服