两轮智能车PID控制如何实现

PID基础理论知识

都知道PID控制,但是总是没有搞清楚,看了很多公式和图形就是没整明白。下面这个图形就是pid控制的原理图。

两轮智能车PID控制如何实现_第1张图片

PID算法在很多方面都有重要应用,比如电机的速度控制,恒温槽的温度控制,四轴飞行器的平衡控制等等,作为闭环控制系统中的一种重要算法,PID算法是有比例,积分,微分三部分组成。关于PID通俗易懂的一篇文章介绍,推荐博客网址:https://blog.csdn.net/qq_25352981/article/details/81007075。

比例部分

            Kp:比例系数

           SetValue:预设值

           FactValue:当前实际值

           Error_1:当前误差

则比例部分为:Sp= Kp*(SetValue - FactValue)   或者 Sp=Kp*Error_1

注解:Sp大小反应需要控制的量大小,比如Sp越大,功率越大。当Sp为负值时,表示要超过预设值,如果是电机,则需要反转。

积分部分

           Ki:积分系数  

           Error_1:当前误差  

           Error_2:上一次误差  

           Error_3:上上一次误差

            ........

           Error_n:开始时的误差

则积分部分为:Si=Ki*(Error_1+Error_2+Error_3+......+Error_n)

注解:因为整个是一个过程,所以上一次误差其实就是上一次的当前误差。

微分部分

           Kd:微分系数 

           Error_1:当前误差  

           Error_2:上一次误差 

则微分部分为:Sd=Kd*(Error_1-Error_2)。

综上部分的PID得:

    PID=Sp + Si + Sd = Kp*Error_1 + Ki*(Error_1+Error_2+Error_3+......+Error_n) + Kd*(Error_1-Error_2)

两轮智能车的PID控制技术

我做的智能车主要是两轮,那就介绍两轮的PID控制方法,多轮可以照样改写。把之前制作的遥控收球机的代码放到这里跟大家分享。

对于两轮智能车的PID控制主要使用了下面这个函数:


void bieber_moto_Control(float current_speed,float target_speed, unsigned char Moto_ID)
{
	float Error   = 0;
	float P_Error = 0;
	float I_Error = 0;
	float D_Error = 0;
	float add     = 0;
	
	if(Moto_ID == LEFT)
	
		Error = target_speed - current_speed;                  //计算误差
		P_Error = Error;                                       //比例环节
		I_Error = Error - Left_L_Error;                        //积分环节
		D_Error = Error - 2*Left_L_Error + Left_LL_Error;      //微分环节
		
		add = KP * P_Error + KI * I_Error + KD * D_Error;      //左轮PID增加值
		Left_ESC_Output_PWM += add;                            //计算PWM输出值
		
		Left_LL_Error = Left_L_Error;
		Left_L_Error = Error;
		
	
	else if(Moto_ID == RIGHT)
	{
		Error = target_speed - current_speed;                   //计算误差
		P_Error = Error;                                        //比例环节
		I_Error = Error - Right_L_Error;                        //积分环节
		D_Error = Error - 2*Right_L_Error + Right_LL_Error;     //微分环节

		add = KP * P_Error + KI * I_Error + KD * D_Error;       //左轮PID增加值
		Right_ESC_Output_PWM += add;                            //计算PWM输出值
		
		Right_LL_Error = Right_L_Error;
		Right_L_Error = Error;
	}

	PWM_Output(Left_ESC_Output_PWM, Right_ESC_Output_PWM);  //输出左右轮的PWM
}

 希望上面代码对你开发两轮智能车有一定帮助,谢谢大家!

你可能感兴趣的:(arduino,嵌入式操作系统,STM32)