HT66F2390与SGP30学习笔记

SGP30传感器

基本电器特性

在这里插入图片描述

SGP30value
工作电压1.62v-1.92v
TVOC测量范围0ppb-60000ppb
CO2测量范围400ppm-60000ppm
采样率1HZ
通信协议IIC

引脚图

在这里插入图片描述

SGP30读取数据

在这里插入图片描述
SGP30的命令都是双字节的,先发高位,有如下命令:
在这里插入图片描述
SGP30初始化命令:0x2003
获取空气质量值命令:0x2008

SGP30获取的数据格式为:2位CO2数据+1位CO2的CRC校验+2位TVOC数据+1位TVOC的CRC校验。
模块上电需要15s左右初始化,在初始化阶段读取的CO2浓度为400ppm,TVOC为0ppd且恒定不变。因此上电后一直读,直到TVOC不为0并且CO2不为400,SGP30模块才初始化完成。

IIC协议

IIC通信时序
在这里插入图片描述

START条件:当SCL=1时,SDA由1变成0
STOP条件:当SCL=1时,SDA由0变成1
数据传输只能在SCL=1时进行。

#include<HT66F2390.h>
#define SCL _pf5
#define SDA _pf4
#define SCLC _pfc5
#define SDAC _pfc4

void I2C_START(void)
{	SCL=0; SDA=1;								//設定 SCL=0, SDA=1
	SCLC=0; SDAC=0; 					   		//SCL/SDA為輸出模式
	SCL=1; pause();								//SCL=1, SDA=1
	SDA=0;										//SDA=0 			     						
	SCL=0;								      	//SCL=0	
}

void I2C_STOP(void)
{	SCL=0; SDA=0;								//設定 SCL=0, SDA=0
	SDAC=0;								   		//SDA 為輸出模式
	SCL=1;								      	//SCL=1
	SDA=1;								    	//SDA=1
	SCL=0; 										//SCL=0	
}

void CheckACK(void)
{	SDAC=1;							     		//SDA 為輸入模式
	SCL=1; 							     		//設定 SCL=1
	while(SDA);									//等待 ACK(Low)
	SCL=0;					   					//設定 SCL=0
}

void WriteByte(u8 I2CData)
{	u8 temp=0b10000000;
	SDAC=0;										//SDA為輸出模式
	while(temp!=0)								//傳送8個位元				
	{	SDA=(I2CData & temp)?1:0; pause();		//設定 SDA 準位
		SCL=1; pause(); SCL=0;    				//產生 SCL Clock
		temp>>=1;								//下一位元
	}					
}

u8 ReadByte(void)
{	u8 I2CData=0, temp=0b10000000;
	SDAC=1;							 			//設定 SDA 為輸入模式
	while(temp!=0)								//接收8個位元
	{	SCL=1; pause();							//設定 SCL=1
		if(SDA) I2CData|=temp;					//接收位元值
		SCL=0;									//設定 SCL=0
		temp>>=1;								//下一位元
	} 
	return I2CData;
}

void I2C_ACK(void)                              //应答函数
{
    SDAC=1;                                     //设定SDA为输入模式
    SCL=0;                                      //设定SCL=0
    delayus(2);
    SDA=0;
    delayus(2)
    SCL=1;                                      //设定SCL=1
    delayus(5);
    SCL=0;                                      //设定SCL=0
 }
void I2C_NACK(void)                             //非应答函数
{
    SDAC=1;
    SCL=0;
    delayus(2);
    SDA=1;
    delayus(2);
    SCL=1;
    delayus(5);
    SCL=0;
}

void Delayms(u16 del)
{	u16 i;										//@fSYS=8MH,延遲del*1ms
	for(i=0;i<del;i++) GCC_DELAY(2000);			//Delay 1ms @ 8MHz
}

//时钟频率:8Mhz
//机器周期:2个时钟周期
//指令周期:6个机器周期 = 12个时钟周期

void delay(int count)
{
	int i;
	for(i=1;i<=count;i++)
	;
}
//延时 = (1/8M)*12*50*2(计数)  =  0.000075 s= 75us

SGP30实现

代码部分

#SGP30_SlaveAddress 0xB0
void SGP30_Write_Data(uchar address,uchar dat)//向SGP30的地址address中写入一个字节的数据
{

   I2C_START();

   WriteByte(SGP30_SlaveAddress);

   WriteByte(address);

   WriteByte(dat);

   I2C_STOP();

}

