PID的电机控制

目录

一:PID的基本定义

二:我们为什么要使用这个算法?

三:P,I,D参数如何控制闭环?

1.P值的作用

2.D值的作用:

 3.I值的作用:

四:程序


前言:看了看很多大佬写的PID讲解很全面也很复杂,实在是不适合很多萌新入坑,所以想按自己的理解写一篇通俗易懂的PID算法讲解

一:PID的基本定义

PID,就是“比例(proportional)、积分(integral)、微分(derivative)”,是一种很 常见的控制算法。常见的PID算法,位置式PID,增量式PID,串级PID等。

二:我们为什么要使用这个算法?

 以电机转速为例子来解释,很多人应该都有这个疑惑,我控制转速,直接给电机输出一个PWM不就行了吗,假设我设置定时器的arr(自动重装载值)=1000-1,想让电机转慢一点,设置输出比较的PWM为200。我想让电机转的快一些,就给PWM输出1000,让电机全速旋转不就可以了吗?不停的进行测试,然后用编码器读取到电机当前的转速,记录下来,我就知道了电机的一个速度对应一个固定的PWM的值。大家有没有想过一个问题,电机随着使用时间的增加,电机的性能其实会发生变化,输出相同的PWM值,速度会和最开始测得的值是不一样的。我们有一辆小车(电机控制小车的速度),如果我改变小车的负重,根据生活中的常识,相同的输出电压下,负载越重,小车的速度越慢的,那么前面记录的数据都不成立了。所以说仅仅输出一个PWM值,是不能精确控制电机转动的速度保持在相同的值。这个时候PID的算法就会体现出重要的作用。现在,我用一个编码器来读取电机速度(编码器可以精确读取电机的转动速度),编码器的作用就是把电机转动的速度(模拟量)转化为一个数字量,传入到我们的微处理器。我们使用PID算法本质上是为了让编码器的值(即速度)稳定在一个值

三:P,I,D参数如何控制闭环?

我们的PID处理的函数,使用的C语言,函数中有两个入口参数,一个是编码器测量到当前的速度值(程序中使用position代替),另一个就是我们想达到的速度值(程序中使用target代替)。

1.P值的作用

如果当前的速度值和目标的速度值相差很大,我们就想增大电机的PWM输出,让电机快速达到目标值,PID中的P就扮演着重要的作用,这里的P我使用Position_KP代替,可以联想到PWM=Position_KP*(target-position),当前的速度值和目标的速度值相差越大,输出的PWM值就会越大,可以快速达到目标速度值。

下面的图显示的就是P值较大时的情况:

这个是P值较小的情况:

        P值较小的情况下,可以发现响应速度变慢了,P值较大的情况下,虽然响应速度比较快,但是振荡很严重。

2.D值的作用:

出现振荡的时候我们就想去抑制振荡,如何抑制振荡呢?PID中的D的作用就体现出来了。当比较接近目标时,P的控制作用就比较小了。越接近目标,P的作用越温柔。有很多内在的或者外部的因素,使控制量发生小范围的摆动。D的作用就是让物理量的速度趋于0,只要什么时候,这个量具有了速度,D就向相反的方向用力,尽力抑制住振荡的变化。在自动控制原理这门学科中会提到专业的名词。现在我们引入偏差值的概念,令Bias=taget-position,令上一次求得的偏差值为Last_Bias。D项的计算公式为Position_KD*(Bias-Last_Bias)

   我用带入值的方法来解释D的作用:现在让当前的速度值为90,目标值为100,Bias=10。现在是为了接近目标值,所以D项的结果是增加PWM。现在增加后的速度变成了105,Bias=-5,Last_Bias=10,Bias-Last_Bias=-15,如果增加后的速度为110,Bias=-10,Last_Bias=10,Bias-Last_Bias=-20,D项的计算结果是为了减小PWM,快速抑制住PWM的过量增加,超过目标值越多,那么抑制能力越厉害。

 3.I值的作用:

PID中的I的作用是为了消除静差,静差就是指,稳定状态下当前值和目标值的差为了让大家更清楚理解I的概念,之前看到一个很有趣的例子,这里借鉴一下:

假如有个人把我们的加热装置带到了非常冷的地方,开始烧水了。需要烧到50℃

