E015.D.011-FXLS90230/Drivers/BSP/DataProcess.c

324 lines
11 KiB
C
Raw Permalink Normal View History

2025-04-24 11:37:10 +08:00
#include "DataProcess.h"
GetDataValue MeasurementData_Nearbit; //<2F><><EFBFBD>˲<EFBFBD><CBB2><EFBFBD>ֵ
GetDataValue MeasurementData_Farbit; //Զ<>˲<EFBFBD><CBB2><EFBFBD>ֵ
//<2F><><EFBFBD><EFBFBD>Ȩ<EFBFBD>ط<EFBFBD>Χ
void get_weights_scores_range(GetFeatureValue* feature)
{
// <20><><EFBFBD><EFBFBD> weights_normal
float weights_normal[ROWS][COLS_NORMAL] = {
{0.02536112373147522f,0.05512614321141711f,0.14267535646902674f,0.16133346206755558f,0.10950333816620461f},
{0.022501814070676942f,0.04732276804576742f,0.04194724344174091f,0.02621574442760558f,0.047215370581991545f},
{0.018003586497350618f,0.0431656287153646f,0.07865669397927093f,0.017026200202278845f,0.003652478376425392f},
{0.32024982967117427f,0.035535672541306684f,0.031030858413814488f,0.24429833563710904f,0.09967948230006361f},
{0.029334689721561346f,0.02969550083218594f,0.09925900579103232f,0.029629006919347025f,0.4357667452203222f},
{0.05787595533854885f,0.01554478121686156f,0.028520717142108763f,0.07200373575215642f,0.0006793460069581621f},
{0.11164004553402096f,0.021488846081792058f,0.027015323736423267f,0.06835601650464118f,0.06507896606999451f},
{0.03512378851112017f,0.04353279811744198f,0.02353244436926462f,0.11985817699670917f,0.026400101174232783f},
{0.0679031765133709f,0.015229294191235638f,0.02114050815724666f,0.047639082979661976f,0.04478038713658755f},
{0.1406890147631353f,0.1880250839886159f,0.20847554840928026f,0.0810319935793325f,0.04348556994313417f},
{0.03156489452065363f,0.022497648211455456f,0.07162434867943443f,0.035050436098907636f,0.013979034047182124f},
{0.016102335088496025f,0.015524545028903453f,0.0472261768209504f,0.024201430458576385f,0.05320423374249968f},
{0.02532395637816995f,0.13180297364581464f,0.05950058091445133f,0.0459745429704959f,0.031178515883672587f},
{0.02299058880568741f,0.2719675224112871f,0.09280615745629113f,0.015702128841647265f,0.008980547313484886f},
{0.07533520085455829f,0.06354079376055055f,0.026589036219663745f,0.011679706563975762f,0.01641588403724634f}
2025-04-24 11:37:10 +08:00
};
// <20><><EFBFBD><EFBFBD> weights_abnormal
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD>
float std_scores_normal[COLS_NORMAL] = {4.426009220352611f,1.0100249366124394f,1.229524185950373f,2.5243247379778886f,1.8966734702247467f};
2025-04-24 11:37:10 +08:00
// <20><><EFBFBD>Χֵ
float range_values[COLS_NORMAL] = {0.14035106713875936f,0.07188706493959258f,0.34388788541653376f,0.6280178217431671f,0.30525313799525955f};
2025-04-24 11:37:10 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
float min_values[ROWS] = {
0.0f, // ѹ<><D1B9><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>Сֵ
0.0f, // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Сֵ
0.0f, // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Сֵ
0.0f, // <20><>ѹ<EFBFBD><D1B9>ֵ<EFBFBD><D6B5>Сֵ
0.0f, // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Сֵ
0.0f, // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Сֵ
0.0f, // Ť<>ؾ<EFBFBD>ֵ<EFBFBD><D6B5>Сֵ
0.0f, // Ť<>ط<EFBFBD><D8B7><EFBFBD><EFBFBD><EFBFBD>Сֵ
0.0f, // Ť<>ط<EFBFBD><D8B7><EFBFBD><EFBFBD><EFBFBD>Сֵ
0.0f, // ת<>پ<EFBFBD>ֵ<EFBFBD><D6B5>Сֵ
0.0f, // ת<>ٷ<EFBFBD><D9B7><EFBFBD><EFBFBD><EFBFBD>Сֵ
0.0f, // ת<>ٷ<EFBFBD><D9B7><EFBFBD><EFBFBD><EFBFBD>Сֵ
0.0f, // X<><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Сֵ
0.0f, // Y<><59><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Сֵ
0.0f // Z<><5A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Сֵ
2025-04-24 11:37:10 +08:00
};
float max_values[ROWS] = {
10.0f, // ѹ<><D1B9><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>ֵ
5.0f, // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
5.0f, // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
155.0f, // <20><>ѹ<EFBFBD><D1B9>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>ֵ
50.0f, // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
100.0f, // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
10.0f, // Ť<>ؾ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>ֵ
20.0f, // Ť<>ط<EFBFBD><D8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
100.0f, // Ť<>ط<EFBFBD><D8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
120.0f, // ת<>پ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>ֵ
30.0f, // ת<>ٷ<EFBFBD><D9B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
3150.0f, // ת<>ٷ<EFBFBD><D9B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
5.0f, // X<><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
5.0f, // Y<><59><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
5.0f // Z<><5A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
2025-04-24 11:37:10 +08:00
};
// <20><><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><E1B9B9>
for (int i = 0; i < ROWS; i++) {
feature->min_values[i] = min_values[i];
feature->max_values[i] = max_values[i];
for (int j = 0; j < COLS_NORMAL; j++) {
feature->weights_normal[i][j] = weights_normal[i][j];
}
}
for (int i = 0; i < COLS_NORMAL; i++) {
feature->std_scores_normal[i] = std_scores_normal[i];
feature->range_values[i] = range_values[i];
}
}
// <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void normalize_data(float* data, float* min_values, float* max_values, float* data_nor, int size)
{
for (int i = 0; i < size; i++) {
data_nor[i] = 1 + 9 * (data[i] - min_values[i]) / (max_values[i] - min_values[i]);
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD>˷<EFBFBD><CBB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> Ȩ<>ؾ<EFBFBD><D8BE><EFBFBD>
void matrix_multiply(float* data, float weights[ROWS][COLS_NORMAL], float* result, int rows, int cols)
{
for (int i = 0; i < cols; i++) {
result[i] = 0.0f;
for (int j = 0; j < rows; j++) {
result[i] += data[j] * weights[j][i];
}
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float relative_error(float value, float standard) {
return fabs((value - standard) / standard);
}
// <20>ж<EFBFBD><D0B6>߼<EFBFBD>
int Zuanjin_weights_judge(float* data, GetFeatureValue* dataFeature) {
float data_nor[ROWS];
normalize_data(data, dataFeature->min_values, dataFeature->max_values, data_nor, ROWS);
// <20><><EFBFBD><EFBFBD> normal <20>ķ<EFBFBD><C4B7><EFBFBD>
float scores_normal[COLS_NORMAL];
matrix_multiply(data_nor, dataFeature->weights_normal, scores_normal, ROWS, COLS_NORMAL);
float min_error = 1000000;
int con_index = -1;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < COLS_NORMAL; i++) {
float error = relative_error(scores_normal[i], dataFeature->std_scores_normal[i]);
if (error < min_error) {
min_error = error;
con_index = i;
}
}
float con_value = scores_normal[con_index];
float range_normal = dataFeature->range_values[con_index];
float value_big = dataFeature->std_scores_normal[con_index] * (1 + range_normal);
float value_small = dataFeature->std_scores_normal[con_index] * (1 - range_normal);
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>ڷ<EFBFBD>Χ<EFBFBD><CEA7>
if (value_small < con_value && con_value < value_big)
{
return con_index;
}
else
{
return -1;
}
}
unsigned char Get_MeasureData(GetDataValue DataValeNear) {
unsigned char Temp; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
GetFeatureValue dataFeature;
get_weights_scores_range(&dataFeature);
float InPress = DataValeNear.Mean_InPress; //<2F><>ѹƽ<D1B9><C6BD>ֵ
float OutPress = DataValeNear.Mean_OutPress; //<2F><>ѹƽ<D1B9><C6BD>ֵ
float Mean_WOB = DataValeNear.Mean_WOB; //<2F><>ѹƽ<D1B9><C6BD>ֵ
float Mean_Torque = DataValeNear.Mean_Torque; //Ť<><C5A4>ƽ<EFBFBD><C6BD>ֵ
float Mean_RPM = DataValeNear.Mean_RPM; //ת<><D7AA>ƽ<EFBFBD><C6BD>ֵ
float Mean_InTemprature = DataValeNear.Mean_InTemprature; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD>ֵ
float Mean_OutTemprature = DataValeNear.Mean_OutTemprature; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD>ֵ
float Different_Press = DataValeNear.Different_Press; //ѹ<><D1B9><EFBFBD><EFBFBD>ֵ
float Energy_InPress = DataValeNear.Energy_InPress; //<2F><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>ֵ
float Energy_OutPress = DataValeNear.Energy_OutPress; //<2F><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>ֵ
float Amplitude_WOB = DataValeNear.Amplitude_WOB; //<2F><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>ֵ
float Variance_WOB = DataValeNear.Variance_WOB; //<2F><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>
float Amplitude_Torque = DataValeNear.Amplitude_Torque; //Ť<>ط<EFBFBD><D8B7><EFBFBD>ֵ
float Variance_Torque = DataValeNear.Variance_Torque; //Ť<>ط<EFBFBD><D8B7><EFBFBD>
float Amplitude_RPM = DataValeNear.Amplitude_RPM; //ת<>ٷ<EFBFBD><D9B7><EFBFBD>ֵ
float Variance_RPM = DataValeNear.Variance_RPM; //ת<>ٷ<EFBFBD><D9B7><EFBFBD>
float Vibration_AxisX = DataValeNear.Vibration_AxisX; //X<><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float Vibration_AxisY = DataValeNear.Vibration_AxisY; //Y<><59><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float Vibration_AxisZ = DataValeNear.Vibration_AxisZ; //Z<><5A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float Variance_Vibration = DataValeNear.Variance_Vibration; //<2F>񶯷<EFBFBD><F1B6AFB7><EFBFBD>
float data[15];
data[0] = Different_Press;
data[1] = Energy_InPress;
data[2] = Energy_OutPress;
data[3] = Mean_WOB;
data[4] = Amplitude_WOB;
data[5] = Variance_WOB;
data[6] = Mean_Torque;
data[7] = Amplitude_Torque;
data[8] = Variance_Torque;
data[9] = Mean_RPM;
data[10] = Amplitude_RPM;
data[11] = Variance_RPM;
data[12] = Vibration_AxisX;
data[13] = Vibration_AxisY;
data[14] = Vibration_AxisZ;
int con_result = Zuanjin_weights_judge(data, &dataFeature);
if (con_result == 0)
2025-04-24 11:37:10 +08:00
{
Temp = 'A';
};
if (con_result == 1)
2025-04-24 11:37:10 +08:00
{
Temp = 'B';
}
if (con_result == 2)
2025-04-24 11:37:10 +08:00
{
Temp = 'C';
}
if (con_result == 3)
2025-04-24 11:37:10 +08:00
{
Temp = 'D';
}
if (con_result == 4)
2025-04-24 11:37:10 +08:00
{
Temp = 'E';
}
if (con_result == -1)
{
Temp = 'F';
}
return Temp; // <20><><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
void DataCompute(void)
{
uint8_t i;
GetDataValue DataValeNear = {
.Mean_InPress = 0.f, //<2F><>ѹƽ<D1B9><C6BD>ֵ
.Mean_OutPress = 0.f, //<2F><>ѹƽ<D1B9><C6BD>ֵ
.Mean_WOB = 0.f, //<2F><>ѹƽ<D1B9><C6BD>ֵ
.Mean_Torque = 2.399f,
.Mean_RPM = 4.293f,
.Mean_InTemprature = 22.74f,
.Mean_OutTemprature = 0.93f,
.Different_Press = 2.5f,
.Energy_InPress = 10.0f,
.Energy_OutPress = 8.5f,
.Amplitude_WOB = 5.0f,
.Variance_WOB = 0.8f,
.Amplitude_Torque = 2.3f,
.Variance_Torque = 1.0f,
.Amplitude_RPM = 150.0f,
.Variance_RPM = 2.5f,
.Vibration_AxisX = 0.1f,
.Vibration_AxisY = 0.15f,
.Vibration_AxisZ = 0.2f,
.Variance_Vibration = 0.05f
};
//<2F><><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for(i = 0;i < DATALENG;i++)
{
DataValeNear.DataValue[i] = MeasurementData_Nearbit.DataValue[i];
}
unsigned char con_index = Get_MeasureData(DataValeNear);
// <20><>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD>
// printf("The integer is: %d\n", con_index);
UART_SendByte(con_index);
}
void Get_Data_Process(void)
{
if(g_Data.Tim1Count1sFlag)//<2F><>ʱ<EFBFBD><CAB1>־
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɱ<EFBFBD>־Ϊ1,<2C><><EFBFBD>ߵȴ<DFB5><C8B4><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>͵ڶ<CDB5><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڷֱ<DAB7><D6B1>ж<EFBFBD>
if(g_Data.GetUart1OverFlag) //<2F><><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD>
{
switch(g_Data.Uart1SendCommendFlag)
{
case 0:
Send_Slave(1); //<2F><>ȡ<EFBFBD><C8A1><EFBFBD>˹<EFBFBD><CBB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
g_Data.Uart1SendCommendFlag = 1;
g_Data.Uart1OverCount = 0; //<2F><>ʱ<EFBFBD><CAB1>ʱ<EFBFBD><CAB1>־
g_Data.GetUart1OverFlag = 0; //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
break;
case 1:
Send_Slave(2); //<2F><>ȡ<EFBFBD><C8A1><EFBFBD>˹<EFBFBD><CBB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
g_Data.Uart1SendCommendFlag = 2;
g_Data.Uart1OverCount = 0; //<2F><>ʱ<EFBFBD><CAB1>ʱ<EFBFBD><CAB1>־
g_Data.GetUart1OverFlag = 0; //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
break;
default:
break;
}
}
if(g_Data.GetUart3OverFlag) //<2F><><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD>
{
switch(g_Data.Uart3SendCommendFlag)
{
case 0:
Send_Slave(3); //<2F><>ȡ<EFBFBD><C8A1><EFBFBD>˹<EFBFBD><CBB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
g_Data.Uart3SendCommendFlag = 1;
g_Data.Uart3OverCount = 0; //<2F><>ʱ<EFBFBD><CAB1>ʱ<EFBFBD><CAB1>־
g_Data.GetUart3OverFlag = 0; //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
break;
case 1:
Send_Slave(4); //<2F><>ȡ<EFBFBD><C8A1><EFBFBD>˹<EFBFBD><CBB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
g_Data.Uart3SendCommendFlag = 2;
g_Data.Uart3OverCount = 0; //<2F><>ʱ<EFBFBD><CAB1>ʱ<EFBFBD><CAB1>־
g_Data.GetUart3OverFlag = 0; //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
break;
default:
break;
}
}
//1s<31>ڶ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD><EFBFBD><EFBFBD>1s<31><73>־
if((g_Data.Uart1SendCommendFlag==2)&&(g_Data.Uart3SendCommendFlag==2))//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
g_Data.Tim1Count1sFlag = _FALSE;
g_Data.Uart1SendCommendFlag = 0;
g_Data.Uart3SendCommendFlag = 0;
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD>
g_Data.GetComplate_Flag = 1;
}
}
else
{
if(g_Data.GetComplate_Flag)
{
if((g_Data.GetUart1OverFlag)&&(g_Data.GetUart3OverFlag))
{
DataCompute();
g_Data.GetComplate_Flag = 0;
}
}
}
}