diff --git a/App/Inc/anemometer_dev.h b/App/Inc/anemometer_dev.h index 99c3cb3..854a64e 100644 --- a/App/Inc/anemometer_dev.h +++ b/App/Inc/anemometer_dev.h @@ -20,6 +20,8 @@ +#define ADC_GAIN_ENABLE 190 +#define ADC_GAIN_DISABLE 1900 #define K_128 0xA12EE1FE // 延时REV_MUTE_DELAY us启动ADC采集数据 diff --git a/App/Inc/frt_protocol.h b/App/Inc/frt_protocol.h index 4095d93..9b7ac9b 100644 --- a/App/Inc/frt_protocol.h +++ b/App/Inc/frt_protocol.h @@ -58,32 +58,33 @@ typedef enum FRT_REGISTER_COEFFICIENT = 34, /* ճϵ */ FRT_REGISTER_DISTANCE_NS = 35, /* ϱ */ FRT_REGISTER_DISTANCE_WE = 36, /* */ - FRT_REGISTER_ERROR_LOG = 37, /* ־ */ - FRT_REGISTER_WIND_C_NS = 38, /* õϱ */ - FRT_REGISTER_WIND_C_WE = 39, /* õĶ */ - FRT_REGISTER_LINEAR_POINT_X_1 = 40, /* Բֵԭʼ1 */ - FRT_REGISTER_LINEAR_POINT_X_2 = 41, /* Բֵԭʼ2 */ - FRT_REGISTER_LINEAR_POINT_X_3 = 42, /* Բֵԭʼ3 */ - FRT_REGISTER_LINEAR_POINT_X_4 = 43, /* Բֵԭʼ4 */ - FRT_REGISTER_LINEAR_POINT_X_5 = 44, /* Բֵԭʼ5 */ - FRT_REGISTER_LINEAR_POINT_Y_1 = 45, /* ԲֵУ׼1 */ - FRT_REGISTER_LINEAR_POINT_Y_2 = 46, /* ԲֵУ׼2 */ - FRT_REGISTER_LINEAR_POINT_Y_3 = 47, /* ԲֵУ׼3 */ - FRT_REGISTER_LINEAR_POINT_Y_4 = 48, /* ԲֵУ׼4 */ - FRT_REGISTER_LINEAR_POINT_Y_5 = 49, /* ԲֵУ׼5 */ - FRT_REGISTER_LINEAR_ENABLE = 50, /* Բֵʹ */ - FRT_REGISTER_MAX_WAVE_1 = 51, /* */ - FRT_REGISTER_MAX_WAVE_2 = 52, /* */ - FRT_REGISTER_MAX_WAVE_3 = 53, /* */ - FRT_REGISTER_MAX_WAVE_4 = 54, /* */ - FRT_REGISTER_ID_1 = 55, /* ID16 */ - FRT_REGISTER_ID_2 = 56, /* ID32 */ - FRT_REGISTER_ID_3 = 57, /* ID48 */ - FRT_REGISTER_ID_4 = 58, /* ID64 */ - FRT_REGISTER_ENCRYPT_1 = 59, /* 16 */ - FRT_REGISTER_ENCRYPT_2 = 60, /* 32 */ - FRT_REGISTER_ENCRYPT_3 = 61, /* 48 */ - FRT_REGISTER_ENCRYPT_4 = 62, /* 64 */ + FRT_REGISTER_ANEMOMETER_DELAY = 37, /* ƥʱ */ + FRT_REGISTER_ERROR_LOG = 38, /* ־ */ + FRT_REGISTER_WIND_C_NS = 39, /* õϱ */ + FRT_REGISTER_WIND_C_WE = 40, /* õĶ */ + FRT_REGISTER_LINEAR_POINT_X_1 = 41, /* Բֵԭʼ1 */ + FRT_REGISTER_LINEAR_POINT_X_2 = 42, /* Բֵԭʼ2 */ + FRT_REGISTER_LINEAR_POINT_X_3 = 43, /* Բֵԭʼ3 */ + FRT_REGISTER_LINEAR_POINT_X_4 = 44, /* Բֵԭʼ4 */ + FRT_REGISTER_LINEAR_POINT_X_5 = 45, /* Բֵԭʼ5 */ + FRT_REGISTER_LINEAR_POINT_Y_1 = 46, /* ԲֵУ׼1 */ + FRT_REGISTER_LINEAR_POINT_Y_2 = 47, /* ԲֵУ׼2 */ + FRT_REGISTER_LINEAR_POINT_Y_3 = 48, /* ԲֵУ׼3 */ + FRT_REGISTER_LINEAR_POINT_Y_4 = 49, /* ԲֵУ׼4 */ + FRT_REGISTER_LINEAR_POINT_Y_5 = 50, /* ԲֵУ׼5 */ + FRT_REGISTER_LINEAR_ENABLE = 51, /* Բֵʹ */ + FRT_REGISTER_MAX_WAVE_1 = 52, /* */ + FRT_REGISTER_MAX_WAVE_2 = 53, /* */ + FRT_REGISTER_MAX_WAVE_3 = 54, /* */ + FRT_REGISTER_MAX_WAVE_4 = 55, /* */ + FRT_REGISTER_ID_1 = 56, /* ID16 */ + FRT_REGISTER_ID_2 = 57, /* ID32 */ + FRT_REGISTER_ID_3 = 58, /* ID48 */ + FRT_REGISTER_ID_4 = 59, /* ID64 */ + FRT_REGISTER_ENCRYPT_1 = 60, /* 16 */ + FRT_REGISTER_ENCRYPT_2 = 61, /* 32 */ + FRT_REGISTER_ENCRYPT_3 = 62, /* 48 */ + FRT_REGISTER_ENCRYPT_4 = 63, /* 64 */ }FRT_MsgRegister; #pragma pack(push,1) diff --git a/App/Inc/inflash.h b/App/Inc/inflash.h index 4cf3243..944bbe3 100644 --- a/App/Inc/inflash.h +++ b/App/Inc/inflash.h @@ -68,6 +68,7 @@ typedef struct _factory_config_info{ u_int16_t linear_point_5_y; /* 线性插值点5Y */ u_int16_t linear_enable; /* 线性插值使能 */ u_int32_t encrypt_1; /* 后32位密文 */ + u_int16_t anemometerDelayTime; /* 换能器匹配层延时us */ u_int16_t temp0; /* 占位留待升级 */ u_int16_t temp1; /* 占位留待升级 */ u_int16_t temp2; /* 占位留待升级 */ diff --git a/App/Src/anemometer_dev.c b/App/Src/anemometer_dev.c index 2dfb453..0d12442 100644 --- a/App/Src/anemometer_dev.c +++ b/App/Src/anemometer_dev.c @@ -11,6 +11,7 @@ #include "LowPassFilter.h" #include "encrypt.h" #include "rain.h" +#include "ms5607.h" #define AVE_TIME 600 //滑动平均时间,秒,最大600 #define COVER_TINE 10 //探头遮挡后导致的接收次数过小的报错临界次数 @@ -94,30 +95,30 @@ void config_adc_gain(uint8_t channel, uint16_t max_val) switch(channel) { case 0x01: - if(max_val <= 180) + if(max_val <= ADC_GAIN_ENABLE) gain_status.gain_status_s = 1; - else if(max_val >= 1900) + else if(max_val >= ADC_GAIN_DISABLE) gain_status.gain_status_s = 0; break; case 0x02: - if(max_val <= 180) + if(max_val <= ADC_GAIN_ENABLE) gain_status.gain_status_n = 1; - else if(max_val >= 1900) + else if(max_val >= ADC_GAIN_DISABLE) gain_status.gain_status_n = 0; break; case 0x03: - if(max_val <= 180) + if(max_val <= ADC_GAIN_ENABLE) gain_status.gain_status_e = 1; - else if(max_val >= 1900) + else if(max_val >= ADC_GAIN_DISABLE) gain_status.gain_status_e = 0; break; case 0x04: - if(max_val <= 180) + if(max_val <= ADC_GAIN_ENABLE) gain_status.gain_status_w = 1; - else if(max_val >= 1900) + else if(max_val >= ADC_GAIN_DISABLE) gain_status.gain_status_w = 0; break; @@ -554,8 +555,8 @@ void wind_task(void const * argument) tof_error_log_NS = 0; g_error_log.tof_error_NS = 0; // 计算成us - tofx = ((tofx-FIR_PHASE_DELAY)/ADC_SAMP_RATE_MHz)+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.0001f - 2.0f; - tofy = ((tofy-FIR_PHASE_DELAY)/ADC_SAMP_RATE_MHz)+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.0001f - 2.0f; + tofx = ((tofx-FIR_PHASE_DELAY)/ADC_SAMP_RATE_MHz)+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.0001f - g_stConfigInfo.anemometerDelayTime*1.0f; + tofy = ((tofy-FIR_PHASE_DELAY)/ADC_SAMP_RATE_MHz)+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.0001f - g_stConfigInfo.anemometerDelayTime*1.0f; // 通过各通道渡越时间求时间差 dtof = tofx-tofy; @@ -623,8 +624,8 @@ void wind_task(void const * argument) tof_error_log_WE = 0; g_error_log.tof_error_WE = 0; // 计算成us - tofx = ((tofx-FIR_PHASE_DELAY)/ADC_SAMP_RATE_MHz)+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.000001f - 2.0f; - tofy = ((tofy-FIR_PHASE_DELAY)/ADC_SAMP_RATE_MHz)+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.000001f - 2.0f; + tofx = ((tofx-FIR_PHASE_DELAY)/ADC_SAMP_RATE_MHz)+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.000001f - g_stConfigInfo.anemometerDelayTime*1.0f; + tofy = ((tofy-FIR_PHASE_DELAY)/ADC_SAMP_RATE_MHz)+REV_MUTE_DELAY_US-1.0f/DRIVE_FREQ_MHz+0.000001f - g_stConfigInfo.anemometerDelayTime*1.0f; // 通过各通道渡越时间求时间差 dtof = tofx-tofy; @@ -1065,25 +1066,57 @@ void my_update_mcs_param(float new_wind_speed, float new_wind_dirction) win_10min.index = (win_10min.index + 1) % g_usrConfigInfo.speed_average_time;//更新索引 } + +uint8_t SHT45_ERR_NUM = 0; //采集温度,湿度,大气压 static void getTempHumiPress(void) { - //采集备用温度与大气压 float backupTemperature1; - float backupTemperature2; - uint8_t hp203_ret = get_HP203_data(&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; -#endif /*TEMP_SENSOR == SHT30_SENSOR*/ - -#if TEMP_SENSOR == TMP117_SENSOR - TMP117_Init(); - osDelay(20); - uint8_t tmp117_ret = TMP117_Get_Temp(&g_stMcs_Para.temperature); - -// TMP117出问题 - if(tmp117_ret != HAL_OK) + float temp; + //采集MS5607并判错 + if(get_HP203_data(&temp, &g_stMcs_Para.pressure) != HAL_OK) + { + //置错误标志位 + g_error_log.temp_error_HP203B = 1; + //错误处理 + } + else + { + //恢复错误标志位 + g_error_log.temp_error_HP203B = 0; + } + //采集SHT45并判错 + if(get_temp_humi_data(&backupTemperature1, &g_stMcs_Para.humidity) != HAL_OK) + { + //错误处理 + //断电重启,本次关电,下次上电,下下次返回正常数据 + if(g_error_log.temp_error_SHT30 == 0) + { + HAL_GPIO_WritePin(GPIOB, GPIO_SHT_PWR_EN_Pin, GPIO_PIN_RESET); + HAL_I2C_DeInit(&hi2c1); + SHT45_ERR_NUM = 1; + }else + { + //确保只执行一次重新初始化程序 + if(SHT45_ERR_NUM == 1) + { + HAL_GPIO_WritePin(GPIOB, GPIO_SHT_PWR_EN_Pin, GPIO_PIN_SET); + osDelay(1); + MX_I2C1_Init(); + TMP117_Init();//TMP117是同一个电源,重新上电需要初始化 + SHT45_ERR_NUM = 0; + } + } + //置错误标志位 + g_error_log.temp_error_SHT30 = 1; + } + else + { + //恢复错误标志位 + g_error_log.temp_error_SHT30 = 0; + } + //采集TMP117并判错 + if(TMP117_Get_Temp(&g_stMcs_Para.temperature) != HAL_OK) { //置错误标志位 g_error_log.temp_error_TMP117 = 1; @@ -1095,36 +1128,6 @@ static void getTempHumiPress(void) //恢复错误标志位 g_error_log.temp_error_TMP117 = 0; } -#endif /*TEMP_SENSOR == TMP117_SENSOR*/ - - // SHT30出问题 - if(sht30_ret == FALSE) - { - //置错误标志位 - g_error_log.temp_error_SHT30 = 1; - //错误处理 -#if TEMP_SENSOR == SHT30_SENSOR - g_stMcs_Para.temperature = backupTemperature1; -#endif /*TEMP_SENSOR == SHT30_SENSOR*/ - } - else - { - //恢复错误标志位 - g_error_log.temp_error_SHT30 = 0; - } - - //HP203B出问题 - if(hp203_ret == FALSE) - { - //置错误标志位 - g_error_log.temp_error_HP203B = 1; - //错误处理 - } - else - { - //恢复错误标志位 - g_error_log.temp_error_HP203B = 0; - } } void tem_hum_update_task(void const * argument) @@ -1133,9 +1136,11 @@ void tem_hum_update_task(void const * argument) uint16_t time_s_temp_humi = 0;//1秒计时,温湿度更新 // 开机先采集一次大气压温湿度 + MS56XX_Init(); if(tem_hun_check_flag) { //采集温湿度与大气压 +// osDelay(10);//等待传感器初始化 getTempHumiPress(); } diff --git a/App/Src/frt_protocol.c b/App/Src/frt_protocol.c index bd1ac7c..f7aefd8 100644 --- a/App/Src/frt_protocol.c +++ b/App/Src/frt_protocol.c @@ -57,6 +57,7 @@ static u_int16_t FRT_ReadRegRSSIRange(void *pMsg); static u_int16_t FRT_ReadRegCoefficient(void *pMsg); static u_int16_t FRT_ReadRegDISTANCE_NS(void *pMsg); static u_int16_t FRT_ReadRegDISTANCE_WE(void *pMsg); +static u_int16_t FRT_ReadRegANEMOMETER_Delay(void *pMsg); static u_int16_t FRT_ReadRegErrorData(void *pMsg); static u_int16_t FRT_ReadRegWindC_NS(void *pMsg); static u_int16_t FRT_ReadRegWindC_WE(void *pMsg); @@ -88,6 +89,7 @@ static u_int16_t FRT_WriteRegRSSIRange(void *pMsg); static u_int16_t FRT_WriteRegCoefficient(void *pMsg); static u_int16_t FRT_WriteRegDISTANCE_NS(void *pMsg); static u_int16_t FRT_WriteRegDISTANCE_WE(void *pMsg); +static u_int16_t FRT_WriteRegANEMOMETER_Delay(void *pMsg); static u_int16_t FRT_WriteRegPoint_1Y(void *pMsg); static u_int16_t FRT_WriteRegPoint_2Y(void *pMsg); static u_int16_t FRT_WriteRegPoint_3Y(void *pMsg); @@ -143,6 +145,7 @@ FRT_RegProcTable_s g_RegTbl[] = { FRT_REGISTER_COEFFICIENT, FRT_ReadRegCoefficient }, /* 读粘度修正系数 */ { FRT_REGISTER_DISTANCE_NS, FRT_ReadRegDISTANCE_NS }, /* 读南北探头表面有效距离 */ { FRT_REGISTER_DISTANCE_WE, FRT_ReadRegDISTANCE_WE }, /* 读东西探头表面有效距离 */ + { FRT_REGISTER_ANEMOMETER_DELAY, FRT_ReadRegANEMOMETER_Delay }, /* 读换能器匹配层延时 */ { FRT_REGISTER_ERROR_LOG, FRT_ReadRegErrorData }, /* 读错误日志 */ { FRT_REGISTER_WIND_C_NS, FRT_ReadRegWindC_NS }, /* 读计算得到的南北风速 */ { FRT_REGISTER_WIND_C_WE, FRT_ReadRegWindC_WE }, /* 读计算得到的东西风速 */ @@ -185,6 +188,7 @@ FRT_RegProcTable_s g_Write_RegTbl[] = { FRT_REGISTER_COEFFICIENT, FRT_WriteRegCoefficient }, /* 写粘度修正系数 */ { FRT_REGISTER_DISTANCE_NS, FRT_WriteRegDISTANCE_NS }, /* 写南北探头表面有效距离 */ { FRT_REGISTER_DISTANCE_WE, FRT_WriteRegDISTANCE_WE }, /* 写东西探头表面有效距离 */ + { FRT_REGISTER_ANEMOMETER_DELAY, FRT_WriteRegANEMOMETER_Delay }, /* 写换能器匹配层延时 */ { FRT_REGISTER_LINEAR_POINT_Y_1, FRT_WriteRegPoint_1Y }, /* 线性插值校准点1 */ { FRT_REGISTER_LINEAR_POINT_Y_2, FRT_WriteRegPoint_2Y }, /* 线性插值校准点2 */ { FRT_REGISTER_LINEAR_POINT_Y_3, FRT_WriteRegPoint_3Y }, /* 线性插值校准点3 */ @@ -736,6 +740,18 @@ static u_int16_t FRT_ReadRegDISTANCE_WE(void *pMsg) return FRT_swap_endian_16(value); } +/** + * @brief 读换能器匹配延时 + * @param + * @retval + */ +static u_int16_t FRT_ReadRegANEMOMETER_Delay(void *pMsg) +{ + read_config_info(); + u_int16_t value=g_stConfigInfo.anemometerDelayTime; + return FRT_swap_endian_16(value); +} + /** * @brief 读错误日志 * @param @@ -1098,6 +1114,22 @@ static u_int16_t FRT_WriteRegDISTANCE_WE(void *pMsg) return 0; } +/** + * @brief 写换能器匹配延时 + * @param + * @retval + */ +static u_int16_t FRT_WriteRegANEMOMETER_Delay(void *pMsg) +{ + uint16_t *pMsgAddr = (uint16_t *)pMsg; + uint16_t data = *pMsgAddr; + + g_stConfigInfo.anemometerDelayTime = data; + save_factory_config_info(g_stConfigInfo); + + return 0; +} + /** * @brief 写线性插值矫正点1 * @param @@ -1422,8 +1454,8 @@ void FRT_MsgProc_WriteRegister(device_handle device, void *pMsg) // 校验 if (start_reg_addr < FRT_REGISTER_DEVICE_ADDR ||\ (start_reg_addr > FRT_REGISTER_REST_DEFAULT_SETTING && start_reg_addr < FRT_REGISTER_TRANSDUCER_CFG_1R5) ||\ - (start_reg_addr > FRT_REGISTER_DISTANCE_WE && start_reg_addr < FRT_REGISTER_LINEAR_POINT_Y_1) ||\ - (start_reg_addr > FRT_REGISTER_LINEAR_ENABLE) && (start_reg_addr < FRT_REGISTER_ENCRYPT_1) ||\ + (start_reg_addr > FRT_REGISTER_ANEMOMETER_DELAY && start_reg_addr < FRT_REGISTER_LINEAR_POINT_Y_1) ||\ + (start_reg_addr > FRT_REGISTER_LINEAR_ENABLE) && (start_reg_addr < FRT_REGISTER_ENCRYPT_1) ||\ (start_reg_addr > FRT_REGISTER_ENCRYPT_4) ) { @@ -1433,8 +1465,8 @@ void FRT_MsgProc_WriteRegister(device_handle device, void *pMsg) if (reg_num < 0x01 ||\ ((reg_num + start_reg_addr - 1) < FRT_REGISTER_DEVICE_ADDR) ||\ (((reg_num + start_reg_addr -1) > FRT_REGISTER_REST_DEFAULT_SETTING) && ((reg_num + start_reg_addr -1) < FRT_REGISTER_TRANSDUCER_CFG_1R5)) ||\ - (((reg_num + start_reg_addr -1) > FRT_REGISTER_DISTANCE_WE) && ((reg_num + start_reg_addr -1) < FRT_REGISTER_LINEAR_POINT_Y_1)) ||\ - (((reg_num + start_reg_addr -1) > FRT_REGISTER_LINEAR_ENABLE) && ((reg_num + start_reg_addr -1) < FRT_REGISTER_ENCRYPT_1)) ||\ + (((reg_num + start_reg_addr -1) > FRT_REGISTER_ANEMOMETER_DELAY) && ((reg_num + start_reg_addr -1) < FRT_REGISTER_LINEAR_POINT_Y_1)) ||\ + (((reg_num + start_reg_addr -1) > FRT_REGISTER_LINEAR_ENABLE) && ((reg_num + start_reg_addr -1) < FRT_REGISTER_ENCRYPT_1)) ||\ ((reg_num + start_reg_addr -1) > FRT_REGISTER_ENCRYPT_4) ) { diff --git a/App/Src/inflash.c b/App/Src/inflash.c index 8638aa7..f87ee46 100644 --- a/App/Src/inflash.c +++ b/App/Src/inflash.c @@ -44,6 +44,7 @@ factory_config_info g_stConfigInfo={ .linear_enable = 0, /* Բֵʹ */ .encrypt_0 = 0, /* */ .encrypt_1 = 0, /* */ + .anemometerDelayTime = 2, /* ƥʱus *//*32*/ .flag_end = FLAG_SAVE_INFLASH_END, }; diff --git a/Core/Src/freertos.c b/Core/Src/freertos.c index 5f7b1c3..b28b8c9 100644 --- a/Core/Src/freertos.c +++ b/Core/Src/freertos.c @@ -128,7 +128,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); @@ -151,7 +151,7 @@ void MX_FREERTOS_Init(void) { void StartDefaultTask(void const * argument) { /* USER CODE BEGIN StartDefaultTask */ - + osDelay(2000); /* Infinite loop */ for(;;) { diff --git a/Core/Src/main.c b/Core/Src/main.c index ef0f807..5db8691 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 */ @@ -127,7 +128,7 @@ void Flash_EnableReadProtection(void) /* USER CODE BEGIN 1 */ ///Զʱ - ///Flash_EnableReadProtection();// +// Flash_EnableReadProtection();// /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ diff --git a/Drivers/MS5607/ms5607.c b/Drivers/MS5607/ms5607.c new file mode 100644 index 0000000..fb90034 --- /dev/null +++ b/Drivers/MS5607/ms5607.c @@ -0,0 +1,236 @@ +#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); + osDelay(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]; + *(VAL_C + i) <<= 8; + *(VAL_C + i) += temp_buff[1]; + _cmd[0] += 0x02; + } +} + +static uint16_t MS56XX_C_Value[8] = {0}; +void MS56XX_Init(void) +{ + MS56XX_Reset(); + MS56XX_Read_PromData(MS56XX_C_Value); +} + +static HAL_StatusTypeDef MS56XX_ReadD1_Press(uint32_t *D1_Value) +{ + uint8_t D1_Value_Buff[3] = {0xFF, 0xFF, 0xFF}; + uint8_t _cmd[] = {0x48}; + uint8_t _addr[] = {0x00}; + if(HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff) != HAL_OK) + { + return HAL_ERROR; + } + osDelay(10); + if(HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _addr, 1, 0xff) != HAL_OK) + { + return HAL_ERROR; + } + if(HAL_I2C_Master_Receive(&hi2c3, MS5607_ADDRESS, D1_Value_Buff, 3, 0xff) != HAL_OK) + { + return HAL_ERROR; + } + + uint32_t press; + press = D1_Value_Buff[0]; + press <<= 8; + press += D1_Value_Buff[1]; + press <<= 8; + press += D1_Value_Buff[2]; + *D1_Value = press; + return HAL_OK; +} + +static HAL_StatusTypeDef MS56XX_ReadD2_Temp(uint32_t *D2_Value_) +{ + uint8_t D2_Value_Buff[3] = {0x00, 0x00, 0x00}; + uint8_t _cmd[] = {0x58}; + uint8_t _addr[] = {0x00}; + if(HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff) != HAL_OK) + { + return HAL_ERROR; + } + osDelay(10); + if(HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _addr, 1, 0xff) != HAL_OK) + { + return HAL_ERROR; + } + if(HAL_I2C_Master_Receive(&hi2c3, MS5607_ADDRESS, D2_Value_Buff, 3, 0xff) != HAL_OK) + { + return HAL_ERROR; + } + + uint32_t Temp; + Temp = D2_Value_Buff[0]; + Temp <<= 8; + Temp += D2_Value_Buff[1]; + Temp <<= 8; + Temp += D2_Value_Buff[2]; + *D2_Value_ = Temp; + return HAL_OK; +} + +static HAL_StatusTypeDef MS56XX_GetTemperature (int32_t *dT, int32_t *MS56XX_Temp) //¶ +{ + uint32_t D2_Value; + if(MS56XX_ReadD2_Temp(&D2_Value) != HAL_OK) //ѭȡ D2 + { + return HAL_ERROR; + } +// term_printf("D2:%d\r\n", D2_Value); + + if(D2_Value > (MS56XX_C_Value[5] * 256)) + { + *dT = D2_Value - MS56XX_C_Value[5] * 256; //ʽ dT = D2 - TREF = D2 - C5 * 2^8 + }else + { + *dT = MS56XX_C_Value[5] * 256 - D2_Value; //ʽ dT = D2 - TREF = D2 - C5 * 2^8 + *dT *= -1; + } + +// 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 + return HAL_OK; +} + +static HAL_StatusTypeDef MS56XX_GetPressureTemp(float *Temp, float *Press) //¶Ȳѹ +{ + int32_t dT; + int32_t MS56XX_Temperature; + uint32_t D1_Value; + if(MS56XX_ReadD1_Press(&D1_Value) != HAL_OK) //ѭȡ D1 + { + return HAL_ERROR; + } + + if(MS56XX_GetTemperature(&dT, &MS56XX_Temperature) != HAL_OK)//ȡdTTemp + { + return HAL_ERROR; + } +// term_printf("TEMP:%d\r\n", MS56XX_Temperature); + +// 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 + +// 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) / 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)); + } + } + +// term_printf("T2:%d\r\n", T2); + MS56XX_Temperature = MS56XX_Temperature - T2; + OFF = OFF - OFF2; + SENS = SENS - SENS2; + + + int32_t Tmp_Pressure = ((int32_t)D1_Value * SENS/2097152 - OFF) / 32768; //ʽ P = D1 * SENS - OFF = (D1 * SENS / 2^21 - OFF) / 2^15 + +// 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) + { + MS56XX_Temperature=-6000; + return HAL_ERROR; + } + if(MS56XX_Temperature>8500) + { + MS56XX_Temperature=8500; + return HAL_ERROR; + } + if(Tmp_Pressure<1000) + { +// Tmp_Pressure=1000; + *Press = 0; + return HAL_ERROR; + } + if(Tmp_Pressure>120000) + { +// Tmp_Pressure=120000; + *Press = 0; + return HAL_ERROR; + } + *Temp = ((float)MS56XX_Temperature)/100; + *Press = ((float)Tmp_Pressure)/100; + return HAL_OK; +} + +static float calculateAverage(float arr[], int avgLength) { + float sum = 0; + + // 飨10Ԫأռֱֵﵽָ + for (int i = 0; i < 10; ++i) { + sum += arr[i]; + } + + // ƽֵֵ + float average = sum / avgLength; + return average; +} + +#define COLLECT_DATA_NUM 10 +HAL_StatusTypeDef MS56XX_GetPressure(float *Press) +{ + float temp_buff; + float pressure_buff[COLLECT_DATA_NUM] = {0}; + uint8_t ret_falt = 0; + for(uint8_t i = 0;i= COLLECT_DATA_NUM) + { + return HAL_ERROR; + } + *Press = calculateAverage( pressure_buff,COLLECT_DATA_NUM - ret_falt); + return HAL_OK; +} \ No newline at end of file diff --git a/Drivers/MS5607/ms5607.h b/Drivers/MS5607/ms5607.h new file mode 100644 index 0000000..1da2607 --- /dev/null +++ b/Drivers/MS5607/ms5607.h @@ -0,0 +1,22 @@ +#ifndef __MS5607_H__ +#define __MS5607_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "comm_types.h" +#include "cmsis_os.h" + +#define MS5607_ADDRESS 0x77<<1 + +void MS56XX_Init(void); +HAL_StatusTypeDef MS56XX_GetPressure(float *Press); + +#ifdef __cplusplus +} +#endif +#endif /*__ __MS5607_H__ */ + diff --git a/Drivers/Sht3x/sht30.c b/Drivers/Sht3x/sht30.c index f33a8d8..ab746aa 100644 --- a/Drivers/Sht3x/sht30.c +++ b/Drivers/Sht3x/sht30.c @@ -33,7 +33,7 @@ static u_int8_t i2c_write_cmd(u_int8_t addr,u_int16_t cmd) cmd_buff[0] = cmd>>8; cmd_buff[1] = cmd; - u_int8_t ret = HAL_I2C_Master_Transmit(&hi2c1,addr,cmd_buff,2,0xffff); + u_int8_t ret = HAL_I2C_Master_Transmit(&hi2c1,addr,cmd_buff,2,0xff); return ret; } @@ -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; } @@ -101,7 +101,7 @@ u_int8_t sht30_collect_data(stTempHumiSensor stSensorDev, float *temp, float *hu i2c_write_cmd(stSensorDev.i2c_reg_addr,stSensorDev.cmd_read_data); - if(HAL_I2C_Master_Receive(&hi2c1,stSensorDev.i2c_reg_addr,read_buff,6,0xffff) != HAL_OK){ + if(HAL_I2C_Master_Receive(&hi2c1,stSensorDev.i2c_reg_addr,read_buff,6,0xff) != HAL_OK){ return HAL_ERROR; } @@ -119,73 +119,107 @@ u_int8_t sht30_collect_data(stTempHumiSensor stSensorDev, float *temp, float *hu } +/** + * @brief ʪݲɼ + * @param + * @retval + */ +u_int8_t sht45_collect_data(stTempHumiSensor stSensorDev, float *temp, float *humi) +{ + u_int8_t read_buff[6] = {0}; + uint8_t _cmd[] = {0xFD}; + + u_int16_t temp_value; + u_int16_t humi_value; + + HAL_I2C_Master_Transmit(&hi2c1,stSensorDev.i2c_reg_addr,_cmd,1,0xff); + osDelay(15); + + if(HAL_I2C_Master_Receive(&hi2c1,stSensorDev.i2c_reg_addr,read_buff,6,0xff) != HAL_OK){ + return HAL_ERROR; + } + + if(CheckCrc8(read_buff, 0xFF) != read_buff[2] && CheckCrc8(&read_buff[3], 0xFF) != read_buff[5]){ + return HAL_ERROR; + } + + temp_value = ((u_int16_t)read_buff[0]<<8)|read_buff[1]; + *temp = -45 + 175*((float)temp_value/65535); + + humi_value = ((u_int16_t)read_buff[3]<<8)|read_buff[4]; + *humi = -6 + 125*((float)humi_value / 65535); + + return HAL_OK; +} + +static float calculateAverage(float arr[], int avgLength) { + float sum = 0; + + // 飨10Ԫأռֱֵﵽָ + for (int i = 0; i < 10; ++i) { + sum += arr[i]; + } + + // ƽֵֵ + float average = sum / avgLength; + return average; +} /** * @brief ȡʪ * @param * @retval */ #define COLLECT_DATA_NUM 10 -BOOL get_temp_humi_data(float* temdata, float* humidata) -{ - U_DataType collect_temdata[COLLECT_DATA_NUM]={0x00}; - U_DataType collect_humidata[COLLECT_DATA_NUM]={0x00}; - U_DataType tmp_temdata,tmp_humidata; - +HAL_StatusTypeDef get_temp_humi_data(float* temdata, float* humidata) +{ + float collect_temdata[COLLECT_DATA_NUM] = {0}; + float collect_humidata[COLLECT_DATA_NUM] = {0}; + float tmp_temdata,tmp_humidata; + uint8_t ret_falt = 0; + for(int i=0; i= -40) && (tmp_temdata.fValue <= 85), return FALSE, "sht30¶ֵУʧ"); -// AssertError((tmp_humidata.fValue >= 0) && (tmp_humidata.fValue <= 100), return FALSE, "sht30ʪֵУʧ"); - if(tmp_temdata.fValue < -50) + if(ret_falt >= COLLECT_DATA_NUM) { -// tmp_temdata.fValue = -40; -// term_printf("sht30¶ֵУʧ"); -// return FALSE; - goto error_return; - } - if(tmp_temdata.fValue > 125) - { -// tmp_temdata.fValue = 125; -// term_printf("sht30¶ֵУʧ"); -// return FALSE; - goto error_return; - } - if(tmp_humidata.fValue < 0) - { -// tmp_humidata.fValue = 0; -// term_printf("sht30ʪֵУʧ"); -// return FALSE; - goto error_return; - } - if(tmp_humidata.fValue > 100) - { -// tmp_humidata.fValue = 100; -// term_printf("sht3ʪֵУʧ"); -// return FALSE; goto error_return; } - *temdata = tmp_temdata.fValue; - *humidata = tmp_humidata.fValue; + tmp_temdata = calculateAverage(collect_temdata,COLLECT_DATA_NUM - ret_falt); + tmp_humidata = calculateAverage(collect_humidata,COLLECT_DATA_NUM - ret_falt); - //g_stTempHumiData.temp = tmp_temdata.fValue; - //g_stTempHumiData.humi = tmp_humidata.fValue; - return TRUE; + if(tmp_temdata < -50.0) + { + tmp_temdata = -50.0; + } + if(tmp_temdata > 125.0) + { + tmp_temdata = 125.0; + } + if(tmp_humidata < 0.0) + { + tmp_humidata = 0.0; + } + if(tmp_humidata > 100.0) + { + tmp_humidata = 100.0; + } + + *temdata = tmp_temdata; + *humidata = tmp_humidata; + + return HAL_OK; error_return: *temdata = 0; *humidata = 0; - return FALSE; + return HAL_ERROR; } #if 0 diff --git a/Drivers/Sht3x/sht30.h b/Drivers/Sht3x/sht30.h index c5fc1cd..15e7990 100644 --- a/Drivers/Sht3x/sht30.h +++ b/Drivers/Sht3x/sht30.h @@ -2,6 +2,7 @@ #define __SHT30_H_ #include "comm_types.h" +#include "main.h" #define SHT30 "SHT30" @@ -21,6 +22,6 @@ typedef struct _stTempHumiData{ extern stTempHumiData g_stTempHumiData; u_int8_t sht30_init(); -BOOL get_temp_humi_data(float* temdata, float* humidata); +HAL_StatusTypeDef get_temp_humi_data(float* temdata, float* humidata); //void TEST_read_sht30_value(); #endif diff --git a/Drivers/Tmp117/tmp117.c b/Drivers/Tmp117/tmp117.c index d033ba0..03cd9c4 100644 --- a/Drivers/Tmp117/tmp117.c +++ b/Drivers/Tmp117/tmp117.c @@ -1,5 +1,6 @@ #include "tmp117.h" #include "i2c.h" +#include "cmsis_os.h" // ʼ¶ȴ @@ -17,28 +18,60 @@ HAL_StatusTypeDef TMP117_Read(uint8_t reg, uint8_t *buffer) { I2C_MEMADD_SIZE_8BIT, buffer, 2, 100); } +static float calculateAverage(float arr[], int avgLength) { + float sum = 0; + + // 飨10Ԫأռֱֵﵽָ + for (int i = 0; i < 10; ++i) { + sum += arr[i]; + } + + // ƽֵֵ + float average = sum / avgLength; + return average; +} // ȡ¶ֵλ棩 +#define COLLECT_DATA_NUM 10 HAL_StatusTypeDef TMP117_Get_Temp(float *temp) { uint8_t raw_data[2] = {0}; int16_t temp_raw; + uint8_t ret_falt = 0; + float ret_temp; + float temp_temp[COLLECT_DATA_NUM] = {0}; - if (HAL_OK == TMP117_Read(TMP117_TEMP_REG, raw_data)) { - temp_raw = (raw_data[0] << 8) | raw_data[1]; - *temp = temp_raw * 0.0078125f; + for(int i = 0; i= COLLECT_DATA_NUM) { *temp = 0; return HAL_ERROR; } - if(*temp <= -60) + + ret_temp = calculateAverage(temp_temp, COLLECT_DATA_NUM - ret_falt); + + if(ret_temp <= -60) { *temp = -60; - } - if(*temp >= 150) + }else if(ret_temp >= 150) { *temp = 150; + }else + { + *temp = ret_temp; } return HAL_OK; } diff --git a/EWARM/micro_climate.ewp b/EWARM/micro_climate.ewp index 826ffe5..9a99104 100644 --- a/EWARM/micro_climate.ewp +++ b/EWARM/micro_climate.ewp @@ -376,6 +376,7 @@ $PROJ_DIR$\..\Drivers\HP203B $PROJ_DIR$\..\Drivers\RainLight $PROJ_DIR$\..\Drivers\Tmp117 + $PROJ_DIR$\..\Drivers\MS5607