直流电机PID调节——P

版权声明:本文为博主原创文章,如需转载,请注明出处 https://blog.csdn.net/qq_36554582/article/details/82721453

其实要用PID调节的话,最好是使用带有编码器的比较高端一点的直流减速电机,但是因为它价格有点贵,所以我们一般做智能小车就会选用普通的直流电机,但是普通的直流电机也是可以使用PID调节的,虽然它的效果没有带编码器得到直流减速电机的好,但是我们也可以在调节的过程中慢慢地深刻的理解PID调节的含义。今天先来分享一下我刚刚涉及的PID中的P调节。

P就是比例:Proportion
它直接影响的是我们整个系统的响应速度,P参数越大,系统对外界的响应速度越快,P参数越小,系统对外界的响应速度越慢,当然P也不是越大越好,P大的话,就会让我们的系统产生比较大的超调量,这当然不是我们想要的结果,所以说任何事物都要适度才好。

我们都知道,PID调节中的一个很重要的参数就是误差,误差顾名思义就是我们目标值和实际值的差值,而这个P就是直接作用于这个差值上的,我们来看下部分代码

void SetLeftSpeed(u16 LeftSet,u16 LeftReal)//入口参数:目标值,实际值
{
    static int  LeftMotorPWM=0;
    int  LeftError=0,LeftIncPWM=0;

    LeftError=LeftSet-LeftReal;//本次偏差等于目标值减去实际值

    LeftIncPWM=(int)(LeftPID_Kp*LeftError);
    LeftMotorPWM+=LeftIncPWM;

    if(LeftMotorPWM>=90)
        LeftMotorPWM=90;
    else if(LeftMotorPWM<=10)
        LeftMotorPWM=10;

    SetLeftPWM(LeftMotorPWM);
}

上面这个子函数就是我小车上左轮子的PID调节(里面只有P调节)。
我们需要注意的是里面的几个变量:
1、LeftMotorPWM:通过PID调节出来的要赋给电机的PWM,它是本次PID调节和前面所有的PID调节共同积累出来的数值,所以它需要用static来进行修饰,把它变成静态变量,并且它的值有正有负,所以我们定义成int,而不是unsigned int。
2、LeftIncPWM:本次通过PID调节算出来的PWM值,他不是直接赋给电机的PWM,它只是本次PWM算出来的值,这也就是它和LeftMotorPWM的区别了。LeftIncPWM也是有正有负,我们同样需要定义成int,但它不是静态变量。
3、LeftError:本次PID调节中目标值与实际值的差值,这是一个很重要的参数。同样他也是有正有负,我们把它也定义成int,它也不是静态的。

然后我们来看一条重要的语句

LeftIncPWM=(int)(LeftPID_Kp*LeftError);

这个说白了就是PID调节中的P调节,没错就这么简单的一条语句。
他其实就是在我们的本次目标值与实际值的差值上面乘上了一个参数,这个参数就是Kp,回想一下我开头说的那句话,P参数越大,系统的响应速度就越快,仔细想一下是不是这个道理,我们要给电机的PWM就是由目标值与实际值的差值来实时决定的,误差越大,计算出来的PWM就越大,误差越小计算出来的PWM就越小,而P参数就相当于一条直线的斜率,斜率越大,纵坐标对于横坐标的变化就越敏感,也就是系统对于外界的变化的响应速度越快。

接下来看一下调试数据

其中Kp*100就是我设置的P参数,为了显示方便,我是让真正的P参数乘以100之后再用串口打印出来,也就是说,此时真正的P参数是0.12,左轮值是测速模块(测速光耦)返回来的电机实际速度值(其实不是电机的实际速度,只是测速模块触发的外部中断次数,在这里我就先称它为电机实际速度,它是可以代表电机速度变化的一个数值,所以说我们现在没有必要再去用公式计算电机的物理实际速度),这个电机实际速度是统计周期是100ms,即我是统计100ms测速模块触发的外部中断的次数。
设定值就是我们的目标值,就是我们想要电机达到的速度值,这里我同样是用相对于测速模块触发外部中断的次数来进行设定的,然后PWM值就是PID调节之后要赋给电机实际的PWM数值。
从串口打印的数据我们可以看出,刚开始电机的速度是0,设定值时3,因为实际值没有达到设定值,所有PID调节中P调节就会使PWM值一直在增加,增加到我们测到了电机实际值最大为12,我们设定值时5,他现在加速到了12,这个12-5=7就是所谓的超调量。继续往后看串口的数据,我们就会发现,电机的实际值慢慢地又降下来了,最终稳定在了设定值(也就是5)的附近,这就说明达到了PID调节中P的效果。

然后我简单的用matlab画了一下速度的大概曲线,虽然不是很专业,但是将就着看看效果吧

从曲线上我们可以看到,最终速度会稳定在设定值5附近,当然他不会一直稳定在5,他会一直在5附近上下波动。

接下来我把P参数调大,再来看一下效果

从串口打出来的数据就可以看出来,P调大之后,系统的响应速度变得快了,即它现在可以花很少的时间就可以把速度调到我们的目标值,但是随之而来的缺点就是,它现在对于外界的变化过于敏感,以至于它调节出来的PWM值会不停地波动,或者我们来看左轮值,也就是电机的实际值,它没有像刚才那样基本稳定在我们的设定值5附近,而是变化很大,这就是所谓的抖动现象,造成抖动的原因就是P参数太大,这个时候我们就应该再把P参数调小一点,直到达到我们想要的效果。然后看一下matlab画出来的曲线

我们发现,我们把P调大之后,电机的实时速度和我们设定的速度的差值就变得大了,即曲线波形的振幅变得更大了。

在串口打印的数据中,由于我设定的目标值有点小,所以可能只通过数据看的不是很清楚,但是整体上可以大概反映出PID调节的效果,具体参数是个人情况而定。

PID中的P调节就说到这吧。

猜你喜欢

转载自blog.csdn.net/qq_36554582/article/details/82721453