修改了瞬时极大极小风速风向的逻辑,添加了极大极小风向,解决了配置文件分区后不能写入Flash的BUG

This commit is contained in:
95384 2024-11-29 17:15:50 +08:00
parent 4bf74fa144
commit 32830c8436
5 changed files with 117 additions and 44 deletions

View File

@ -65,15 +65,11 @@ extern int16_t adc_val1[ADC_VAL_LEN];
typedef struct {
float speed_data[3]; // 存储数据点的数组
float direction_data[3]; // 存储数据点的数组
float ave_speed_data; // 存储数据点平均值
float ave_direction_data; // 存储数据点平均值
int index; // 指向队列头部的索引(实际上是最近添加的元素)
int count; // 当前队列中的元素数量
} SlidingWindow_3s;
typedef struct {
float speed_data[60]; // 存储数据点的数组
float direction_data[60]; // 存储数据点的数组
int index; // 指向队列头部的索引(实际上是最近添加的元素)
int count; // 当前队列中的元素数量
} SlidingWindow_1mim;
typedef struct {
float speed_data[600]; // 存储数据点的数组
float direction_data[600]; // 存储数据点的数组
@ -104,14 +100,20 @@ typedef struct __weather_param
float32_t humidity;
// 降雨量
float32_t precipitation;
// 算法出来的瞬时风速
float32_t instantaneous_wind_speed;
// 算法出来的瞬时风向
float32_t instantaneous_wind_direction;
} Weather_param;
extern Weather_param weather_info;
typedef struct _mcs_para{
float32_t min_wind_direction; /* 最小风向 */
float32_t trough_wind_direction; /* 极小风向 */
float32_t average_wind_direction; /* 平均风向 */
float32_t instantaneous_wind_direction; /* 瞬时风向 */
float32_t peak_wind_direction; /* 极大风向 */
float32_t max_wind_direction; /* 最大风向 */
float32_t min_wind_speed; /* 最小风速 */
float32_t trough_wind_speed; /* 极小风速 */

View File

@ -23,20 +23,22 @@ typedef enum
typedef enum
{
FRT_REGISTER_MIN_WIND_DIRECTION = 0, /* 最小风向 */
FRT_REGISTER_AVERAGE_WIND_DIRECTION = 1, /* 平均风向 */
FRT_REGISTER_INSTANTANEOUS_WIND_DIRECTION = 2, /* 瞬时风向 */
FRT_REGISTER_MAX_WIND_DIRECTION = 3, /* 最大风向 */
FRT_REGISTER_MIN_WIND_SPEED = 4, /* 最小风速 */
FRT_REGISTER_THROUGH_WIND_SPEED = 5, /* 极小风速 */
FRT_REGISTER_AVERAGE_WIND_SPEED = 6, /* 平均风速 */
FRT_REGISTER_INSTANTANEOUS_WIND_SPEED = 7, /* 瞬时风速 */
FRT_REGISTER_PEAK_WIND_SPEED = 8, /* 极大风速 */
FRT_REGISTER_MAX_WIND_SPEED = 9, /* 最大风速 */
FRT_REGISTER_TEMPERATURE = 10, /* 大气温度 */
FRT_REGISTER_HUMIDITY = 11, /* 大气湿度 */
FRT_REGISTER_PRESSURE = 12, /* 大气压 */
FRT_REGISTER_RAIN = 13, /* 雨量 */
FRT_REGISTER_PRECIPITATION_INTENSITY = 14, /* 总辐射 */
FRT_REGISTER_THROUGH_WIND_DIRECTION = 1, /* 极小风向 */
FRT_REGISTER_AVERAGE_WIND_DIRECTION = 2, /* 平均风向 */
FRT_REGISTER_INSTANTANEOUS_WIND_DIRECTION = 3, /* 瞬时风向 */
FRT_REGISTER_PEAK_WIND_DIRECTION = 4, /* 极大风向 */
FRT_REGISTER_MAX_WIND_DIRECTION = 5, /* 最大风向 */
FRT_REGISTER_MIN_WIND_SPEED = 6, /* 最小风速 */
FRT_REGISTER_THROUGH_WIND_SPEED = 7, /* 极小风速 */
FRT_REGISTER_AVERAGE_WIND_SPEED = 8, /* 平均风速 */
FRT_REGISTER_INSTANTANEOUS_WIND_SPEED = 9, /* 瞬时风速 */
FRT_REGISTER_PEAK_WIND_SPEED = 10, /* 极大风速 */
FRT_REGISTER_MAX_WIND_SPEED = 11, /* 最大风速 */
FRT_REGISTER_TEMPERATURE = 12, /* 大气温度 */
FRT_REGISTER_HUMIDITY = 13, /* 大气湿度 */
FRT_REGISTER_PRESSURE = 14, /* 大气压 */
FRT_REGISTER_RAIN = 15, /* 雨量 */
FRT_REGISTER_PRECIPITATION_INTENSITY = 16, /* 总辐射 */
FRT_REGISTER_DEVICE_ADDR = 20, /* 设备地址 */
FRT_REGISTER_COMMU_BAUDRATE = 21, /* 波特率 */

View File

@ -550,8 +550,8 @@ void wind_task(void const * argument)
/// term_printf("x:%.2f y:%.2f win_speed %.2f m/s angle %.2f \r\n",av_speedx,av_speedy,av_speed,av_angle);
}
//瞬时风速风向
g_stMcs_Para.instantaneous_wind_direction = av_angle;
g_stMcs_Para.instantaneous_wind_speed = av_speed;
weather_info.instantaneous_wind_direction = av_angle;
weather_info.instantaneous_wind_speed = av_speed;
///term_printf("win_speed %.2f \r\n",weather_info.wind_velocity);
//HAL_Delay(1);
//osDelay(3//
@ -715,7 +715,7 @@ void update_mcs_param(float new_wind_speed, float new_wind_dirction)
}
SlidingWindow_10min win_10min = {0};
SlidingWindow_3s win_3s = {0};
//求和函数
float sum(float arr[], int n)
{
@ -791,9 +791,52 @@ float linear_interpolation(float x) {
void my_update_mcs_param(float new_wind_speed, float new_wind_dirction)
{
// 十分钟滑动平均值
win_10min.speed_data[win_10min.index] = new_wind_speed; //添加新数据
win_10min.direction_data[win_10min.index] = new_wind_dirction;
/// 三秒滑动平均
win_3s.speed_data[win_3s.index] = new_wind_speed;
win_3s.direction_data[win_3s.index] = new_wind_dirction;
if(win_3s.count < 3)
{
win_3s.count++;
}
//计算三秒风速滑动平均值当作瞬时值
win_3s.ave_speed_data = sum(win_3s.speed_data, win_3s.count) / win_3s.count;
//计算三秒风向滑动平均值,风向滑动平均值需要过零算法
float temp_sin_sum_3s = 0;
float temp_cos_sum_3s = 0;
for(int i = 0; i < win_3s.count; i++)
{
temp_sin_sum_3s += sinf(win_3s.direction_data[i] * PI/180);
temp_cos_sum_3s += cosf(win_3s.direction_data[i] * PI/180);
}
win_3s.ave_direction_data = atanf(temp_sin_sum_3s / (temp_cos_sum_3s + 0.00001)) * 180/PI;
// 不同象限不一样
// 1象限真实角度=本身
// 2象限真实角度=+180
// 3象限真实角度=+180
// 4象限真实角度=+360
if((temp_sin_sum_3s > 0 && temp_cos_sum_3s < 0) || (temp_sin_sum_3s < 0 && temp_cos_sum_3s < 0))
{
win_3s.ave_direction_data += 180;
}else if (temp_sin_sum_3s < 0 && temp_cos_sum_3s > 0)
{
win_3s.ave_direction_data += 360;
}
g_stMcs_Para.instantaneous_wind_direction = win_3s.ave_direction_data;
/** 线性插值 **/
/** win_3s.ave_speed_data[win_3s.index]为风速 **/
/** win_3s.ave_direction_data[win_3s.index]为风向 **/
/** 风向不要插值 **/
/** 只用插值瞬时风速10min便会是插值后的值 **/
g_stMcs_Para.instantaneous_wind_speed = linear_interpolation(win_3s.ave_speed_data);
/** 线性插值 **/
// 更新索引
win_3s.index = (win_3s.index + 1) % 3;
/// 十分钟滑动平均值
win_10min.speed_data[win_10min.index] = g_stMcs_Para.instantaneous_wind_speed; //添加新数据
win_10min.direction_data[win_10min.index] = g_stMcs_Para.instantaneous_wind_direction;
if(win_10min.count < g_usrConfigInfo.speed_average_time /*AVE_TIME*/)
{
@ -825,20 +868,15 @@ void my_update_mcs_param(float new_wind_speed, float new_wind_dirction)
win_10min.ave_direction_data[win_10min.index] += 360;
}
/** 线性插值 **/
/** win_10min.ave_speed_data[win_10min.index]为风速 **/
/** win_10min.ave_direction_data[win_10min.index]为风向 **/
/** 风向不要插值 **/
win_10min.ave_speed_data[win_10min.index] = linear_interpolation(win_10min.ave_speed_data[win_10min.index]);
/** 线性插值 **/
//默认第一个数据为最大或者最小
float temp_min_direction = win_10min.ave_direction_data[0];
float temp_max_direction = win_10min.ave_direction_data[0];
float temp_min_speed = win_10min.ave_speed_data[0];
float temp_max_speed = win_10min.ave_speed_data[0];
float temp_trough_min_speed = win_10min.ave_speed_data[0];
float temp_peak_max_speed = win_10min.ave_speed_data[0];
float temp_trough_min_speed = win_10min.speed_data[0];
float temp_peak_max_speed = win_10min.speed_data[0];
float temp_trough_min_direction = win_10min.direction_data[0];
float temp_peak_max_direction = win_10min.direction_data[0];
//遍历10min内所有数据寻找最大最小极大极小
for (int i = 0; i < win_10min.count; i++) {
// 最大最小
@ -861,6 +899,12 @@ void my_update_mcs_param(float new_wind_speed, float new_wind_dirction)
else if (win_10min.speed_data[i] > temp_peak_max_speed) {
temp_peak_max_speed = win_10min.speed_data[i]; // 更新风速极大值
}
if (win_10min.direction_data[i] < temp_trough_min_direction) {
temp_trough_min_direction = win_10min.direction_data[i]; // 更新风向极小值
}
else if (win_10min.direction_data[i] > temp_peak_max_direction) {
temp_peak_max_direction = win_10min.direction_data[i]; // 更新风向极大值
}
}
// 更新最大最小极大极小风速风向
g_stMcs_Para.min_wind_direction = temp_min_direction;
@ -871,9 +915,11 @@ void my_update_mcs_param(float new_wind_speed, float new_wind_dirction)
g_stMcs_Para.average_wind_speed = win_10min.ave_speed_data[win_10min.index];
g_stMcs_Para.max_wind_speed = temp_max_speed;
// 极大极小风速
// 极大极小风速与极大极小风向
g_stMcs_Para.trough_wind_speed = temp_trough_min_speed;
g_stMcs_Para.peak_wind_speed = temp_peak_max_speed;
g_stMcs_Para.trough_wind_direction = temp_trough_min_direction;
g_stMcs_Para.peak_wind_direction = temp_peak_max_direction;
win_10min.index = (win_10min.index + 1) % /*AVE_TIME*/g_usrConfigInfo.speed_average_time;//更新索引
}
@ -943,7 +989,7 @@ void tem_hum_update_task(void const * argument)
NVIC_SystemReset();
}
// 风速风向更新
my_update_mcs_param(g_stMcs_Para.instantaneous_wind_speed, g_stMcs_Para.instantaneous_wind_direction);
my_update_mcs_param(weather_info.instantaneous_wind_speed, weather_info.instantaneous_wind_direction);
}
}

