sht10温湿度传感器说明.
- 格式:doc
- 大小:364.50 KB
- 文档页数:29
温湿度传感器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!)//-----------------------------------------------------------------------------------}}。
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。
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 内存中,用于内部的信号校准。
两线制的串行接口与内部的电压调整,使外围系统集成变得快速而简单。
微小的体积、极低的功耗,使 SHT1x 成为各类应用的首选。
SHT1X 提供表贴 LCC 封装,可以使用标准回流焊接。
同样性能的传感器还有插针型封装 (SHT7X 和柔性 PCB 封装(SHTA1。
Datasheet SHT1x传感器性能相对湿度参数条件 mintypmax 单位分辨率 1 精度 2 SHT10 典型值±4.5 最大值见图 2 精度 2 SHT11 典型值 ±3.0 最大值参见图 2 精度 2 SHT15 典型值 ±2.0 最大值参见图 2 重复性 ±0.1 互换性可完全互换迟滞 ±1 非线性原始数据 ±3线性化后响应时间3 τ (63% 工作范围漂移 4常规SHT11SHT15SHT10± 0± 2± 4± 6± 8± 100102030405060708090100Relative Humidity (%RH∆R H (%R H图 2: 25°C 时每种型号传感器的相对湿度最大误差电气特性参数条件mintypmax 单位供电电压功耗 5 休眠状态测量状态平均通讯 2线制数字接口 , 参见通讯存储条件10 – 50°C (0 – 125°C peak, 20 – 60%RH1传感器默认测量分辨率为温度 14位,湿度 12位。
可以通过给状态寄存器发送命令将其降低为温度 12位,湿度 8位。
2 此精度为出厂检验时,传感器在 25°C (77°F 和 3.3V. 条件下测试的精度指标,其不包括迟滞和非线性,且只适于非冷凝环境。
温度参数条件 mintypmax 单位分辨率 1 精度 2 SHT10 典型值±0.5 最大值参见图 3 精度 2 SHT11 典型值 ±0.4 最大值参见图 3 精度 2 SHT15 典型值 ±0.3 最大值参见图 3 重复性 ±0.1 互换性可完全互换工作范围响应时间6 τ (63% 漂移SHT11SHT10± 0.0± 0.5± 1.0± 1.5± 2.0± 2.5± 3.0-40-2020406080100Temperature (°C∆T (°C图 3: 每种型号传感器的温度最大误差包装4 在挥发性有机混合物中数值可能会高一些。
见说明书 1.3。
5 此数值为VDD=5.5V 在温度为 25°C时 , 12bit 测量, 1次 /秒条件下的平均值传感器型号包装数量订货号SHT10条带和卷轴 SHT11条带和卷轴条带和卷轴条带和卷轴 SHT15 条带和卷轴条带和卷轴020406080100-40-20020406080100120Temperature (°CR e l a t i v e H u m i d i t y (%图 4: 工作条件1.2 焊接说明可以使用标准的回流焊炉对 SHT1x 进行焊接。
传感器完全符合 IPC/JEDEC J-STD-020C 焊接标准,在最高 260℃温度下,接触时间应小于 40 秒。
图 5 :JEDEC 标准的焊接过程图, Tp<=260℃ , tp<40sec ,无铅焊接。
T L <220℃ ,t l <150sec,焊接时温度上升和下降的速度应小于 5℃/sec。
在蒸气回流焊炉中条件为 TP<233℃ ,tp<60 秒,焊接时温度上升和下降的速度应小于 10℃ /秒。
手动焊接,在最高 350℃ 7的温度条件下接触时间须少于 5 秒。
7233℃相当于 451℉, 260℃相当于 500℉, 350℃相当于 662℉注意 : 回流焊焊接后,将传感器在 >75%RH的环境下存放至少 12小时,以保证聚合物的重新水合。
否则将导致传感器读数的漂移。
不论在哪种情况下,无论是手动焊接还是回流焊结,在焊接后都不允许冲洗电路板。
所以建议客户使用“免洗”型焊锡膏。
如果将传感器应用于腐蚀性气体中,引脚焊盘与 PCB 都需要被封装起来以避免接触不良或短路。
对于 SHT1X 的引脚排列,建议使用图 7 的尺寸。
传感器衬底外镀30μm 的铜, 5μm 的镍和0.1μm 的金。
图 6: Rear side electrodes of sensor, view from top side.图 7: 推荐 SHT1x 引脚尺寸 . 单位 mm.1.3 存储条件与操作说明湿度传感器不是普通的电子元器件,需要仔细防护,这一点用户必须重视。
长期暴露在高浓度的化学蒸汽中将会致使传感器的读数产生漂移。
因此建议将传感器存放于原包装包括封装的 ESD 包内,并且符合以下条件:温度范围 10℃ -50℃(在有限时间内 0-125℃;湿度为 20-60%RH(没有 ESD 封装的传感器。
若传感器没有原包装,则需8Datasheet SHT1x在生产和运输过程中,要保证传感器远离高浓度的化学溶剂。
要避免使用挥发性胶水、粘性胶带、不干胶贴纸,或具有挥发性的包装材料,如发泡塑料袋、泡沫塑料等。
生产场合需要保持通风。
详细信息请参考“操作说明”或联系我们。
1.4恢复处理暴露在极端工作条件或化学蒸汽中的传感器,可通过如下处理,使其恢复到校准状态。
烘干:在 100-105℃和 < 5%RH 的湿度条件下保持10小时;重新水合:在 20-30℃和 >75%RH 的湿度条件下保持 12 小时 9。
1.5温度影响气体的相对湿度,在很大程度上依赖于温度。
因此在测量湿度时,应尽可能保证所有测量同一湿度的传感器在同一温度下工作。
在做测试时,应保证被测试的传感器和参考传感器在同样的温度下,然后比较湿度的读数。
如果 SHT1x 与易发热的电子元件在同一个印刷线路板上,在设计电路时应采取措施尽可能将热传递的影响减小到最小。
如:保持外壳的良好通风,SHT1x 与印刷电路板其它部分的铜镀层应尽可能最小,或在两者之间留出一道缝隙。
(见图 8图 8: SHT1x 俯视图, PCB 板的开口可避免导热此外,如果测量频率过高则会导致传感器自身发热,详细信息请参考 3.3 节。
8例如, 3M 防静电包,“ 1910”带拉链975%RH 的湿度场可以很便利的由 NaCl 饱和盐溶液制得,100-105℃对应于 212-221℉, 20-30℃对应于 68-86℉。
1.6光线SHT1x 不受光线影响。
但长时间暴露在太阳光下或强烈的紫外线辐射中,会使外壳老化。
1.7保护膜SHT1x 的敏感元件部位直接与空气接触,没有保护膜。
如果在外面加保护膜可防止灰尘和水滴进入以保护传感器,同时会降低渗入传感器内部的化学蒸汽的浓度。
为了避免加保护膜对响应时间的影响,保护膜后面的空气体积应尽可能减小。
对于 SHT1X 封装系列,盛世瑞恩推荐使用配套的 SF1型过滤罩,达到 IP54 保护等级。
(若需要更高的防护等级, 如 IP67, SF1 必须用环氧树脂封装在 PCB 板上。
见图 9。
图 9:Side view of SF1 filter cap mounted between PCB and housing wall. Volume below membrane is kept minimal.1.8用于密封 /包装的材质许多材质吸收湿气并将充当缓冲器的角色,这会加大响应时间和迟滞。
因此传感器周边的材质应谨慎选用。
推荐使用的材料有:金属材料 , LCP, POM (Delrin,PTFE (Teflon, PE, PEEK, PP, PB, PPS, PSU, PVDF,PVF。
用于密封和粘合的材质(保守推荐:推荐使用充满环氧树脂的方法进行电子元件的封装,或是硅树脂。
这些材料释放的气体也有可能污染 SHT7x(见 1.3 。
因此,应最后进行传感器的组装,并将其置于通风良好处,或在 50℃的环境中干燥 24小时,以使其在封装前将污染气体释放。
1.9布线规则和信号完整性如果 SCK 和 DATA 信号线相互平行并且非常接近, 有可能导致信号串扰和通讯失败。
解决方法是在两个信号线之间放置 VDD 和 /或 GND ,将信号线隔开,和使用屏蔽电缆。
此外,降低 SCK 频率也可能提高信号传输的完整性。
如使用导线,应在电源引脚(VDD , GND 之间加一个 100nF 的去藕电容, 用于滤波。
此电容应尽量靠近传感器。
详情可参阅Datasheet SHT1x“ESD, Latchup and EMC” 应用说明。