ulong SGP30_Read_Data()//从SGP30的地址address中读取一个字节的数据

{

   ulong dat;
   
   SGP30_IIC_Start();

   WriteByte(SGP30_SlaveAddress + 1);

   dat =ReadByte();               //CO2高位数据

   dat <<= 8;

   dat += ReadByte();              //CO2低位数据

   dat <<= 8;

   dat +=ReadByte();              //TVOC高位数据

   dat <<= 8;

   dat +=ReadByte();              //TVOC低位数据

  I2C_STOP();

   return(dat);

}

void SGP30_Init(void)//SGP30初始化函数

{

   SGP30_Write_Data(0x20,0x03);

}

void SGP30_Get_Co2_Tvoc_Value(uint *co2_value, uint *tvoc_value)//SGP30获取CO2和TVOC值函数

{

   ulong sgp30_value;

   SGP30_Write_Data(0x20,0x08);

   sgp30_value = SGP30_Read_Data();

   *co2_value = (sgp30_value & 0xffff0000) >> 16;

   *tvoc_value = sgp30_value & 0x0000ffff;

}

流程图

在这里插入图片描述

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: SGP30是一款基于互补金属氧化物半导体(CMOS)技术的环境传感器,能够同时检测二氧化碳(CO2)和挥发性有机化合物(TVOC)。它具有小巧、低功耗以及快速响应的特点,广泛应用于空气质量监测、室内空气净化和智能家居等领域。 而STM32F106C8T6是一款嵌入式系统微控制器,具有高性能、低功耗和丰富的外设功能。它采用了ARM Cortex-M3内核,能够运行高速的嵌入式应用程序,并集成了丰富的通信接口和多种IO口,可直接与各种传感器和执行机构进行通信。 两者在功能和应用上具有一定的相关性,可以实现CO2和TVOC的检测和控制;但它们属于不同的产品领域,SGP30是环境传感器,主要用于监测环境质量;STM32F106C8T6是微控制器,主要用于嵌入式系统控制和通信。在实际应用中,通常需要将SGP30与STM32F106C8T6等控制器相结合,构建完整的监测和控制系统,以实现更加精细的空气质量管理。 ### 回答2: sgp30是一种空气质量传感器,它可以测量二氧化碳、甲醛和VOC(挥发性有机化合物)的浓度。这个传感器采用I2C接口进行通信,并且有一个内部的温湿度传感器来帮助校准数据。 stm32f106c8t6是一种微控制器单片机,它采用ARM Cortex-M3内核,有64KB的Flash存储器和20KB的SRAM存储器。这个单片机可以连接各种外设,例如UART、SPI和I2C等,并且有多个定时器和计数器用于处理输入和输出。 如果要使用sgp30与stm32f106c8t6进行通信,可以将它们连接到I2C总线上,通过I2C总线协议进行通信。由于sgp30采用I2C接口,它可以直接连接到stm32f106c8t6上,而无需使用其他外围芯片或模块。在代码中,可以使用stm32f106c8t6的I2C库来读取或写入sgp30的数据。这样,就可以在stm32f106c8t6上实现自动化控制和数据收集。 总之,sgp30和stm32f106c8t6都是非常实用的电子元件,它们可以一起使用来构建各种空气质量监测系统或其他智能硬件项目。 ### 回答3: sgp30和stm32f106c8t6是两种不同类型的电子元器件。 sgp30是一款空气质量传感器模块。它可以测量室内空气中的挥发性有机化合物(VOC)和二氧化碳(CO2)浓度,从而提供相应的空气质量评估数据。sgp30通常用于室内环境监测和空气净化设备控制。 而stm32f106c8t6则是一款ARM Cortex-M3处理器核心的微控制器芯片。它具有512KB的闪存和64KB的SRAM,在工业控制和物联网等领域有广泛应用。stm32f106c8t6支持多种通信接口,包括USB、SPI、I2C和CAN等,能够与其他设备进行高效的数据交互。 尽管sgp30和stm32f106c8t6功能不同,但它们都属于电子元器件领域,广泛应用于智能家居、工业控制、环境监测、智能交通等领域,促进了人们的生活和工作效率的提升。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值