View File

@ -16,8 +16,10 @@ static void FRT_MsgProc_WriteRegister(device_handle device, void *pMsg);
static u_int16_t FRT_ReadReg(unsigned char regId);
/* 读 */
static u_int16_t FRT_ReadRegMinWindDiretion(void *pMsg);
static u_int16_t FRT_ReadRegThroughWindDiretion(void *pMsg);
static u_int16_t FRT_ReadRegAverageWindDirection(void *pMsg);
static u_int16_t FRT_ReadRegInstantaneousWindDirection(void *pMsg);
static u_int16_t FRT_ReadRegPeakWindDiretion(void *pMsg);
static u_int16_t FRT_ReadRegMaxWindDirection(void *pMsg);
static u_int16_t FRT_ReadRegMinWindSpeed(void *pMsg);
static u_int16_t FRT_ReadRegThroughWindSpeed(void *pMsg);
@ -88,8 +90,10 @@ FRT_FuncionMsgProcTable_s g_MsgTbl[] =
FRT_RegProcTable_s g_RegTbl[] =
{
{ FRT_REGISTER_MIN_WIND_DIRECTION, FRT_ReadRegMinWindDiretion }, /* 最小风向 */
{ FRT_REGISTER_THROUGH_WIND_DIRECTION, FRT_ReadRegThroughWindDiretion }, /* 极小风向 */
{ FRT_REGISTER_AVERAGE_WIND_DIRECTION, FRT_ReadRegAverageWindDirection }, /* 平均风向 */
{ FRT_REGISTER_INSTANTANEOUS_WIND_DIRECTION, FRT_ReadRegInstantaneousWindDirection }, /* 瞬时风向 */
{ FRT_REGISTER_PEAK_WIND_DIRECTION, FRT_ReadRegPeakWindDiretion }, /* 极大风向 */
{ FRT_REGISTER_MAX_WIND_DIRECTION, FRT_ReadRegMaxWindDirection }, /* 最大风向 */
{ FRT_REGISTER_MIN_WIND_SPEED, FRT_ReadRegMinWindSpeed }, /* 最小风速 */
{ FRT_REGISTER_THROUGH_WIND_SPEED, FRT_ReadRegThroughWindSpeed }, /* 极小风速 */
@ -194,6 +198,17 @@ static u_int16_t FRT_ReadRegMinWindDiretion(void *pMsg)
return FRT_swap_endian_16(value);
}
/**
* @brief
* @param
* @retval
*/
static u_int16_t FRT_ReadRegThroughWindDiretion(void *pMsg)
{
u_int16_t value = (u_int16_t)(g_stMcs_Para.trough_wind_direction *10);
return FRT_swap_endian_16(value);
}
/**
* @brief
* @param
@ -216,6 +231,17 @@ static u_int16_t FRT_ReadRegInstantaneousWindDirection(void *pMsg)
return FRT_swap_endian_16(value);
}
/**
* @brief
* @param
* @retval
*/
static u_int16_t FRT_ReadRegPeakWindDiretion(void *pMsg)
{
u_int16_t value = (u_int16_t)(g_stMcs_Para.peak_wind_direction *10);
return FRT_swap_endian_16(value);
}
/**
* @brief
* @param

View File

@ -162,11 +162,8 @@ BOOL read_factory_config_info()
*/
BOOL read_config_info()
{
if(read_usr_config_info&&read_factory_config_info)
{
return TRUE;
}
return FALSE;
read_usr_config_info();
read_factory_config_info();
}
/**