去掉最大最小值求平均值的算法

/*以上串口数据按照协议解析判断*/

/*
 * 描述:由于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;
	/*以上这里是给计算平均值的相关变量清零*/
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值