智能车电磁组——基本控制篇

智能车电磁组——基本控制篇

    • 前言
    • 滤波
      • 什么是滤波
      • 常见的软件滤波
        • 1. 限幅滤波(又称程序判断滤波法)
        • 2. 算术平均滤波法
    • PID控制
      • 什么是PID控制
      • 舵机控制
      • 电机控制
      • 目标速度的设置

前言

电磁车的控制比较简单,可以分为信号采集,舵机控制和电机控制三部分,电磁车的控制算法也主要围绕这三部分进行,刚开始起步可能对这三个模块的要求不高,但是随着车速的不断提高,需要不断的对这三个模块进行细化和深究。

滤波

什么是滤波

滤波(Wave filtering)是将信号中特定波段频率滤除的操作,是抑制和防止干扰的一项重要措施。它可以从含有干扰的接收信号中提取有用信号,很大程度上保证了采集到的信号的真实性和稳定性。
正因如此,滤波算法也成了在智能车控制中不可或缺的一种控制算法。

常见的软件滤波

1. 限幅滤波(又称程序判断滤波法)

根据经验判断,确定两次采样允许的最大偏差(设为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;
         
}

2. 算术平均滤波法

算术平均滤波,指的是将每个电感采集到的一组值用冒泡排序按从大到小顺序排列,丢弃最大值和最小值,再对剩余的值求平均。
优点:适用于对一般具有随机干扰的信号进行滤波,信号会在某一数值范围附近上下波动。
缺点:对于测量速度较慢或要求数据计算速度较快的实时控制不适用。

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控制应该算是应用非常广泛的控制算法了。小到控制一个元件的温度,大到控制无人机的飞行姿态和飞行速度等等,都可以使用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);//电机控制函数
}

电机差速转向的相关仿真和探究可以参考:
两轮差速移动机器人运动分析、建模和控制
源码地址:源码

你可能感兴趣的:(第十七届智能车,智能车,电磁智能车,算法)