/*以上串口数据按照协议解析判断*/
/*
* 描述:由于CAN电调发送过来的数据是1000hz的频率,而自身的线程可能只有50hz等,所以为了使数据更准确,所以采用去除最大最小值,然后求平均值的方法,将这个数据赋值
* 返回值:是平均值
* 参数:每次获得的CAN电调返回的转速
* */
static float MotorSpeedAverage(int16_t Rev,int16_t* Max,int16_t* Min,uint8_t* IDCount,float* Sum){
float Ave = 0;
if(*IDCount == 255){
*IDCount = 0;
}
(*IDCount)++;
if(*Sum > 2100000000){
*Sum = 0;
}
if(*Sum < -2100000000){
*Sum = 0;
}
*Sum += Rev;
if(*IDCount == 1){
*Max = Rev;
}else if(*IDCount == 2){
if(Rev > *Max){
*Min = *Max;
*Max = Rev;
}else{
*Min = Rev;
}
}
if(*IDCount > 2){
if(Rev > *Max){
*Max = Rev;
}
if(Rev < *Min){
*Min = Rev;
}
Ave = ((*Sum) - (*Max) - (*Min))/((*IDCount) - 2);
// usb_printf("Ave = %f\r\n",Ave);
}else{
Ave = Rev;
}
return Ave;
}
/*
* 描述:在一个周期内给收到的多组电机调速器的转速求平均值后将相关的变量清零,以便下一个周期使用
* */
static void MotorSpeedAveragrClearZero(void){
/*以下这里是给计算平均值的相关变量清零*/
CauRevFlag = 1;
RecID1Count = 0;
RecID2Count = 0;
SumID1 = 0;
SumID2 = 0;
MaxValue1 = 0;
MinValue1 = 0;
MaxValue2 = 0;
MinValue2 = 0;
/*以上这里是给计算平均值的相关变量清零*/
}
去掉最大最小值求平均值的算法
最新推荐文章于 2024-08-09 20:04:15 发布