第1章 产品简介
1.1 概述
数字型气体模组是一款低功耗,小型化模组。该模组采用半导体气体传感器和高性能微处理器相结合,用于检测环境中的气体浓度。该模组灵敏度高,小巧精密,采用I2C 数字信号输出方式,下面将根据此款模块进行设计电路的介绍。
该设计适用于:
MEMS数字气体传感器
型号 | 名称 |
JED101-001 | MEMS数字VOC传感器 |
JED103-001 | MEMS数字氢气传感器 |
JED104-001 | MEMS数字CO传感器 |
JED105-001 | MEMS数字NH3传感器 |
JED106-001 | MEMS数字H2S传感器 |
JED107-001 | MEMS数字乙醇传感器 |
JED109-001 | MEMS数字丙烷传感器 |
JED110-001 | MEMS数字氟利昂传感器 |
JED112-001 | MEMS数字二氧化氮传感器 |
JED115-001 | MEMS模数字烟雾传感器 |
JED116-001 | MEMS数字甲醛传感器 |
JED117-001 | MEMS数字丙酮传感器 |
第2章 设计要点
MEMS数字气体模组采用半导体气体传感器和高性能微处理器相结合,通过公司内部出厂校准,采用iic数字信号输出浓度值。其中硬件设计中需要注意一下几点要求:
(1)mems数字气体传感器工作需要一路加热电压用来加热模组内部气体检测元件。加热电压为固定值不可更改:
VDD:1.4V±0.1V DC
(2)模组的工作电压,提供内部数字处理芯片的所需要的电压VCC=3.3V±0.1VDC。
第3章 硬件设计
(以下电路均使用立创EDA设计)
整体示意图
3.1 电源设计
公司MEMS数字气体传感器,加热电压VDD:1.4V、工作电压VCC:3.3V,输出方式为IIC。以下为设计分析:
外部电路采用的是5v供电,通过LDO稳压芯片输出3.3v作为数字模组的供电电压,3.3v电压在经过另一路LDO稳压芯片输出1.4v电压为数字模组提供加热电压。
或:
图2.电源电路
3.2 传感器引脚介绍
1 | VCC | 5 | NC |
2 | NC | 6 | NC |
3 | SDA | 7 | GND |
4 | SCL | 8 | VDD(加热电压) |
3.3 单片机电路设计
模组单片机采用stm32f030f4p6芯片,此次还需要两路普通io口,用作iic读取。
第4章 使用思路
4.1 定量使用:
可以将数字mems模组通过IIC电路连接到mcu,按照提供的时序以及协议进行获取数字信号。
4.2定期校零
校零:
0 | 1 | 3 | 4 |
0X54 | 0X32 | DATA(高位) | DATA(低位) |
从机地址(含读写位) | 写入命令 | 气体浓度高八位 | 气体浓度低八位 |
说明:写入的数据为传感器在通风环境空气中的数值,写入后对示数校零。写入后,再读取一次确认是否校零成功。
第5章 IIC通讯协议
5.1 总线描述:
IIC协议是一个特殊总线信号协议。由start(开始信号)、stop(结束信号)、二进制数据等三部分组成,如下图。开始时,SCL高,SDA下降沿。之后,发送从机地址。在7位的地址位之后,是控制读写位,选择读写操作。当从机识别到与其对应的地址信息后,将向主机发送一个应答信号,在第9个时钟周期拉低SDA。在停止时,SCL保持高电平,SDA上升沿。
典型信号模拟
5.2 从机地址:
地址字节格式:高7位为模块地址,最低位为读/写操作,1代表读。
A7 | A6 | A5 | A4 | A3 | A2 | A1 | R/W |
0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
5.3 硬件连接:
5.4 数据接口:
电源引脚(VCC GND):供电电压范围为3.3V
串行时钟输入(SCL):SCL 引脚为 IIC 通信时钟线。
串行数据(SDA):SDA 引脚为 IIC 数据线,用于读、写数据。
5.5 数据帧格式:
(1)读取:
0 | 1 | 2 | 3 | 4 |
0X54 | 0XA1 | 0x55 | DATA(高位) | DATA(低位) |
从机地址(含读写位) | 读取命令 | 从机地址(含读写位) | 气体浓度高八位 | 气体浓度低八位 |
说明:读取出来的数据为当前气体浓度。浓度值计算公式:气体浓度=DATA(高位)*256+DATA(低位)
校零:
0 | 1 | 3 | 4 |
0X54 | 0X32 | DATA(高位) | DATA(低位) |
从机地址(含读写位) | 写入命令 | 气体浓度高八位 | 气体浓度低八位 |
说明:写入的数据为传感器在通风环境空气中的数值,写入后对示数校零。写入后,再读取一次确认是否校零成功。
5.6 读取流程:
该传感器上电后需要预热,时长30秒左右。预热完成后,进入正常工作状态。接入I2C总线, 主机发送读命令后进入读取状态,传感器会立即返回一个16位数据值,该数据表示当前检测的气体浓度值,浓度值计算公式:气体浓度=DATA(高位)*256+DATA(低位)。
下图是一次I2C通信过程的读取时序:起始信号start,发送从机地址0x54,接收到从机应答信号ACK, 发送读命令0xA1,接收到从机应答信号ACK;起始信号start,发送从机地址0x55,接收到从机应答信号ACK,读取气体浓度高字节,发送到从机应答信号ACK, 读取气体浓度低字节,结束信号Stop。
时序图
第6章 软件编程设计
(1) 程序例程
(1)读取浓度:
static uint16_t IIC_Read_Byte(u8 reg)
{
uint8_t rec_data;
I2C_Start();
I2C_SendByte(0x54);
I2C_WaitAck();
I2C_SendByte(0xe1);
I2C_WaitAck();
I2C_Start();
I2C_SendByte(0x55);
I2C_WaitAck();
rec_data = I2C_RecvByte();
rec_data16=rec_data;
I2C_SendACK(0);
rec_data = I2C_RecvByte();
rec_data16=rec_data16<<8|rec_data;
I2C_Stop();
return rec_data16;
}
/*起始信号*/
u8 I2C_Start(void)
{
SDA1H;
I2C_delay();
SCL1H;
I2C_delay();
if(!SDAread)
return 0;
SDA1L;
I2C_delay();
if(SDAread)
return 0;
SCL1L;
I2C_delay();
return 1;
}
/*发送一个字节*/
void I2C_SendByte(u8 SendByte) //数据从高位到低位//
{
u8 i=8;
SCL1L;
for (i=0; i<8; i++) //8位计数器
{
if(SendByte&0x80)//SDA准备
SDA1H;
else
SDA1L;
SCL1H; //拉高时钟,给从机采样
I2C_delay(); //延时保持IIC时钟频率,也是给从机采样有充足时间
SCL1L; //拉低时钟,给SDA准备
I2C_delay(); //延时保持IIC时钟频率
SendByte<<=1; //移出数据的最高位
}
}
/*等待ACK*/
u8 I2C_WaitAck(void) //返回为:=1有ACK,=0无ACK
{
uint16_t i=0;
SDA1H; //释放SDA
SCL1H; //SCL拉高进行采样
while(SDAread)//等待SDA拉低
{
i++; //等待计数
if(i==1000)//超时跳出循环
break;
}
if(SDAread)//再次判断SDA是否拉低
{
SCL1L;
return 0;//从机应答失败,返回0
}
I2C_delay();//延时保证时钟频率低于40K,
SCL1L;
I2C_delay(); //延时保证时钟频率低于40K,
return 1;//从机应答成功,返回1
}
/*接受八位数据*/
u8 I2C_RecvByte(void) //数据从高位到低位//
{
u8 i=8;
u8 ReceiveByte=0;
SDA1H; //释放SDA,给从机使用
I2C_delay(); //延时给从机准备SDA时间
for (i=0; i<8; i++) //8位计数器
{
ReceiveByte <<= 1;
SCL1H; //拉高时钟线,采样从机SDA
if(SDAread) //读数据
ReceiveByte |=0x01;
I2C_delay(); //延时保持IIC时钟频率
SCL1L; //拉低时钟线,处理接收到的数据
I2C_delay(); //延时给从机准备SDA时间
}
return ReceiveByte;
}
/*结束信号*/
void I2C_Stop(void)
{
SCL1L;
I2C_delay();
SDA1L;
I2C_delay();
SCL1H;
I2C_delay();
SDA1H;
I2C_delay();
}
/*IIC等待延时*/
void I2C_delay(void)
{
int x=5;
u8 i=100;
x=i*x;
while(x--);
}
void I2C_SendACK(u8 i)
{
if(i==1)
SDA1H;
else
SDA1L;
SCL1H;
I2C_delay();
SCL1L;
I2C_delay();
}