stm32 HTU21D例程

上传人:碎****木 文档编号:235773298 上传时间:2022-01-06 格式:DOCX 页数:5 大小:12.23KB
返回 下载 相关 举报
stm32 HTU21D例程_第1页
第1页 / 共5页
stm32 HTU21D例程_第2页
第2页 / 共5页
stm32 HTU21D例程_第3页
第3页 / 共5页
亲,该文档总共5页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《stm32 HTU21D例程》由会员分享,可在线阅读,更多相关《stm32 HTU21D例程(5页珍藏版)》请在金锄头文库上搜索。

1、#include Anal_I2C.h #include HTU21D.h #include Kalman.h #include math.h#define A 8.1332f #define B 1762.39f #define C 235.66fHTU21D_Struct HTU;Kalman_Data_Struct Kalman_Temperature_Data,Kalman_Dew_Data; float Dew_Q=1,Dew_R=400;void Data_Send_3Axis(int16_t x,int16_t y,int16_t z);uint8_t HTU21D_Check_

2、CRC(uint16_t message_from_sensor, uint8_t check_value_from_sensor);uint8_t Read_User_Register(void)uint8_t User_Reg; Anal_I2C_START();Anal_I2C_SendByte(0x80);/写地址Anal_I2C_SendByte(0xe7);/写入读指令Anal_I2C_START();Anal_I2C_SendByte(0x81); /读地址while (!Anal_I2C_SCL_STATE);User_Reg=Anal_I2C_ReceiveByte();/读

3、取/Anal_I2C_ReceiveBuf(User_Reg,1); Anal_I2C_STOP();return User_Reg;float Read_Temperature(void)uint8_t Tem_Reg3; uint16_t Temp=0; float T; Anal_I2C_START();Anal_I2C_SendByte(0x80);/写地址Anal_I2C_SendByte(0xe3);/e3 触发温度测量 e5 湿度Anal_I2C_START();Anal_I2C_SendByte(0x81); /读地址while (!Anal_I2C_SCL_STATE);An

4、al_I2C_ReceiveBuf(Tem_Reg,3); Anal_I2C_STOP();Temp= ( (Temp|Tem_Reg0) 8 ) | Tem_Reg1 ; if(HTU21D_Check_CRC(Temp,Tem_Reg2)=0) /CRC-8校验Temp&=0xfffc; T=Temp*175.72f/0xffff-46.85f;/Data_Send_3Axis(T*100.0f,2,3);/return KalmanFilter(T,&Kalman_Temperature_Data,1,1); return T;elsereturn 999;float Read_Humi

5、dity(void)uint8_t Hum_Reg4; uint16_t Temp=0; float RT; Anal_I2C_START();Anal_I2C_SendByte(0x80);/写地址Anal_I2C_SendByte(0xe5);/e3 触发温度测量 e5 湿度Anal_I2C_START();Anal_I2C_SendByte(0x81); /读地址while (!Anal_I2C_SCL_STATE); Anal_I2C_ReceiveBuf(Hum_Reg,3);Anal_I2C_STOP();Temp= ( (Temp|Hum_Reg0) 8 ) | Hum_Reg1

6、 ; if(HTU21D_Check_CRC(Temp,Hum_Reg2)=0)/CRC-8 校验Temp&=0xfffc; RT=Temp*125.0f/0xffff-6.0f;/Data_Send_3Axis(Hum_Reg0,Hum_Reg1,RT);/return KalmanFilter(RT,&Kalman_Humidity_Data,Humidity_Q,Humidity_R); return RT;elsereturn 999;void HTU21D_Init(void)Anal_I2C_START();Anal_I2C_SendByte(0x80);/写地址Anal_I2C_

7、SendByte(0xe6);/写入写指令Anal_I2C_SendByte(0x83); /读地址/Anal_I2C_ReceiveBuf(User_Reg,1); Anal_I2C_STOP();/*/两个参数一个是传感器的源数据,另一个是传感器得出的CRC 校验值/如果校验通过返回 0,不通过返回非 0/From: http:/www.nongnu.org/avr-libc/user-manual/grouputilcrc.html/POLYNOMIAL=0x0131=x8+x5+x4+1:http:/en.wikipedia.org/wiki/Computation_of_cyclic

8、_redundancy_checks#define SHIFTED_DIVISOR 0x988000 /This is the 0x0131 polynomial shifted to farthest left of three bytes/*uint8_t HTU21D_Check_CRC(uint16_t message_from_sensor, uint8_t check_value_from_sensor)uint8_t i;/Test cases from datasheet:/message = 0xDC, checkvalue is 0x79/message = 0x683A,

9、 checkvalue is 0x7C/message = 0x4E85, checkvalue is 0x6Buint32_t remainder = (uint32_t)message_from_sensor 8; /Pad with 8 bits because we have to add in the check valueuint32_t divsor = (uint32_t)SHIFTED_DIVISOR;remainder |= check_value_from_sensor; /Add on the check valuefor (i = 0 ; i 16 ; i+) /Op

10、erate on only 16 positions of max 24. The remaining 8 are our remainder and should be zero when were done.if( remainder & (uint32_t)1= 1; /Rotate the divsor max 16 times so that we have 8 bits left of a remainderreturn (uint8_t)remainder;void Updata_HTU(void)float temp; if(temp=Read_Temperature()!=9

11、99)HTU.T=temp; if(temp=Read_Humidity()!=999)HTU.RH=temp; temp=Calc_Dewpoint(HTU.RH,HTU.T);HTU.Dew=KalmanFilter(temp,&Kalman_Dew_Data,Dew_Q,Dew_R);float Calc_Dewpoint(float RH,float T)float PP,T_Dew; PP=powf(10, A-B/(T+C);T_Dew=-(B/(log10f(RH*PP/100.0f)-A ) +C);return T_Dew;/头文件#ifndef HTU21D_H_ #def

12、ine HTU21D_H_ #include typedef structfloat T; float RH; float T_Set;float RH_Set; float Dew; float Dew_Set; HTU21D_Struct;extern HTU21D_Struct HTU; extern float Dew_Q,Dew_R;uint8_t Read_User_Register(void);float Read_Temperature(void); float Read_Humidity(void); void HTU21D_Init(void);void Updata_HTU(void);float Calc_Dewpoint(float RH,float T); #endif

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 教育/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号