From 274a4086765b33df67fd2a377f48e0e3c116130c Mon Sep 17 00:00:00 2001 From: 95384 <664090429@qq.com> Date: Wed, 5 Mar 2025 14:55:07 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DMS5607=E6=B8=A9=E5=BA=A6?= =?UTF-8?q?=E5=87=BA=E9=94=99=E7=9A=84BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App/Inc/anemometer_dev.h | 2 +- App/Src/anemometer_dev.c | 1 + Core/Src/freertos.c | 2 +- Core/Src/main.c | 1 - Drivers/MS5607/ms5607.c | 119 +++++++++++++++++++++------------------ Drivers/Sht3x/sht30.c | 2 +- 6 files changed, 67 insertions(+), 60 deletions(-) diff --git a/App/Inc/anemometer_dev.h b/App/Inc/anemometer_dev.h index a0d385a..13107e5 100644 --- a/App/Inc/anemometer_dev.h +++ b/App/Inc/anemometer_dev.h @@ -42,7 +42,7 @@ // 温度探头版本,SHT30=1,TMP117=2 #define SHT30_SENSOR 1 #define TMP117_SENSOR 2 -#define TEMP_SENSOR SHT30_SENSOR +#define TEMP_SENSOR TMP117_SENSOR ///已将DISTANCE写入配置文件,在结构体g_stConfigInfo.transducer_distace中 diff --git a/App/Src/anemometer_dev.c b/App/Src/anemometer_dev.c index 96bbcbe..4665d22 100644 --- a/App/Src/anemometer_dev.c +++ b/App/Src/anemometer_dev.c @@ -1147,6 +1147,7 @@ void tem_hum_update_task(void const * argument) uint16_t time_s_temp_humi = 0;//1秒计时,温湿度更新 // 开机先采集一次大气压温湿度 + MS56XX_Init(); if(tem_hun_check_flag) { //采集温湿度与大气压 diff --git a/Core/Src/freertos.c b/Core/Src/freertos.c index 5ee9e32..24bb4f8 100644 --- a/Core/Src/freertos.c +++ b/Core/Src/freertos.c @@ -127,7 +127,7 @@ void MX_FREERTOS_Init(void) { osThreadDef(anemometer, wind_task, osPriorityHigh, 0, 2*1024);// ٷ anemometerHandle = osThreadCreate(osThread(anemometer), NULL); - osThreadDef(temhum_update_task, tem_hum_update_task, osPriorityAboveNormal, 0, 512);//ʪȣѹ + osThreadDef(temhum_update_task, tem_hum_update_task, osPriorityAboveNormal, 0, 1024);//ʪȣѹ temhum_update_taskHandle = osThreadCreate(osThread(temhum_update_task), NULL); // osThreadDef(sensorTask, SensorTask, osPriorityRealtime, 0, 128); diff --git a/Core/Src/main.c b/Core/Src/main.c index 90768f8..5089718 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -175,7 +175,6 @@ 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 index 6c7ff5f..c3bde7f 100644 --- a/Drivers/MS5607/ms5607.c +++ b/Drivers/MS5607/ms5607.c @@ -8,7 +8,7 @@ static void MS56XX_Reset(void) { uint8_t _cmd[] = {0x1e}; HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff); - HAL_Delay(5); + osDelay(5); } static void MS56XX_Read_PromData(uint16_t *VAL_C) @@ -19,11 +19,11 @@ static void MS56XX_Read_PromData(uint16_t *VAL_C) { 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); + *(VAL_C + i) = temp_buff[0]; + *(VAL_C + i) <<= 8; + *(VAL_C + i) += temp_buff[1]; + _cmd[0] += 0x02; } - } static uint16_t MS56XX_C_Value[8] = {0}; @@ -39,7 +39,7 @@ static uint32_t MS56XX_ReadD1_Press(void) uint8_t _cmd[] = {0x48}; uint8_t _addr[] = {0x00}; HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff); - osDelay(10); + osDelay(20); HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _addr, 1, 0xff); HAL_I2C_Master_Receive(&hi2c3, MS5607_ADDRESS, D1_Value_Buff, 3, 0xff); @@ -49,7 +49,6 @@ static uint32_t MS56XX_ReadD1_Press(void) press += D1_Value_Buff[1]; press <<= 8; press += D1_Value_Buff[2]; - term_printf("%x",press); return press; } @@ -59,7 +58,7 @@ static uint32_t MS56XX_ReadD2_Temp(void) uint8_t _cmd[] = {0x58}; uint8_t _addr[] = {0x00}; HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff); - osDelay(10); + osDelay(20); HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _addr, 1, 0xff); HAL_I2C_Master_Receive(&hi2c3, MS5607_ADDRESS, D2_Value_Buff, 3, 0xff); @@ -72,29 +71,23 @@ static uint32_t MS56XX_ReadD2_Temp(void) return Temp; } -static void MS56XX_GetTemperature (int32_t *dT, int32_t *MS56XX_Temperature) //¶ +static void MS56XX_GetTemperature (int32_t *dT, int32_t *MS56XX_Temp) //¶ { uint32_t D2_Value = MS56XX_ReadD2_Temp(); //ѭȡ D2 - if(D2_Value > ((uint32_t)MS56XX_C_Value[5] * (0x00000001 << 8) )) +// term_printf("D2:%d\r\n", D2_Value); + + if(D2_Value > (MS56XX_C_Value[5] * 256)) { - *dT = D2_Value - (( uint32_t )MS56XX_C_Value[5] * (0x00000001 << 8)); //ʽ dT = D2 - TREF = D2 - C5 * 2^8 - } - else + *dT = D2_Value - MS56XX_C_Value[5] * 256; //ʽ dT = D2 - TREF = D2 - C5 * 2^8 + }else { - *dT = (( uint32_t ) MS56XX_C_Value[5] * (0x00000001 << 8) ) - D2_Value; + *dT = MS56XX_C_Value[5] * 256 - D2_Value; //ʽ dT = D2 - TREF = D2 - C5 * 2^8 *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; - } + +// term_printf("dT:%d\r\n", *dT); + *MS56XX_Temp = 2000 + *dT * ((int32_t)MS56XX_C_Value[6]/8388608.0); //¶ֵ1002001ʾ20.01 ʽTEMP =20C + dT * TEMPSENS =2000 + dT * C6 / 2^23 } uint8_t MS56XX_GetPressureTemp (float *Temp, float *Press) //¶Ȳѹ @@ -104,62 +97,76 @@ uint8_t MS56XX_GetPressureTemp (float *Temp, float *Press) // uint32_t D1_Value = MS56XX_ReadD1_Press(); //ѭȡ D1 MS56XX_GetTemperature(&dT, &MS56XX_Temperature);//ȡdTTemp +// term_printf("TEMP:%d\r\n", MS56XX_Temperature); - 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 +// term_printf("dT:%d\r\n", dT); +// term_printf("TEMP:%d\r\n", MS56XX_Temperature); + + int64_t OFF = ((int64_t)MS56XX_C_Value[2] * 131072) + ((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] * 65536) + ((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; +// term_printf("OFF:%d\r\n", OFF); +// term_printf("SENS:%d\r\n", SENS); + + //¶Ȳ ߼оƬֲ + int64_t T2 = 0; + int64_t OFF2 = 0; + int64_t SENS2 = 0; 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 ) + T2 = (dT * dT) / 2147483648.0; + 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 )); + 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; - } - + +// term_printf("T2:%d\r\n", T2); 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 + int32_t Tmp_Pressure = ((int32_t)D1_Value * SENS/2097152 - OFF) / 32768; //ʽ 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) +// term_printf("\r\nC1-C6:%d %d %d %d %d %d\r\n", MS56XX_C_Value[1], MS56XX_C_Value[2], MS56XX_C_Value[3], MS56XX_C_Value[4], MS56XX_C_Value[5], MS56XX_C_Value[6]); +// term_printf("D1:%d\r\n", D1_Value); +// +// term_printf("dT:%d\r\n", dT); +// +// term_printf("OFF:%d\r\n", OFF); +// term_printf("SENS:%d\r\n", SENS); +// term_printf("P:%d\r\n", Tmp_Pressure); +// term_printf("TEMP:%d\r\n", MS56XX_Temperature); +// term_printf("PRESS:%d\r\n", Tmp_Pressure); + if(MS56XX_Temperature<-6000) { - *Temp=-60; + MS56XX_Temperature=-6000; + *Temp = ((float)MS56XX_Temperature)/100; return 0; } - if(*Temp>85) + if(MS56XX_Temperature>8500) { - *Temp=85; + MS56XX_Temperature=8500; + *Temp = ((float)MS56XX_Temperature)/100; return 0; } - if(*Press<10) + if(Tmp_Pressure<1000) { - *Press=10; + Tmp_Pressure=1000; + *Press = ((float)Tmp_Pressure)/100; return 0; } - if(*Press>1200) + if(Tmp_Pressure>120000) { - *Press=1200; + Tmp_Pressure=120000; + *Press = ((float)Tmp_Pressure)/100; return 0; } + *Temp = ((float)MS56XX_Temperature)/100; + *Press = ((float)Tmp_Pressure)/100; return 1; } diff --git a/Drivers/Sht3x/sht30.c b/Drivers/Sht3x/sht30.c index 23bd38a..1c3aa95 100644 --- a/Drivers/Sht3x/sht30.c +++ b/Drivers/Sht3x/sht30.c @@ -83,7 +83,7 @@ u_int8_t sht30_init() if(ret == TRUE) term_printf("Sensor Sht30 Check OK.\r\n Temp:%.2f,Humi:%.2f\r\n", temp,humi); else - term_printf("Sensor Sht30 Check Err.\r\n"); +// term_printf("Sensor Sht30 Check Err.\r\n"); return 0; }