在P的作用下,水温慢慢升高。直到升高到45℃时,他发现了一个不好的事情:天气太冷,水散热的速度,和P控制的加热的速度相等了

这可怎么办?

  • P兄这样想:我和目标已经很近了,只需要轻轻加热就可以了。
  • D兄这样想:加热和散热相等,温度没有波动,我好像不用调整什么。

于是,水温永远地停留在45℃,永远到不了50℃。

作为一个人,根据常识,我们知道,应该进一步增加加热的功率。可是增加多少该如何计算呢?

设置一个积分量。只要偏差存在,就不断地对偏差进行积分(累加),并反应在调节力度上。

这样一来,即使45℃和50℃相差不太大,但是随着时间的推移,只要没达到目标温度,这个积分量就不断增加。系统就会慢慢意识到:还没有到达目标温度,该增加功率啦!

到了目标温度后,假设温度没有波动,积分值就不会再变动。这时,加热功率仍然等于散热功率。但是,温度是稳稳的50℃。

kI的值越大,积分时乘的系数就越大,积分效果越明显。

四 程序

/**************************************************************************
函数功能:位置式PID控制器
入口参数:编码器测量位置信息,目标位置
返回  值:电机PWM
根据位置式离散PID公式 
pwm=Kp*e(k)+Ki*∑e(k)+Kd[e(k)-e(k-1)]
e(k)代表本次偏差 
e(k-1)代表上一次的偏差  
∑e(k)代表e(k)以及之前的偏差的累积和;其中k为1,2,,k;
pwm代表输出
**************************************************************************/
int Position_PID (int position,int target)
{ 	
	 static float Bias,Pwm,Integral_bias,Last_Bias;
	 Bias=target-position;                                  //计算偏差
	 Integral_bias+=Bias;	                                 //求出偏差的积分
	 Pwm=Position_KP*Bias+Position_KI*Integral_bias+Position_KD*(Bias-Last_Bias);       //位置式PID控制器
	 Last_Bias=Bias;                                       //保存上一次偏差 
	 return Pwm;                                           //增量输出
}
下面是增量式PID的具体执行程序:

/**************************************************************************
函数功能:增量PI控制器
入口参数:编码器测量值,目标速度
返回  值:电机PWM
根据增量式离散PID公式 
pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]
e(k)代表本次偏差 
e(k-1)代表上一次的偏差  以此类推 
pwm代表增量输出
在我们的速度控制闭环系统里面,只使用PI控制
pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)
**************************************************************************/
int Incremental_PI (int Encoder,int Target)
{ 	
	 static float Bias,Pwm,Last_bias;
	 Bias=Target-Encoder;                                  //计算偏差
	 Pwm+=Velocity_KP*(Bias-Last_bias)+Velocity_KI*Bias;   //增量式PI控制器
	 Last_bias=Bias;	                                   //保存上一次偏差 
	 return Pwm;                                           //增量输出
}

以上就是让小车速度保持目标值的算法分析

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
前馈PID电机控制是一种高级的电机控制技术,用于精确控制电机速度、位置或力矩。PID代表比例(proportional),积分(integral),微分(derivative)这三个控制算法的结合。 在前馈PID电机控制中,首先通过比例控制算法根据仪器或传感器反馈的偏差信号来产生一个控制信号。这个控制信号与输入信号进行比较,然后将差异值与比例增益相乘,得到一个修正量。这个修正量是实际控制器的输出信号,用于修正电机的运动。 接下来,前馈PID电机控制使用积分控制算法来考虑历史偏差。积分控制算法将历史偏差的累积加权并与积分增益相乘,以产生另一个修正量。这个修正量加上比例修正量,反映了电机受到的历史偏差的影响。 最后,前馈PID电机控制使用微分控制算法以考虑当前偏差的变化率。微分控制器根据偏差信号的斜率计算一个修正量,并乘以微分增益,以产生另一个修正量。这个修正量加上之前的修正量,反映了电机受到当前偏差变化的影响。 综合这三个控制算法的输出,前馈PID电机控制可以非常精确地调整电机的运动,使其达到所需的速度、位置或力矩。由于PID控制是通过不断调整控制信号来实现,因此可以对各种不稳定性进行修正,使电机在不同负载和环境条件下都能保持稳定和准确性能。因此,前馈PID电机控制是一种非常常用和高效的电机控制技术。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值