电磁车的控制比较简单,可以分为信号采集,舵机控制和电机控制三部分,电磁车的控制算法也主要围绕这三部分进行,刚开始起步可能对这三个模块的要求不高,但是随着车速的不断提高,需要不断的对这三个模块进行细化和深究。
滤波(Wave filtering)是将信号中特定波段频率滤除的操作,是抑制和防止干扰的一项重要措施。它可以从含有干扰的接收信号中提取有用信号,很大程度上保证了采集到的信号的真实性和稳定性。
正因如此,滤波算法也成了在智能车控制中不可或缺的一种控制算法。
根据经验判断,确定两次采样允许的最大偏差(设为A),每次检测到新值时判断
如果本次值与上次值之差小于等于A,则本次值无效。
如果本次值与上次值之差大于A,则本次值无效。放弃本次值,用上次值代替本次值。
优点:能有效克服因偶然因素引起的脉冲干扰。
缺点:无法抑制那种周期性的干扰、平滑度差。
#define A 10
char value;
char filter()
{
char new_value;
new_value = get_ad();
if ( ( new_value - value > A ) || ( value - new_value > A )
return value;
return new_value;
}
算术平均滤波,指的是将每个电感采集到的一组值用冒泡排序按从大到小顺序排列,丢弃最大值和最小值,再对剩余的值求平均。
优点:适用于对一般具有随机干扰的信号进行滤波,信号会在某一数值范围附近上下波动。
缺点:对于测量速度较慢或要求数据计算速度较快的实时控制不适用。
int filter(void)
{
int i;
int sum=0;
int min=0,max=0;
for(i=0;i<SAMPLE_NUM;i++)
{
if(vBat[i]>max)
{
max=vBat[i];
}
if(vBat[i]<min)
{
min==vBat[i];
}
sum+=vBat[i];
}
sum=sum-min-max;
return sum/(SAMPLE_NUM-2);
}
还有很多软件滤波的方法,可以参考下面链接
c语言 算术平均滤波法_常见的滤波算法(C语言
如果我们要想让一个系统达到预期的值,那应该怎么样做才能达到这个效果呢,这时候我们就可以引进PID。PID控制应该算是应用非常广泛的控制算法了。小到控制一个元件的温度,大到控制无人机的飞行姿态和飞行速度等等,都可以使用PID控制。
比例(P)积分(I)微分(D)控制(PID控制),是应用最广泛的一种自动控制器。
原理简单,易于实现,适用面广,参数独立,在参数调试中也能轻易找到最适合该系统使用的参数。
PID控制分为两种,在智能车控制中,最常用的就是增量式PID和位置式PID,舵机使用的是位置式PID,而电机的话,大多数的智能车队使用的是增量式,其实电机并不局限于增量式,增量式和位置式在参数调好的情况下效果是一样的,找到最适合自己的方案才是最重要的。
详细的PID控制知识可以参考智能车浅谈——控制规律篇
舵机的控制中,使用的是位置式PID,当车子处于赛道的不同位置时,偏差会不同。偏差等于左右电感值的偏差,当前偏差就是误差,把当前误差代入公式解算,最后输出的值来控制舵机进行打角。
//转向PD控制
My_Direction.Direct_Parameter=My_Direction.KP*poserror+My_Direction.KD*(poserror-My_Direction.PrevError);//电感差比和算出的偏差做增量式PD计算
My_Direction.PrevError=poserror;
price_PWM=(int)(My_Direction.Direct_Parameter);
电机的控制中,我使用的是增量式
根据编码器采集回来的数据求出当前速度值,然后与设定速度比较,得出的差值作为误差代入公式计算,得到最终需要输出的电机占空比,从而控制电机转速。
float PidIncCtrl_R(pid_param_t_R * pid_R, float error)
{
pid_R->out_p = pid_R->kp_min * (error - pid_R->last_error);
pid_R->out_i = pid_R->ki_min * error;
pid_R->out_d = pid_R->kd * ((error - pid_R->last_error) - pid_R->last_derivative);
pid_R->last_derivative = error - pid_R->last_error;
pid_R->last_error = error;
pid_R->out += pid_R->out_p + pid_R->out_i + pid_R->out_d;
return pid_R->out;
}
电机的闭环参数能很大程度上影响着智能车的上限,具体的调参步骤可以参考:
电机控制进阶——PID速度控制
目标速度的设定在智能车系统中尤其重要,比如在赛车比赛中,由于在赛车自身机械性能的限制,不同赛道元素中速度上限也就不同。所以为了使赛车能够更快的跑完全程,需要根据赛道元素的不同设置更合适当前路段的目标速度。
而对于电磁车来说,只能通过电磁传感器去感知赛道,所以只能将左右电感的差值去关联目标速度。差值小说明当前处于直道可以设定一个比较大的目标速度,通过PID算法将电机转速保持在目标速度相近的速度,去让智能车跑得更快,差值大的话,说明处于弯道处,这时候目标速度可以设定小一点,保证能顺畅过弯。
对于有两个电机的车模而言,转向不仅仅可以通过舵机,还可以通过左右电机的差速辅助转弯,这样它的速度上限也能更高。
if(poserror>10||poserror<-10)
{
PID_control(Turn_speed_mid-Steer_out*0.48,Turn_speed_mid+Steer_out*0.48);//电机控制函数
}
else
{
PID_control(Go_speed_mid-Steer_out*0.48,Go_speed_mid+Steer_out*0.48);//电机控制函数
}
电机差速转向的相关仿真和探究可以参考:
两轮差速移动机器人运动分析、建模和控制
源码地址:源码