From 66ac84aade2a7692f3662e74f9c0120130938a7d Mon Sep 17 00:00:00 2001 From: 95384 <664090429@qq.com> Date: Tue, 3 Dec 2024 18:01:00 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E7=B3=BB=E6=95=B0=E5=8A=A0?= =?UTF-8?q?=E5=85=A5=E5=8D=8F=E8=AE=AE=EF=BC=8C=E5=8D=97=E5=8C=97=E4=B8=9C?= =?UTF-8?q?=E8=A5=BF=E8=B7=9D=E7=A6=BB=E4=B8=8E=E5=A3=B0=E9=80=9F=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E8=BF=9B=E5=8D=8F=E8=AE=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App/Inc/anemometer_dev.h | 6 +- App/Inc/frt_protocol.h | 31 ++++++----- App/Inc/inflash.h | 4 +- App/Src/anemometer_dev.c | 14 ++--- App/Src/frt_protocol.c | 115 ++++++++++++++++++++++++++++++++------- App/Src/inflash.c | 4 +- 6 files changed, 130 insertions(+), 44 deletions(-) diff --git a/App/Inc/anemometer_dev.h b/App/Inc/anemometer_dev.h index c09a808..0b5240e 100644 --- a/App/Inc/anemometer_dev.h +++ b/App/Inc/anemometer_dev.h @@ -96,8 +96,10 @@ typedef struct __weather_param //float32_t wind_velocity_y_offset; // 风速 float32_t wind_velocity; - // 超声波传播速度 - float32_t wind_c; + // 超声波传播速度南北 + float32_t wind_c_NS; + // 超声波传播速度东西 + float32_t wind_c_WE; // 风向 float32_t wind_angle; // 温度 diff --git a/App/Inc/frt_protocol.h b/App/Inc/frt_protocol.h index 5bd7905..04b3f26 100644 --- a/App/Inc/frt_protocol.h +++ b/App/Inc/frt_protocol.h @@ -54,20 +54,23 @@ typedef enum FRT_REGISTER_TRANSDUCER_CFG_4R5 = 31, /* */ FRT_REGISTER_TRANSDUCER_CFG_8R0 = 32, /* */ FRT_REGISTER_RSSI_RANGE = 33, /* RSSIЧΧ */ - FRT_REGISTER_DISTANCE = 34, /* */ - FRT_REGISTER_ERROR_LOG = 35, /* ־ */ - FRT_REGISTER_WIND_C = 36, /* õķ */ - FRT_REGISTER_LINEAR_POINT_X_1 = 37, /* Բֵԭʼ1 */ - FRT_REGISTER_LINEAR_POINT_X_2 = 38, /* Բֵԭʼ2 */ - FRT_REGISTER_LINEAR_POINT_X_3 = 39, /* Բֵԭʼ3 */ - FRT_REGISTER_LINEAR_POINT_X_4 = 40, /* Բֵԭʼ4 */ - FRT_REGISTER_LINEAR_POINT_X_5 = 41, /* Բֵԭʼ5 */ - FRT_REGISTER_LINEAR_POINT_Y_1 = 42, /* ԲֵУ׼1 */ - FRT_REGISTER_LINEAR_POINT_Y_2 = 43, /* ԲֵУ׼2 */ - FRT_REGISTER_LINEAR_POINT_Y_3 = 44, /* ԲֵУ׼3 */ - FRT_REGISTER_LINEAR_POINT_Y_4 = 45, /* ԲֵУ׼4 */ - FRT_REGISTER_LINEAR_POINT_Y_5 = 46, /* ԲֵУ׼5 */ - FRT_REGISTER_LINEAR_ENABLE = 47, /* Բֵʹ */ + 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_MsgRegister; #pragma pack(push,1) diff --git a/App/Inc/inflash.h b/App/Inc/inflash.h index 7af0d2c..d4a182c 100644 --- a/App/Inc/inflash.h +++ b/App/Inc/inflash.h @@ -40,8 +40,10 @@ typedef struct _factory_config_info{ u_int16_t transducer_cfg_1R5; /* 换能器参数 */ u_int16_t transducer_cfg_4R5; /* 换能器参数 */ u_int16_t transducer_cfg_8R0; /* 换能器参数 */ + u_int16_t Coefficient; /* 粘度修正系数 */ u_int16_t RSSI_range; /* RSSI有效范围 */ - u_int16_t transducer_distace; /* 换能器表面距离 */ + u_int16_t transducer_distace_NS; /* 南北换能器表面距离 */ + u_int16_t transducer_distace_WE; /* 东西换能器表面距离 */ u_int16_t linear_point_1_x; /* 线性插值点1X */ u_int16_t linear_point_1_y; /* 线性插值点1Y */ u_int16_t linear_point_2_x; /* 线性插值点2X */ diff --git a/App/Src/anemometer_dev.c b/App/Src/anemometer_dev.c index 208fcab..c2c1791 100644 --- a/App/Src/anemometer_dev.c +++ b/App/Src/anemometer_dev.c @@ -418,7 +418,7 @@ void wind_task(void const * argument) { g_error_log.tof_error_NS = 1; - weather_info.wind_c = 0; + weather_info.wind_c_NS = 0; weather_info.wind_velocity_x = 0; } else @@ -439,10 +439,10 @@ void wind_task(void const * argument) // 通过各通道渡越时间求时间差 dtof = tofx-tofy; - weather_info.wind_c = (g_stConfigInfo.transducer_distace * 2.0f)/2.0f*(1.0f/tofx+1.0f/tofy); + weather_info.wind_c_NS = (g_stConfigInfo.transducer_distace_NS * 2.0f)/2.0f*(1.0f/tofx+1.0f/tofy); // weather_info.wind_velocity_x = 0-DISTANCE*dtof/1.41422f/tofx/tofx; // 修正公式 - weather_info.wind_velocity_x = 0-(g_stConfigInfo.transducer_distace * 2.0f)*dtof/TWO_COS45/tofx/tofy; + weather_info.wind_velocity_x = 0-(g_stConfigInfo.transducer_distace_NS * 2.0f)*dtof/TWO_COS45/tofx/tofy; } // 通道3 通道4 测试东西风速 @@ -476,7 +476,7 @@ void wind_task(void const * argument) { g_error_log.tof_error_WE = 1; - weather_info.wind_c = 0; + weather_info.wind_c_WE = 0; weather_info.wind_velocity_y = 0; } else @@ -499,10 +499,10 @@ void wind_task(void const * argument) // 通过各通道渡越时间求时间差 dtof = tofx-tofy; - weather_info.wind_c = (g_stConfigInfo.transducer_distace * 2.0f)/2.0f*(1.0f/tofx+1.0f/tofy); + weather_info.wind_c_WE = (g_stConfigInfo.transducer_distace_WE * 2.0f)/2.0f*(1.0f/tofx+1.0f/tofy); // weather_info.wind_velocity_y = DISTANCE*dtof/1.41422f/tofx/tofx; // 修正公式 - weather_info.wind_velocity_y = (g_stConfigInfo.transducer_distace * 2.0f)*dtof/TWO_COS45/tofx/tofy; + weather_info.wind_velocity_y = (g_stConfigInfo.transducer_distace_WE * 2.0f)*dtof/TWO_COS45/tofx/tofy; } weather_info.wind_velocity = sqrtf(weather_info.wind_velocity_x*weather_info.wind_velocity_x + weather_info.wind_velocity_y*weather_info.wind_velocity_y); @@ -543,7 +543,7 @@ void wind_task(void const * argument) av_angle = 360-av_angle; //针对粘度进行校准 - av_speed = av_speed * 1.1201f; + av_speed = av_speed * ((float)g_stConfigInfo.Coefficient/10000.0); // 速度太小视为0风速 if(fabs(av_speed)<0.1) diff --git a/App/Src/frt_protocol.c b/App/Src/frt_protocol.c index 953dabd..7407694 100644 --- a/App/Src/frt_protocol.c +++ b/App/Src/frt_protocol.c @@ -50,9 +50,12 @@ static u_int16_t FRT_ReadRegTransducerCFG1R5(void *pMsg); static u_int16_t FRT_ReadRegTransducerCFG4R5(void *pMsg); static u_int16_t FRT_ReadRegTransducerCFG8R0(void *pMsg); static u_int16_t FRT_ReadRegRSSIRange(void *pMsg); -static u_int16_t FRT_ReadRegDISTANCE(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_ReadRegErrorData(void *pMsg); -static u_int16_t FRT_ReadRegWindC(void *pMsg); +static u_int16_t FRT_ReadRegWindC_NS(void *pMsg); +static u_int16_t FRT_ReadRegWindC_WE(void *pMsg); static u_int16_t FRT_ReadRegPoint_1X(void *pMsg); static u_int16_t FRT_ReadRegPoint_2X(void *pMsg); static u_int16_t FRT_ReadRegPoint_3X(void *pMsg); @@ -69,7 +72,9 @@ static u_int16_t FRT_WriteRegTransducerCFG1R5(void *pMsg); static u_int16_t FRT_WriteRegTransducerCFG4R5(void *pMsg); static u_int16_t FRT_WriteRegTransducerCFG8R0(void *pMsg); static u_int16_t FRT_WriteRegRSSIRange(void *pMsg); -static u_int16_t FRT_WriteRegDISTANCE(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_WriteRegPoint_1Y(void *pMsg); static u_int16_t FRT_WriteRegPoint_2Y(void *pMsg); static u_int16_t FRT_WriteRegPoint_3Y(void *pMsg); @@ -114,10 +119,13 @@ FRT_RegProcTable_s g_RegTbl[] = { FRT_REGISTER_TRANSDUCER_CFG_1R5, FRT_ReadRegTransducerCFG1R5 }, /* 读换能器参数寄存器值1R5 */ { FRT_REGISTER_TRANSDUCER_CFG_4R5, FRT_ReadRegTransducerCFG4R5 }, /* 读换能器参数寄存器值4R5 */ { FRT_REGISTER_TRANSDUCER_CFG_8R0, FRT_ReadRegTransducerCFG8R0 }, /* 读换能器参数寄存器值8R0 */ - { FRT_REGISTER_RSSI_RANGE, FRT_ReadRegRSSIRange }, /* 读RSSI有效范围 */ - { FRT_REGISTER_DISTANCE, FRT_ReadRegDISTANCE }, /* 读探头表面有效距离 */ + { FRT_REGISTER_RSSI_RANGE, FRT_ReadRegRSSIRange }, /* 读RSSI有效范围 */ + { FRT_REGISTER_COEFFICIENT, FRT_ReadRegCoefficient }, /* 读粘度修正系数 */ + { FRT_REGISTER_DISTANCE_NS, FRT_ReadRegDISTANCE_NS }, /* 读南北探头表面有效距离 */ + { FRT_REGISTER_DISTANCE_WE, FRT_ReadRegDISTANCE_WE }, /* 读东西探头表面有效距离 */ { FRT_REGISTER_ERROR_LOG, FRT_ReadRegErrorData }, /* 读错误日志 */ - { FRT_REGISTER_WIND_C, FRT_ReadRegWindC }, /* 读计算得到的风速 */ + { FRT_REGISTER_WIND_C_NS, FRT_ReadRegWindC_NS }, /* 读计算得到的南北风速 */ + { FRT_REGISTER_WIND_C_WE, FRT_ReadRegWindC_WE }, /* 读计算得到的东西风速 */ { FRT_REGISTER_LINEAR_POINT_X_1, FRT_ReadRegPoint_1X }, /* 线性插值原始点1 */ { FRT_REGISTER_LINEAR_POINT_X_2, FRT_ReadRegPoint_2X }, /* 线性插值原始点2 */ { FRT_REGISTER_LINEAR_POINT_X_3, FRT_ReadRegPoint_3X }, /* 线性插值原始点3 */ @@ -144,7 +152,9 @@ FRT_RegProcTable_s g_Write_RegTbl[] = { FRT_REGISTER_TRANSDUCER_CFG_4R5, FRT_WriteRegTransducerCFG4R5 }, /* 写换能器参数寄存器值4R5 */ { FRT_REGISTER_TRANSDUCER_CFG_8R0, FRT_WriteRegTransducerCFG8R0 }, /* 写换能器参数寄存器值8R0 */ { FRT_REGISTER_RSSI_RANGE, FRT_WriteRegRSSIRange }, /* 写RSSI有效范围 */ - { FRT_REGISTER_DISTANCE, FRT_WriteRegDISTANCE }, /* 写探头表面有效距离 */ + { FRT_REGISTER_COEFFICIENT, FRT_WriteRegCoefficient }, /* 写粘度修正系数 */ + { FRT_REGISTER_DISTANCE_NS, FRT_WriteRegDISTANCE_NS }, /* 写南北探头表面有效距离 */ + { FRT_REGISTER_DISTANCE_WE, FRT_WriteRegDISTANCE_WE }, /* 写东西探头表面有效距离 */ { 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 */ @@ -587,14 +597,38 @@ static u_int16_t FRT_ReadRegRSSIRange(void *pMsg) } /** - * @brief 读换能器探头距离 + * @brief 读粘度修正系数 * @param * @retval */ -static u_int16_t FRT_ReadRegDISTANCE(void *pMsg) +static u_int16_t FRT_ReadRegCoefficient(void *pMsg) { - read_config_info(); - u_int16_t value=g_stConfigInfo.transducer_distace; + read_config_info(); + u_int16_t value=g_stConfigInfo.Coefficient; + return FRT_swap_endian_16(value); +} + +/** + * @brief 读南北换能器探头距离 + * @param + * @retval + */ +static u_int16_t FRT_ReadRegDISTANCE_NS(void *pMsg) +{ + read_config_info(); + u_int16_t value=g_stConfigInfo.transducer_distace_NS; + return FRT_swap_endian_16(value); +} + +/** + * @brief 读东西换能器探头距离 + * @param + * @retval + */ +static u_int16_t FRT_ReadRegDISTANCE_WE(void *pMsg) +{ + read_config_info(); + u_int16_t value=g_stConfigInfo.transducer_distace_WE; return FRT_swap_endian_16(value); } @@ -610,13 +644,24 @@ static u_int16_t FRT_ReadRegErrorData(void *pMsg) } /** - * @brief 读当前声速 + * @brief 读当前南北声速 * @param * @retval */ -static u_int16_t FRT_ReadRegWindC(void *pMsg) +static u_int16_t FRT_ReadRegWindC_NS(void *pMsg) { - u_int16_t value=(u_int16_t)(weather_info.wind_c *10); + u_int16_t value=(u_int16_t)(weather_info.wind_c_NS *10); + return FRT_swap_endian_16(value); +} + +/** + * @brief 读当前东西声速 + * @param + * @retval + */ +static u_int16_t FRT_ReadRegWindC_WE(void *pMsg) +{ + u_int16_t value=(u_int16_t)(weather_info.wind_c_WE *10); return FRT_swap_endian_16(value); } @@ -817,16 +862,48 @@ static u_int16_t FRT_WriteRegRSSIRange(void *pMsg) } /** - * @brief 写换能器探头距离 + * @brief 写粘度修正系数 * @param * @retval */ -static u_int16_t FRT_WriteRegDISTANCE(void *pMsg) +static u_int16_t FRT_WriteRegCoefficient(void *pMsg) { uint16_t *pMsgAddr = (uint16_t *)pMsg; uint16_t data = *pMsgAddr; - g_stConfigInfo.transducer_distace = data; + g_stConfigInfo.Coefficient = data; + save_factory_config_info(g_stConfigInfo); + + return 0; +} + +/** + * @brief 写南北换能器探头距离 + * @param + * @retval + */ +static u_int16_t FRT_WriteRegDISTANCE_NS(void *pMsg) +{ + uint16_t *pMsgAddr = (uint16_t *)pMsg; + uint16_t data = *pMsgAddr; + + g_stConfigInfo.transducer_distace_NS = data; + save_factory_config_info(g_stConfigInfo); + + return 0; +} + +/** + * @brief 写东西换能器探头距离 + * @param + * @retval + */ +static u_int16_t FRT_WriteRegDISTANCE_WE(void *pMsg) +{ + uint16_t *pMsgAddr = (uint16_t *)pMsg; + uint16_t data = *pMsgAddr; + + g_stConfigInfo.transducer_distace_WE = data; save_factory_config_info(g_stConfigInfo); return 0; @@ -1092,7 +1169,7 @@ 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 && start_reg_addr < FRT_REGISTER_LINEAR_POINT_Y_1) ||\ + (start_reg_addr > FRT_REGISTER_DISTANCE_WE && start_reg_addr < FRT_REGISTER_LINEAR_POINT_Y_1) ||\ (start_reg_addr > FRT_REGISTER_LINEAR_ENABLE) \ ) { @@ -1102,7 +1179,7 @@ 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) && ((reg_num + start_reg_addr -1) < FRT_REGISTER_LINEAR_POINT_Y_1)) ||\ + (((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) \ ) { diff --git a/App/Src/inflash.c b/App/Src/inflash.c index 2f7736d..26d7be4 100644 --- a/App/Src/inflash.c +++ b/App/Src/inflash.c @@ -26,7 +26,9 @@ factory_config_info g_stConfigInfo={ .transducer_cfg_4R5 = 35, /* */ .transducer_cfg_8R0 = 65, /* */ .RSSI_range = 20, /* RSSI0.2Ч */ - .transducer_distace = 57560, /* ̽ͷ */ + .Coefficient = 11201, /* ճϵ */ + .transducer_distace_NS = 57560, /* ̽ͷ */ + .transducer_distace_WE = 57560, /* ̽ͷ */ .linear_point_1_x = 0, /* Բֵ1 */ .linear_point_1_y = 0, /* Բֵ1 */