SHT10介绍
- 格式:doc
- 大小:324.00 KB
- 文档页数:9
Datasheet SHT1x (SHT10, SHT11, SHT15数字温湿度传感器• 完全标定• 数字信号输出• 低功耗• 卓越的长期稳定性• SMD 封装–适于回流焊接外形尺寸图 1 SHT1x 传感器尺寸(1mm=0.039inch,“ 11”表示该传感器型号为 SHT11。
外部接口:1:GND, 2: DATA, 3: SCK, 4: VDD传感器芯片此说明书适用于 SHT1x-V4。
SHT1x-V4 是第四代硅传感芯片,除了湿度、温度敏感元件以外,还包括一个放大器, A/D 转换器, OTP 内存和数字接口。
第四代传感器在其顶部印有产品批次号,以字母及数字表示,如“ A5Z ”,见图 1。
材质传感器的核心为 CMOS 芯片,外围材料顶层采用环氧 LCP ,底层为 FR4。
传感器符合 ROHS 和WEEE 标准,因此不含 Pb, Cd, Hg, Cr(6+, PBB, PBDE 。
实验包如要进行直接的传感器测量,传感器性能检验或者温湿度实验,客户可选用 EK-H2,其中包括传感器和与电脑配套的软、硬件。
如需进行更复杂的,要求更高的测量,可选用 EK-H3。
它可以同时进行 20个点的温湿度测量。
产品概述SHT1x (包括 SHT10, SHT11 和 SHT15 属于 Sensirion 温湿度传感器家族中的贴片封装系列。
传感器将传感元件和信号处理电路集成在一块微型电路板上,输出完全标定的数字信号。
传感器采用专利的 CMOSens® 技术,确保产品具有极高的可靠性与卓越的长期稳定性。
传感器包括一个电容性聚合体测湿敏感元件、一个用能隙材料制成的测温元件,并在同一芯片上,与 14 位的 A/D 转换器以及串行接口电路实现无缝连接。
因此,该产品具有品质卓越、响应迅速、抗干扰能力强、性价比高等优点。
每个传感器芯片都在极为精确的湿度腔室中进行标定,校准系数以程序形式储存在 OTP 内存中,用于内部的信号校准。
SHT10温湿度传感器的通信协议命令包含:1.读取站号命令2.写站号命令3.读取数据4.手动矫正数据串口参数设置:读站号命令(固定命令)主站从站地址功能码H地址L地址 H数据L数据 CRC00 03 00 01 00 01 CRClo CRChi 从站从站地址功能码H地址L地址H数据CRC00 03 02 00 XX CRClo CRChi 注:返回帧与主站相同设备地址:(XX=01-FF)示例:命令00 03 00 01 00 01 D4 1B(固定命令)回复00 03 02 00 FF C5 C4 (设备默认站号FF)写站号命令主站从站地址功能码H地址L地址寄存器个数寄存器个数数据长度数据CRC00 10 00 01 00 01 02 00 XX CRClo CRChi 注:(XX=0X01-0XFF)从站从站地址功能码 H地址L地址寄存器个数CRC00 10 00 01 00 01 CRClo CRChi 示例:命令00 10 00 01 00 01 02 00 33 EA 04回复00 10 00 01 00 01 51 D8读数据主站从站地址功能码 H地址L地址寄存器个数寄存器个数CRCXX 03 00 00 00 02 CRClo CRChi注:(XX=0X01-0XFF)从站从站地址功能码数据长度数据数据CRCXX 03 04 19 AD 1B E4 CRClo CRCh 示例命令FF 03 00 00 00 02 D1 D5回复FF 03 04 19 AD 1B E4 79 FA注:温度:第4,5个字节19 AD温度=读数/100-40度湿度:第5,6个字节1B E4。
温湿度传感器SHT10驱动程序——基于MSP430这是暑假时用430的单片机写的温湿度传感器SHT10的程序,参考了官方的51例程,分享一下~~/****************************************Copyright(c)********************************************************************************************LiPeng********************* *************************************--------------FileInfo-------------------------------------------------------------------------------** File Name: Sht10_Driver.c** Created by: LiPeng** Created date: 2008-09-15** Version: 1.0** Descriptions: The original version****------------------------------------------------------------------------------------------------------** Modified by:** Modified date:** Version:** Descriptions:****------------------------------------------------------------------------------------------------------** System Function: Sht10 Driver------温湿度传感器SHT10驱动** 使用MSP430-F413连接方式:** VCC: P6.3** SCK: P6.4** SDA: P6.5*********************************************************************** ***********************************/#include <msp430x14x.h>/*宏定义,延时函数,参数为1时相应延时分别为1us和1ms*/#define CPU_F (double)1000000#define delay_us(x) __delay_cycles((long)(CPU_F * (double)x/1000000.0)) #define delay_ms(x) __delay_cycles((long)(CPU_F * (double)x/1000.0))/*常量定义*/#define uint unsigned int#define uchar unsigned char#define ulong unsigned long//adr command r/w#define STATUS_REG_W 0x06 //000 0011 0#define STATUS_REG_R 0x07 //000 0011 1#define MEASURE_TEMP 0x03 //000 0001 1#define MEASURE_HUMI 0x05 //000 0010 1#define RESET 0x1e //000 1111 0#define bitselect 0x01 //选择温度与湿度的低位读#define noACK 0#define ACK 1#define HUMIDITY 2#define TEMPERATURE 1#define SCK BIT4#define SDA BIT5#define SVCC BIT3#define SCK_H P6OUT|=SCK#define SCK_L P6OUT&=~SCK#define SDA_H P6OUT|=SDA#define SDA_L P6OUT&=~SDA#define SVCC_H P6OUT|=SVCC#define SVCC_L P6OUT&=~SVCCtypedef union{unsigned int i;float f;}value;uint table_temp[3];uint table_humi[3];uint temten;uint humi_true;/******************************************************************** ****************************************Function Name: S_Init**Description: 初始化**Input Parameters: 无**Output Parameters: 无*************************************/void S_Init(){P6SEL&=~(SCK+SDA+SVCC); //选择P6.3 P6.4 为IO端口,输出 P6.5输入P6DIR|=(SCK+SVCC);P6DIR&=~SDA;BCSCTL1=(XT2OFF+RSEL2); //关闭XT2,1MHz DOCDCOCTL=DCO2; //设定DCO频率为1MHz}/******************************************************************** ****************************************Function Name: S_Transstart**Description: 发送开始时序**** generates a transmission start** _____ ________** DATA: |_______|** ___ ___** SCK : ___| |___| |______**Input Parameters: 无**Output Parameters: 无********************************************************************* *************************************/void S_Transstart(){P6DIR|=SDA;SDA_H;SCK_L;_NOP();SCK_H;_NOP();SDA_L;_NOP();SCK_L;_NOP();_NOP();_NOP();SCK_H;_NOP();SDA_H;_NOP();SCK_L;P6DIR&=~SDA;}****************************************Function Name: S_WriteByte**Description: 写时序**Input Parameters: 无**Output Parameters: 无********************************************************************* *************************************/char S_WriteByte(unsigned char value){unsigned char i,error=0;P6DIR|=SDA;for(i=0x80;i>0;i/=2) //shift bit for masking{if(i&value)SDA_H; //masking value with i , write to SENSI-BUSelseSDA_L;SCK_H; //clk for SENSI-BUS_NOP();_NOP();_NOP(); //pulswith approx. 5 usSCK_L;}SDA_H; //release DATA-lineP6DIR&=~SDA; //Change SDA to be inputSCK_H; //clk #9 for ackerror=P6IN; //check ack (DATA will be pulled down by SHT11)error&=SDA;P6DIR|=SDA;SCK_L;if(error)return 1; //error=1 in case of no acknowledgereturn 0;}/******************************************************************** ****************************************Function Name: S_ReadByte**Description: 读时序**Input Parameters: ack--->reads a byte form the Sensibus and gives an acknowledge in case of "ack=1"**Output Parameters: 无********************************************************************* *************************************/char S_ReadByte(unsigned char ack){unsigned char i,val=0;P6DIR|=SDA;SDA_H; //release DATA-lineP6DIR&=~SDA;for(i=0x80;i>0;i/=2) //shift bit for masking{SCK_H; //clk for SENSI-BUSif(P6IN&SDA)val=(val|i); //read bitSCK_L;}P6DIR|=SDA;if(ack) //in case of "ack==1" pull down DATA-LineSDA_L;elseSDA_H;SCK_H; //clk #9 for ack_NOP();_NOP();_NOP(); //pulswith approx. 5 usSCK_L;SDA_H; //release DATA-lineP6DIR&=~SDA;return val;}/******************************************************************** ****************************************Function Name: S_Connectionreset**Description: 通讯复位时序** communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart** _____________________________________________________ ________** DATA: |_______|** _ _ _ _ _ _ _ _ _ ___ ___** SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______ **Input Parameters: 无**Output Parameters: 无********************************************************************* *************************************/void S_Connectionreset(){unsigned char ClkCnt;P6DIR|=SDA;SDA_H;SCK_L; //Initial statefor(ClkCnt=0;ClkCnt<9;ClkCnt++) //9 SCK cycles{SCK_H;SCK_L;}S_Transstart(); //transmission start}/******************************************************************** ****************************************Function Name: S_Softreset**Description: 软件复位时序resets the sensor by a softreset**Input Parameters: 无**Output Parameters: 无********************************************************************* *************************************/char S_Softreset(){unsigned char error=0;S_Connectionreset(); //reset communicationerror+=S_WriteByte(RESET); //send RESET-command to sensorreturn error; //error=1 in case of no response form the sensor}/******************************************************************** ****************************************Function Name: S_WriteStatusReg**Description: 写状态寄存器**Input Parameters: *p_value**Output Parameters: 无********************************************************************* *************************************/char S_WriteStatusReg(unsigned char *p_value){unsigned char error=0;S_Transstart(); //transmission starterror+=S_WriteByte(STATUS_REG_W); //send command to sensorerror+=S_WriteByte(*p_value); //send value of status registerreturn error; //error>=1 in case of no response form the sensor}/******************************************************************** ****************************************Function Name: S_Mearsure**Description: 读时序 makes a measurement (humidity/temperature) withchecksum**Input Parameters: *p_value ,*p_checknum ,mode**Output Parameters: 无********************************************************************* *************************************/unsigned char S_Measure(unsigned char *p_value, unsigned char*p_checksum, unsigned char mode){unsigned error=0;unsigned int i;S_Transstart(); //transmission startswitch(mode){ //send command to sensorcase TEMPERATURE: error+=S_WriteByte(MEASURE_TEMP); break;case HUMIDITY: error+=S_WriteByte(MEASURE_HUMI); break;}P6DIR&=~SDA;for(i=0;i<65535;i++) //wait until sensor has finished the measurement if((P6IN&SDA)==0)break;if(P6IN&SDA)error+=1; //or timeout (~2 sec.) is reached*(p_value)=S_ReadByte(ACK); //read the first byte (MSB)*(p_value+1)=S_ReadByte(ACK); //read the second byte (LSB)*p_checksum=S_ReadByte(noACK); //read checksumreturn(error);}/******************************************************************** ****************************************Function Name: S_Calculate**Description: 计算**Input Parameters: humi [Ticks] (12 bit)** temp [Ticks] (14 bit)**Output Parameters: humi [%RH]** temp [癈]********************************************************************* *************************************/void S_Calculate(unsigned int *p_humidity ,unsigned int *p_temperature) {const float C1=-4.0; // for 8 Bitconst float C2=+0.648; // for 8 Bitconst float C3=-0.0000072; // for 8 Bitconst float D1=-39.6; // for 12 Bit @ 3Vconst float D2=+0.04; // for 12 Bit @ 3Vconst float T1=0.01; // for 8 bitconst float T2=0.00128; // for 8 bitfloat rh=*p_humidity; // rh: Humidity [Ticks] 12 Bitfloat t=*p_temperature; // t: Temperature [Ticks] 14 Bitfloat rh_lin; // rh_lin: Humidity linearfloat rh_true; // rh_true: Temperature compensated humidityfloat t_C; // t_C : Temperature [癈]t_C=t*D2+D1; //calc. temperature from ticks to [癈]rh_lin=C3*rh*rh + C2*rh + C1; //calc. humidity from ticks to [%RH]rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //calc. temperature compensated humidity [%RH]if(rh_true>100)rh_true=100; //cut if the value is outside ofif(rh_true<0.1)rh_true=0.1; //the physical possible range*p_temperature=t_C; //return temperature [癈]*p_humidity=rh_true; //return humidity[%RH]}void main(){value humi_val,temp_val;unsigned char error,checksum;unsigned int i,temphigh,templow;unsigned int RegCMD=0x01;WDTCTL=WDTPW+WDTHOLD; //Stop watchdog timer to prevent time out resetS_Init();SVCC_H;S_Connectionreset();S_WriteStatusReg((unsigned char *)&RegCMD);while(1){error=0;error+=S_Measure((unsigned char*) &humi_val.i,&checksum,HUMIDITY);//measure humidityerror+=S_Measure((unsigned char*) &temp_val.i,&checksum,TEMPERATURE); //measure temperatureif(error!=0)S_Connectionreset(); //in case of an error: connection resetelse{templow=(humi_val.i&0xff00);humi_val.i=templow>>8;temphigh=((temp_val.i&0xf)<<8);templow=((temp_val.i&0xff00)>>8);temp_val.i=temphigh+templow;S_Calculate(&humi_val.i,&temp_val.i); //calculate humidity, temperature//temp_val_NOP();//printf("temp:%5.1fC humi:%5.1f%% dewpoint:%5.1fC\n",temp_val.f,humi_val.f,dew_point);}//----------wait approx. 0.8s to avoid heating upSHTxx------------------------------for (i=0;i<40000;i++); //(be sure that the compiler doesn't eliminate this line!)//-----------------------------------------------------------------------------------}}。
S H T10介绍-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN
新型温湿度传感器SHT10的原理及应用
收藏此信息打印该信息添加:不详来源:未知
摘要:详细介绍Sensirion传感器公司推出的新型集成数字式温湿度传感器。
该传感器采用CMOSens专利技术将温度湿度传感器、A/D转换器及数字接口无缝结合,使传感器具有体积小、响应速度快、接口简单、性价比高等特点。
本文结合实例讲解该传感器的命令、时序,以及其在单片机系统中的应用。
关键词:SHT10;温湿度传感器;数字传感器;ATmeg8L
引言
随着社会的不断发展前进,人们进入了数字化信息时代,对生活质量的要求越来越高。
汽车、空调、除湿器、烘干机等都已家喻户晓,它们都离不开对温度、湿度等环境因素的要求。
瑞士Sensirion公司推出了SHTxx单片数字温湿度集成传感器。
采用CMOS过程微加工专利技术(CMOSens technology),确保产品具有极高的可靠性和出色的长期稳定性。
该传感器由1个电容式聚合体测湿元件和1个能隙式测温元件组成,并与1个14位A/D转换器以及1个2-wire数字接口在单芯片中无缝结合,使得该产品具有功耗低、反应快、抗干扰能力强等优点。
1 SHT10的特点
SHT10的主要特点如下:
◆相对湿度和温度的测量兼有露点输出;
◆全部校准,数字输出;
◆接口简单(2-wire),响应速度快;
◆超低功耗,自动休眠;
◆出色的长期稳定性;
◆超小体积(表面贴装);
◆测湿精度±45%RH,测温精度±0.5℃(25℃)。
2 引脚说明及接口电路
(1)典型应用电路
SHT10典型应用电路如图1所示。
(2)电源引脚(VDD、GND)
SHT10的供电电压为2.4V~5.5V。
传感器上电后,要等待11ms,从“休眠”状态恢复。
在此期间不发送任何指令。
电源引脚(VDD和GND)之间可增加1个100uF的电容器,用于去耦滤波。
(3)串行接口
SHT10的两线串行接口(bidirectional 2-wire)在传感器信号读取和电源功耗方面都做了优化处理,其总线类似I2C总线但并不兼容I2C总线。
①串行时钟输入(SCK)。
SCK引脚是MCU与SHTIO之问通信的同步时钟,由于接口包含了全静态逻辑,因此没有最小时钟频率。
②串行数据(DATA)。
DATA引脚是1个三态门,用于MCU与SHT10之间的数据传输。
DATA的状态在串行时钟SCK的下降沿之后发生改变,在SCK的上升沿有效。
在数据传输期间,当SCK为高电平时,DATA数据线上必须保持稳定状态。
为避免数据发生冲突,MCU应该驱动DATA使其处于低电平状态,而外部接1个上拉电阻将信号拉至高电平。
3 命令与时序
(1)SHT10命令
SHT10命令编码表如表1所列。
(2)命令时序
发送一组“传输启动”序列进行数据传输初始化,如图2所示。
其时序为:当SCK为高电平时DT翻转保持低电平,紧接着SCK产生1个发脉冲,随后在SCK为高电平时DATA翻转保持高电平。
紧接着的命令包括3个地址位(仅支持“000”)和5个命令位。
SHT10指示正确接收命令的时序为:在第8个SCK时钟的下降沿之后将DATA拉为低电平(ACK位),在第9个SCK时钟的下降沿之后释放DATA(此时为高电平)。
(3)测量时序(RH和T)
“000 00101”为相对湿度(RH)量,“000 00101”为温度(θ)测量。
发送一组测量命令后控制器要等待测量结束,这个过程大约需要20/80/320ms对应其8/12/14位的测量。
测量时间随内部晶振的速度而变化,最多能够缩短30%。
SHT10下拉DATA至低电平而使其进入空闲模式。
重新启动SCK时钟读出数据之前,控制器必须等待这个“数据准备好”信号。
接下来传输2个字节的测量数据和1个字节的CRC校验。
MCU必须通过拉低DATA来确认每个字节。
所有的数据都从MSB开始,至LSB有效。
例如对于12位数据,第5个SCK时钟时的数值作为MSB位;而对于8位数据,第1个字节(高8位)数据无意义。
确认CRC数据位之后,通信结束。
如果不使用CRC-8校验,控制器可以在测量数据LSB位之后,通过保持ACK位为高电平来结束本次通信。
测量和通信结束后,SHT10自动进入休眠状态模式。
(4)复位时序
如果与SHT10的通信发生中断,可以通过随后的信号序列来复位串口,如图3所示。
保持DATA为高电平,触发SCK时钟9次或更多,接着在执行下次命令之前必须发送一组“传输启动”序列。
这些序列仅仅复位串口,状态寄存器的内容仍然保留。
(5)状态寄存器读写时序
SHT10通过状态寄存器实现初始状态设定。
读状态寄存器时序如图4所示。
写状态寄存器时序如图5所示。
4 几点说明
①CRC-8校验。
整个数据的传输过程都由8位校验保证,确保任何错误的数据都能够被检测到并删除[1] 。
②为保持自身发热温升小于0.1℃,SHTxx的激活时间不超过10%。
如12位精度测量,每秒最多测量2次。
③转换为物理量输出相对湿度输出转换公式为:
其中,RHlinear为25℃时相对湿度的线性值,SORH为传感
器输出的相对湿度的数值,c1,c2,c3为系数,如表3所列。
当测量温度与25℃相差较大时,则需要考虑传感器的温度系数:
其中,RHtrue为温度不等于25℃时相对湿度的实际值,θc为当前温度,t1、t2是系数,如表4所列。
温度输出转换公式为:
其中,θ为实际温度,SOθ为传感器输出的温度数值,θ1,θ2为系数,如表5、表6所列。
由于湿度与温度经由同一块芯片测量而得,因此SHT10可以同时实现高质量的露点测量。