修复MS5607温度出错的BUG
This commit is contained in:
parent
e9f0a3d61b
commit
274a408676
|
@ -42,7 +42,7 @@
|
||||||
// 温度探头版本,SHT30=1,TMP117=2
|
// 温度探头版本,SHT30=1,TMP117=2
|
||||||
#define SHT30_SENSOR 1
|
#define SHT30_SENSOR 1
|
||||||
#define TMP117_SENSOR 2
|
#define TMP117_SENSOR 2
|
||||||
#define TEMP_SENSOR SHT30_SENSOR
|
#define TEMP_SENSOR TMP117_SENSOR
|
||||||
|
|
||||||
|
|
||||||
///已将DISTANCE写入配置文件,在结构体g_stConfigInfo.transducer_distace中
|
///已将DISTANCE写入配置文件,在结构体g_stConfigInfo.transducer_distace中
|
||||||
|
|
|
@ -1147,6 +1147,7 @@ void tem_hum_update_task(void const * argument)
|
||||||
|
|
||||||
uint16_t time_s_temp_humi = 0;//1秒计时,温湿度更新
|
uint16_t time_s_temp_humi = 0;//1秒计时,温湿度更新
|
||||||
// 开机先采集一次大气压温湿度
|
// 开机先采集一次大气压温湿度
|
||||||
|
MS56XX_Init();
|
||||||
if(tem_hun_check_flag)
|
if(tem_hun_check_flag)
|
||||||
{
|
{
|
||||||
//采集温湿度与大气压
|
//采集温湿度与大气压
|
||||||
|
|
|
@ -127,7 +127,7 @@ void MX_FREERTOS_Init(void) {
|
||||||
osThreadDef(anemometer, wind_task, osPriorityHigh, 0, 2*1024);// ˇçË١çĎň
|
osThreadDef(anemometer, wind_task, osPriorityHigh, 0, 2*1024);// ˇçË١çĎň
|
||||||
anemometerHandle = osThreadCreate(osThread(anemometer), NULL);
|
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);
|
temhum_update_taskHandle = osThreadCreate(osThread(temhum_update_task), NULL);
|
||||||
|
|
||||||
// osThreadDef(sensorTask, SensorTask, osPriorityRealtime, 0, 128);
|
// osThreadDef(sensorTask, SensorTask, osPriorityRealtime, 0, 128);
|
||||||
|
|
|
@ -175,7 +175,6 @@ void Flash_EnableReadProtection(void)
|
||||||
HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);
|
HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);
|
||||||
sht30_init();
|
sht30_init();
|
||||||
TMP117_Init();
|
TMP117_Init();
|
||||||
MS56XX_Init();
|
|
||||||
/* USER CODE END 2 */
|
/* USER CODE END 2 */
|
||||||
|
|
||||||
/* Call init function for freertos objects (in cmsis_os2.c) */
|
/* Call init function for freertos objects (in cmsis_os2.c) */
|
||||||
|
|
|
@ -8,7 +8,7 @@ static void MS56XX_Reset(void)
|
||||||
{
|
{
|
||||||
uint8_t _cmd[] = {0x1e};
|
uint8_t _cmd[] = {0x1e};
|
||||||
HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff);
|
HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff);
|
||||||
HAL_Delay(5);
|
osDelay(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void MS56XX_Read_PromData(uint16_t *VAL_C)
|
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_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff);
|
||||||
HAL_I2C_Master_Receive(&hi2c3, MS5607_ADDRESS, temp_buff, 2, 0xff);
|
HAL_I2C_Master_Receive(&hi2c3, MS5607_ADDRESS, temp_buff, 2, 0xff);
|
||||||
*(VAL_C + i) = (temp_buff[0] << 8)|temp_buff[1];
|
*(VAL_C + i) = temp_buff[0];
|
||||||
_cmd[0] += 2;
|
*(VAL_C + i) <<= 8;
|
||||||
osDelay(1000);
|
*(VAL_C + i) += temp_buff[1];
|
||||||
|
_cmd[0] += 0x02;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint16_t MS56XX_C_Value[8] = {0};
|
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 _cmd[] = {0x48};
|
||||||
uint8_t _addr[] = {0x00};
|
uint8_t _addr[] = {0x00};
|
||||||
HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff);
|
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_Transmit(&hi2c3, MS5607_ADDRESS, _addr, 1, 0xff);
|
||||||
HAL_I2C_Master_Receive(&hi2c3, MS5607_ADDRESS, D1_Value_Buff, 3, 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 += D1_Value_Buff[1];
|
||||||
press <<= 8;
|
press <<= 8;
|
||||||
press += D1_Value_Buff[2];
|
press += D1_Value_Buff[2];
|
||||||
term_printf("%x",press);
|
|
||||||
return press;
|
return press;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,7 +58,7 @@ static uint32_t MS56XX_ReadD2_Temp(void)
|
||||||
uint8_t _cmd[] = {0x58};
|
uint8_t _cmd[] = {0x58};
|
||||||
uint8_t _addr[] = {0x00};
|
uint8_t _addr[] = {0x00};
|
||||||
HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff);
|
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_Transmit(&hi2c3, MS5607_ADDRESS, _addr, 1, 0xff);
|
||||||
HAL_I2C_Master_Receive(&hi2c3, MS5607_ADDRESS, D2_Value_Buff, 3, 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;
|
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
|
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
|
*dT = D2_Value - MS56XX_C_Value[5] * 256; //公式 dT = D2 - TREF = D2 - C5 * 2^8
|
||||||
}
|
}else
|
||||||
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;
|
*dT *= -1;
|
||||||
}
|
}
|
||||||
*MS56XX_Temperature = 2000 + ( *dT * MS56XX_C_Value[6] ) / (0x00000001 << 23); //算出温度值的100倍,2001表示20.01° 公式TEMP =20°C + dT * TEMPSENS =2000 + dT * C6 / 2^23
|
|
||||||
|
|
||||||
if(*MS56XX_Temperature < -6000)
|
// term_printf("dT:%d\r\n", *dT);
|
||||||
{
|
*MS56XX_Temp = 2000 + *dT * ((int32_t)MS56XX_C_Value[6]/8388608.0); //算出温度值的100倍,2001表示20.01° 公式TEMP =20°C + dT * TEMPSENS =2000 + dT * C6 / 2^23
|
||||||
*MS56XX_Temperature=-6000;
|
|
||||||
}
|
|
||||||
if(*MS56XX_Temperature > 8500)
|
|
||||||
{
|
|
||||||
*MS56XX_Temperature=8500;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t MS56XX_GetPressureTemp (float *Temp, float *Press) //计算温度补偿压力
|
uint8_t MS56XX_GetPressureTemp (float *Temp, float *Press) //计算温度补偿压力
|
||||||
|
@ -104,17 +97,24 @@ uint8_t MS56XX_GetPressureTemp (float *Temp, float *Press) //
|
||||||
uint32_t D1_Value = MS56XX_ReadD1_Press(); //循环读取 D1
|
uint32_t D1_Value = MS56XX_ReadD1_Press(); //循环读取 D1
|
||||||
|
|
||||||
MS56XX_GetTemperature(&dT, &MS56XX_Temperature);//读取dT,Temp
|
MS56XX_GetTemperature(&dT, &MS56XX_Temperature);//读取dT,Temp
|
||||||
|
// 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
|
// term_printf("dT:%d\r\n", dT);
|
||||||
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("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
|
||||||
|
|
||||||
|
// term_printf("OFF:%d\r\n", OFF);
|
||||||
|
// term_printf("SENS:%d\r\n", SENS);
|
||||||
|
|
||||||
//温度补偿部分 逻辑看芯片手册
|
//温度补偿部分 逻辑看芯片手册
|
||||||
int32_t T2;
|
int64_t T2 = 0;
|
||||||
int64_t OFF2;
|
int64_t OFF2 = 0;
|
||||||
int64_t SENS2;
|
int64_t SENS2 = 0;
|
||||||
if (MS56XX_Temperature < 2000 ) // second order temperature compensation when under 20 degrees C
|
if (MS56XX_Temperature < 2000 ) // second order temperature compensation when under 20 degrees C
|
||||||
{
|
{
|
||||||
T2 = ( dT * dT ) / (( uint64_t )0x0000000001 << 31);
|
T2 = (dT * dT) / 2147483648.0;
|
||||||
OFF2 = 61 * ((MS56XX_Temperature - 2000) * (MS56XX_Temperature - 2000)) / 16;
|
OFF2 = 61 * ((MS56XX_Temperature - 2000) * (MS56XX_Temperature - 2000)) / 16;
|
||||||
SENS2 = 2 * ((MS56XX_Temperature - 2000) * (MS56XX_Temperature - 2000)) ;
|
SENS2 = 2 * ((MS56XX_Temperature - 2000) * (MS56XX_Temperature - 2000)) ;
|
||||||
if (MS56XX_Temperature < -1500)
|
if (MS56XX_Temperature < -1500)
|
||||||
|
@ -123,43 +123,50 @@ uint8_t MS56XX_GetPressureTemp (float *Temp, float *Press) //
|
||||||
SENS2 = SENS2 + 8 * ((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;
|
MS56XX_Temperature = MS56XX_Temperature - T2;
|
||||||
OFF = OFF - OFF2;
|
OFF = OFF - OFF2;
|
||||||
SENS = SENS - SENS2;
|
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; //单位 ℃
|
// 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]);
|
||||||
*Press = ((float)Tmp_Pressure)/100; //单位 mbar
|
// term_printf("D1:%d\r\n", D1_Value);
|
||||||
term_printf("%f", *Press);
|
//
|
||||||
|
// term_printf("dT:%d\r\n", dT);
|
||||||
if(*Temp<-60)
|
//
|
||||||
|
// 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;
|
return 0;
|
||||||
}
|
}
|
||||||
if(*Temp>85)
|
if(MS56XX_Temperature>8500)
|
||||||
{
|
{
|
||||||
*Temp=85;
|
MS56XX_Temperature=8500;
|
||||||
|
*Temp = ((float)MS56XX_Temperature)/100;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if(*Press<10)
|
if(Tmp_Pressure<1000)
|
||||||
{
|
{
|
||||||
*Press=10;
|
Tmp_Pressure=1000;
|
||||||
|
*Press = ((float)Tmp_Pressure)/100;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if(*Press>1200)
|
if(Tmp_Pressure>120000)
|
||||||
{
|
{
|
||||||
*Press=1200;
|
Tmp_Pressure=120000;
|
||||||
|
*Press = ((float)Tmp_Pressure)/100;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
*Temp = ((float)MS56XX_Temperature)/100;
|
||||||
|
*Press = ((float)Tmp_Pressure)/100;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,7 +83,7 @@ u_int8_t sht30_init()
|
||||||
if(ret == TRUE)
|
if(ret == TRUE)
|
||||||
term_printf("Sensor Sht30 Check OK.\r\n Temp:%.2f,Humi:%.2f\r\n", temp,humi);
|
term_printf("Sensor Sht30 Check OK.\r\n Temp:%.2f,Humi:%.2f\r\n", temp,humi);
|
||||||
else
|
else
|
||||||
term_printf("Sensor Sht30 Check Err.\r\n");
|
// term_printf("Sensor Sht30 Check Err.\r\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue