PID调节是自动控制领域的经典算法。主要有三个参数,即P:比例系数。I:积分系数。D:微分系数。
在PID调节过程中我们需要知道两个值:
1、系统当前状态值(即反馈),即电机转速的实际值。
2、期望值。即我们希望电机达到的转速。
在直流电机调速中一般采用PD调节器,即比例控制和微分控制。
可以设计一个函数:
// 功能:PD(比例,微分)调节器
// 参数1:measureValue,系统当前状态实际测量值,即当前的电机转速。
// 参数2:targetValue,希望系统达到的目标值,即希望电机达到的转速。
float PD_Adjust(float measureValue, float targetValue)
{
static float lastErr = 0;
float Kp = 0.0f, Kd = 0.0f;
float out, div, err;
err = measureValue - targetValue; // 偏差
div = err - lastErr; // 偏差的微分
out = Kp*err + Kd*div; // 输出值计算
lastErr = err; // 保存偏差
return out;
}
应用到电机速度调节中即为:
// 此函数每隔20ms被调用一次,进行一次调节,即50Hz的控制频率。
void TimerInt_20ms(void)
{
static float motorCtrlValue = 0;
motorCtrlValue += PD_Adjust(motorSpeed, 100); // 计算输出值,目标100
motorSet(motorCtrlValue); // 输出到电机
}
在调节中,比例系数P的作用是正反馈,电机实际转速低于目标时,便增大输出值,否则减少输出值。微分系数D的作用是负反馈,当前后两次调节的计算出来的偏差值相差过大,即误差的微分过大时,给出一个反向控制量,防止系统调节过猛,起到减少超调量的效果。实际效果自己测试下便能感受出来。
通过串口输出目标值和电机实际测量出来的转速值,以波形的方式绘制到电脑上,施加扰动,查看控制效果,体会PD调节器的作用。理想的调节波形应该是:
即:在尽量短的时间内达到目标转速,同时减少超调量,在几次振荡过后稳定。