From e9f0a3d61b0910089e14fc67416ab7a16af09516 Mon Sep 17 00:00:00 2001 From: 95384 <664090429@qq.com> Date: Tue, 4 Mar 2025 13:20:19 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0MS5607=E9=A9=B1=E5=8A=A8?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2HP203B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App/Src/anemometer_dev.c | 4 +- Core/Src/main.c | 2 + Drivers/MS5607/ms5607.c | 165 +++++++++++++++++++++++++++++++++++++++ Drivers/MS5607/ms5607.h | 21 +++++ EWARM/micro_climate.ewp | 13 ++- EWARM/micro_climate.ewt | 9 +++ 6 files changed, 212 insertions(+), 2 deletions(-) create mode 100644 Drivers/MS5607/ms5607.c create mode 100644 Drivers/MS5607/ms5607.h diff --git a/App/Src/anemometer_dev.c b/App/Src/anemometer_dev.c index ced44cf..96bbcbe 100644 --- a/App/Src/anemometer_dev.c +++ b/App/Src/anemometer_dev.c @@ -10,6 +10,7 @@ #include "FIR.h" #include "LowPassFilter.h" #include "encrypt.h" +#include "ms5607.h" #define AVE_TIME 600 //滑动平均时间,秒,最大600 #define COVER_TINE 10 //探头遮挡后导致的接收次数过小的报错临界次数 @@ -1070,7 +1071,8 @@ static void getTempHumiPress(void) //采集备用温度与大气压 float backupTemperature1; float backupTemperature2; - uint8_t hp203_ret = get_HP203_data(&backupTemperature1, &g_stMcs_Para.pressure); +// uint8_t hp203_ret = get_HP203_data(&backupTemperature1, &g_stMcs_Para.pressure); + uint8_t hp203_ret = MS56XX_GetPressureTemp(&backupTemperature1, &g_stMcs_Para.pressure); uint8_t sht30_ret = get_temp_humi_data(&backupTemperature2, &g_stMcs_Para.humidity); #if TEMP_SENSOR == SHT30_SENSOR g_stMcs_Para.temperature = backupTemperature2; diff --git a/Core/Src/main.c b/Core/Src/main.c index 956ae80..90768f8 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -44,6 +44,7 @@ #include "sht30.h" #include "hp203b.h" #include "tmp117.h" +#include "ms5607.h" #include "inflash.h" /* USER CODE END Includes */ @@ -174,6 +175,7 @@ void Flash_EnableReadProtection(void) HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED); sht30_init(); TMP117_Init(); + MS56XX_Init(); /* USER CODE END 2 */ /* Call init function for freertos objects (in cmsis_os2.c) */ diff --git a/Drivers/MS5607/ms5607.c b/Drivers/MS5607/ms5607.c new file mode 100644 index 0000000..6c7ff5f --- /dev/null +++ b/Drivers/MS5607/ms5607.c @@ -0,0 +1,165 @@ +#include "ms5607.h" +#include "i2c.h" +#include "filter.h" +#include "anemometer_dev.h" +#include "uart_dev.h" + +static void MS56XX_Reset(void) +{ + uint8_t _cmd[] = {0x1e}; + HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff); + HAL_Delay(5); +} + +static void MS56XX_Read_PromData(uint16_t *VAL_C) +{ + uint8_t _cmd[] = {0xa0}; + uint8_t temp_buff[2] = {0}; + for(uint8_t i = 0; i < 8; i++) + { + HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff); + HAL_I2C_Master_Receive(&hi2c3, MS5607_ADDRESS, temp_buff, 2, 0xff); + *(VAL_C + i) = (temp_buff[0] << 8)|temp_buff[1]; + _cmd[0] += 2; + osDelay(1000); + } + +} + +static uint16_t MS56XX_C_Value[8] = {0}; +void MS56XX_Init(void) +{ + MS56XX_Reset(); + MS56XX_Read_PromData(MS56XX_C_Value); +} + +static uint32_t MS56XX_ReadD1_Press(void) +{ + uint8_t D1_Value_Buff[3] = {0xFF, 0xFF, 0xFF}; + uint8_t _cmd[] = {0x48}; + uint8_t _addr[] = {0x00}; + HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff); + osDelay(10); + HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _addr, 1, 0xff); + HAL_I2C_Master_Receive(&hi2c3, MS5607_ADDRESS, D1_Value_Buff, 3, 0xff); + + uint32_t press; + press = D1_Value_Buff[0]; + press <<= 8; + press += D1_Value_Buff[1]; + press <<= 8; + press += D1_Value_Buff[2]; + term_printf("%x",press); + return press; +} + +static uint32_t MS56XX_ReadD2_Temp(void) +{ + uint8_t D2_Value_Buff[3] = {0x00, 0x00, 0x00}; + uint8_t _cmd[] = {0x58}; + uint8_t _addr[] = {0x00}; + HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff); + osDelay(10); + HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _addr, 1, 0xff); + HAL_I2C_Master_Receive(&hi2c3, MS5607_ADDRESS, D2_Value_Buff, 3, 0xff); + + uint32_t Temp; + Temp = D2_Value_Buff[0]; + Temp <<= 8; + Temp += D2_Value_Buff[1]; + Temp <<= 8; + Temp += D2_Value_Buff[2]; + return Temp; +} + +static void MS56XX_GetTemperature (int32_t *dT, int32_t *MS56XX_Temperature) //¶ +{ + uint32_t D2_Value = MS56XX_ReadD2_Temp(); //ѭȡ D2 + + if(D2_Value > ((uint32_t)MS56XX_C_Value[5] * (0x00000001 << 8) )) + { + *dT = D2_Value - (( uint32_t )MS56XX_C_Value[5] * (0x00000001 << 8)); //ʽ dT = D2 - TREF = D2 - C5 * 2^8 + } + else + { + *dT = (( uint32_t ) MS56XX_C_Value[5] * (0x00000001 << 8) ) - D2_Value; + *dT *= -1; + } + *MS56XX_Temperature = 2000 + ( *dT * MS56XX_C_Value[6] ) / (0x00000001 << 23); //¶ֵ1002001ʾ20.01 ʽTEMP =20C + dT * TEMPSENS =2000 + dT * C6 / 2^23 + + if(*MS56XX_Temperature < -6000) + { + *MS56XX_Temperature=-6000; + } + if(*MS56XX_Temperature > 8500) + { + *MS56XX_Temperature=8500; + } +} + +uint8_t MS56XX_GetPressureTemp (float *Temp, float *Press) //¶Ȳѹ +{ + int32_t dT; + int32_t MS56XX_Temperature; + uint32_t D1_Value = MS56XX_ReadD1_Press(); //ѭȡ D1 + + MS56XX_GetTemperature(&dT, &MS56XX_Temperature);//ȡdTTemp + + int64_t OFF = ((int64_t)MS56XX_C_Value[2] * (0x00000001 << 17)) + ((int64_t)MS56XX_C_Value[4] * dT )/ 64.0; //ʽ OFF = OFFT1 + TCO *dT = C2 *2^17 +(C4 *dT )/ 2^6 + int64_t SENS = ((int64_t)MS56XX_C_Value[1] * (0x00000001 << 16)) + ((int64_t)MS56XX_C_Value[3] * dT )/ 128.0; //ʽSENS = SENST1 + TCS* dT= C1 * 2^16 + (C3 * dT )/ 2^7 + + //¶Ȳ ߼оƬֲ + int32_t T2; + int64_t OFF2; + int64_t SENS2; + if (MS56XX_Temperature < 2000 ) // second order temperature compensation when under 20 degrees C + { + T2 = ( dT * dT ) / (( uint64_t )0x0000000001 << 31); + OFF2 = 61 * (( MS56XX_Temperature - 2000 ) * ( MS56XX_Temperature - 2000 )) / 16; + SENS2 = 2 * (( MS56XX_Temperature - 2000 ) * ( MS56XX_Temperature - 2000 )) ; + if ( MS56XX_Temperature < -1500 ) + { + OFF2 = OFF2 + 15 * (( MS56XX_Temperature + 1500 ) * ( MS56XX_Temperature + 1500 )); + SENS2 = SENS2 + 8 * (( MS56XX_Temperature + 1500 ) * ( MS56XX_Temperature + 1500 )); + } + } + else //(Temperature > 2000) + { + T2 = 0; + OFF2 = 0; + SENS2 = 0; + } + + MS56XX_Temperature = MS56XX_Temperature - T2; + OFF = OFF - OFF2; + SENS = SENS - SENS2; + + + int32_t Tmp_Pressure = (D1_Value * SENS / (0x00000001 << 21) - OFF ) / (0x00000001 << 15); //ʽ P = D1 * SENS - OFF = (D1 * SENS / 2^21 - OFF) / 2^15 + + *Temp = ((float)MS56XX_Temperature)/100; //λ + *Press = ((float)Tmp_Pressure)/100; //λ mbar + term_printf("%f", *Press); + + if(*Temp<-60) + { + *Temp=-60; + return 0; + } + if(*Temp>85) + { + *Temp=85; + return 0; + } + if(*Press<10) + { + *Press=10; + return 0; + } + if(*Press>1200) + { + *Press=1200; + return 0; + } + return 1; +} diff --git a/Drivers/MS5607/ms5607.h b/Drivers/MS5607/ms5607.h new file mode 100644 index 0000000..6a96947 --- /dev/null +++ b/Drivers/MS5607/ms5607.h @@ -0,0 +1,21 @@ +#ifndef __MS5607_H__ +#define __MS5607_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "comm_types.h" + +#define MS5607_ADDRESS 0x77<<1 + +void MS56XX_Init(void); +uint8_t MS56XX_GetPressureTemp (float *Temp, float *Press); + +#ifdef __cplusplus +} +#endif +#endif /*__ __MS5607_H__ */ + diff --git a/EWARM/micro_climate.ewp b/EWARM/micro_climate.ewp index 6518386..bd28a1e 100644 --- a/EWARM/micro_climate.ewp +++ b/EWARM/micro_climate.ewp @@ -375,6 +375,7 @@ $PROJ_DIR$\..\App\Inc $PROJ_DIR$\..\Drivers\HP203B $PROJ_DIR$\..\Drivers\Tmp117 + $PROJ_DIR$\..\Drivers\MS5607