电机控制进阶——PID速度控制

之前的几篇文章(电机控制基础篇),介绍的电机编码器原理、定时器输出PWM、定时器编码器模式测速等。

本篇在前几篇的基础上,继续来学习电机控制,通过PID算法,来进行电机的速度控制,并进行实验测试。

PID基础

PID即:Proportional(比例)、Integral(积分)、Differential(微分)的缩写。

PID是经典的闭环控制算法,具有原理简单,易于实现,适用面广,控制参数相互独立,参数的选定比较简单等优点。

凡是需要将某一个物理量“保持稳定”的场合(比如维持平衡,稳定温度、转速等),PID都会派上大用场。

PID算法分类

PID算法可分为位置式PID与增量式PID两大类。

在实际的编程应用中,需要使用离散化的PID算法,以适用计算机的使用环境,下面以电机转速控制为例,来看一下两种PID算法的基本原理。

位置式PID

位置式PID是当前系统的实际位置,与想要达到的预期位置的偏差,进行PID控制

  • 比例P:e(k) 此次误差
  • 积分I:∑e(i) 误差的累加
  • 微分D:e(k) - e(k-1) 此次误差-上次误差

因为有误差积分 ∑e(i),一直累加,也就是当前的输出u(k)与过去的所有状态都有关系。

位置式PID算法的伪代码如下

//位置式PID(伪代码)
previous_err = 0;
integral = 0;
loop: //根据目标值与测量值(如电机的设定速度与读到的编码器转后后的速度),循环计算更新输出值(如PWM)
	error = setpoint - measured_value;          /*误差项:目标值-测量值*/
	integral += error * dt;                     /*积分项:误差项的累计*/
    derivative = (error - previous_error) / dt; /*微分项:误差的变化率*/
	output = Kp*error + Ki*integral + Kd*derivative; /*三项分别乘以PID系数即为输出*/
	previous_err = err; //更新误差
	wait(dt); //等待固定的计算周期
	goto loop;

增量式PID

  • 比例P:e(k) - e(k-1) 此次误差-上次误差

  • 积分I:e(k) 此次误差d

  • 微分D:e(k) - 2e(k-1)+e(k-2) 这次误差-2×上次误差+上上次误差

注意增量式PID首先计算的是Δu(k),然后与上次的输出相加,才是此次的输出结果。增量式PID没有误差累加,控制增量Δu(k)的确定仅与最近3次的采样值有关。

增量式PID算法的伪代码如下

//增量式PID(伪代码)
previous02_error = 0; //上上次偏差
previous01_error = 0; //上次偏差
integral = 0; //积分和
pid_out = 0; //pid增量累加和
loop:
    error = setpoint − measured_value;  /*误差项:目标值-测量值*/
    proportion = error - previous01_error;                            /*比例项:误差项-上次偏差*/
    integral = error * dt;                                            /*积分项:误差项的累计*/
    derivative = (error − 2*previous01_error + previous02_error) / dt;/*微分项:上次误差与上上次误差的变化率*/
    /*或写成:derivative = ( (error − previous01_error)/dt - (previous01_error - previous02_error)/dt )*/
    pid_delta = Kp × error + Ki × integral + Kd × derivative; //计算得到PID增量
    pid_out = pid_out + pid_delta; //计算最终的PID输出

    previous02_error = previous01_error; //更新上上次偏差
    previous01_error = error; //更新上次偏差
    wait(dt); //等待固定的计算周期
    goto loop;

PID各项的作用

以这个弹簧为例(假设没有重力,只有空气阻力),先是在平衡位置上(目标位置),拉它一下,然后松手,这时它会震荡起来。

P 比例

P就是比例的意思。这里就类比弹簧的弹力(回复力):F=k*Δx

  • 当物块距离平衡位置越远时,弹力越大,反之,离平衡位置越近,力越小。
  • 当物块位于平衡位置上方时,弹性向下,当物块位于平衡位置下方时,弹性向上,即弹力总是使物块朝平衡位置施力。

D 微分/求导/变化率

只有P控制,物块一直在上下震荡,整个系统不是特别稳定。

这是因为空气阻力太小,想象一下整个把它放到水里,物块应该很快会静止下来。这时因为阻力的作用。

D的作用就相当于阻力

  • 它与变化速度(单位时间内的变化量)有关,变化的越大,它施加的阻力也就越大

  • 它的方向与目标值无关,比如,当物块从下到上经过平衡位置时,它的方向一直是朝下,

    即先是阻止物块靠近平衡位置,再是阻止物块远离平衡位置(对比P的作用,始终阻止物块远离平衡位置)

  • 它的作用就是减小系统的超调量了(减少系统在平衡位置震荡)

I 积分/误差累积

有了P的动力和D的阻力,这个物块就可以较快的稳定下来了,那I的作用是什么呢?

想象一下,如果有其它外力的影响,在某一时刻,物块将要到达平衡位置时,恰好P的动力与外力(与P的作用方向相反的恒定力)抵消,则之后物块将停在此处附近(因为此时D的力也趋近0,并很快变为0),一直到达不了平衡位置。

这时,I的误差积分作用就很有必要了:

  • 它计算的误差的累计,只要有误差,它就一直增加,开始可能很小,但只要没要到达平衡位置,该值就会越来越大
  • 它的作用就是消除系统的静态误差了

PID参数整定

实际应用,进行PID参数调节时,一般使用试凑法,PID参数整定口诀如下:

参数整定找最佳,从小到大顺序查,

先是比例后积分,最后再把微分加

曲线振荡很频繁,比例度盘要放大,

曲线漂浮绕大湾,比例度盘往小扳,

曲线偏离回复慢,积分时间往下降,

曲线波动周期长,积分时间再加长,

曲线振荡频率快,先把微分降下来,

动差大来波动慢,微分时间应加长,

理想曲线两个波,前高后低4比1,

一看二调多分析,调节质量不会低。

电机PID速度控制

上面介绍了PID的基础知识,接下来就使用位置式PID来实现对直流电机转速的控制。

程序

自定义PID结构体

typedef struct
{
	float target_val;   //目标值
	float err;          //偏差值
	float err_last;     //上一个偏差值
	float Kp,Ki,Kd;     //比例、积分、微分系数
	float integral;     //积分值
	float output_val;   //输出值
}PID;

PID算法实现(位置式PID)

float PID_realize(float actual_val)
{
	/*计算目标值与实际值的误差*/
	pid.err = pid.target_val - actual_val;
	
	/*积分项*/
	pid.integral += pid.err;

	/*PID算法实现*/
	pid.output_val = pid.Kp * pid.err + 
				     pid.Ki * pid.integral + 
				     pid.Kd * (pid.err - pid.err_last);

	/*误差传递*/
	pid.err_last = pid.err;

	/*返回当前实际值*/
	return pid.output_val;
}

周期调用PID计算

//周期定时器的回调函数
void AutoReloadCallback()
{
	int sum = 0;/*编码器值(PID输入)*/
	int res_pwm = 0;/*PWM值(PID输出)*/
	
    /*读取编码器测量的速度值*/
	sum = read_encoder();
    /*进行PID运算,得到PWM输出值*/
    res_pwm = PID_realize(sum);
	/*根据PWM值控制电机转动*/
	set_motor_rotate(res_pwm);
	
    /*给上位机通道1发送实际值*/
	set_computer_value(SEND_FACT_CMD, CURVES_CH1, &sum, 1); 
}

上位机

这里使用野火多功能调试助手的"PID调试助手“来进行实验,用于显示PID调节时的电机转速曲线。

实验演示

目标速度值设为50(这里的目标值50使用的是编码器10ms捕获的脉冲数),通过体调节PID的参数,来测试电机能否较快的达到目标速度。

先调节P

P值先使用10看看效果,从速度曲线可以看出,达不到目标速度,且与目标速度相差较大。

PID
1000

P值加大到100,从速度曲线可以看出,还是达不到目标速度。

PID
10000

只使用P,会存在静差,始终达到不了目标值,这时就要使用积分项来消除静差了。

再调节I

P保持100,I使用0.2,从速度曲线可以看出,可以达到目标速度,但跟随的速度较慢。

PID
1000.20

P保持100,加大I,使用1.0,从速度曲线可以看出,可以达到目标速度,跟随的速度加快了。

PID
1001.00

P保持100,继续加大I,使用3.0,从速度曲线可以看出,可以达到目标速度,跟随的速度进一步加快了。

PID
1003.00

P保持100,再继续加大I,使用6.0,从速度曲线可以看出,可以达到目标速度,跟随速度也很快,但有一点过冲。

PID
1006.00

对于过冲,可以再加入微分试试,微分D相当于阻力的效果

最后调节D

P保持100,I保持6.0,D使用3.0,从速度曲线上,好像看不出明显的变化。

PID
1006.03.0

P保持100,I保持6.0,D加大到6.0,从速度曲线上看,过冲幅度减小了点。

PID
1006.03.0

演示视频

PID-电机速度控制

总结

本篇简单介绍了PID的基础原理与参数整定,若想把PID参数调节好,还需要不断的实践与调试。

PID电机控制目录 第1 章 数字PID 控制 1.1 PID 控制原理 1.2 连续系统的模拟PID 仿真 1.3 数字PID 控制 1.3.1 位置式PID 控制算法 1.3.2 连续系统的数字PID 控制仿真 1.3.3 离散系统的数字PID 控制仿真 1.3.4 增量式PID 控制算法及仿真 1.3.5 积分分离PID 控制算法及仿真 1.3.6 抗积分饱和PID 控制算法及仿真 1.3.7 梯形积分PID 控制算法 1.3.8 变速积分PID 算法及仿真 1.3.9 带滤波器的PID 控制仿真 1.3.10 不完全微分PID 控制算法及仿真 1.3.11 微分先行PID 控制算法及仿真 1.3.12 带死区的PID 控制算法及仿真 1.3.13 基于前馈补偿的PID 控制算法及仿真 1.3.14 步进式PID 控制算法及仿真 第2 章 常用的PID 控制系统 2.1 单回路PID 控制系统 2.2 串级PID 控制 2.2.1 串级PID 控制原理 2.2.2 仿真程序及分析 2.3 纯滞后系统的大林控制算法 2.3.1 大林控制算法原理 2.3.2 仿真程序及分析 2.4 纯滞后系统的Smith 控制算法 2.4.1 连续Smith 预估控制 2.4.2 仿真程序及分析 2.4.3 数字Smith 预估控制 2.4.4 仿真程序及分析 第3 章 专家PID 控制和模糊PID 控制 3.1 专家PID 控制 3.1.1 专家PID 控制原理 3.1.2 仿真程序及分析 3.2 模糊自适应整定PID 控制 3.2.1 模糊自适应整定PID 控制原理 3.2.2 仿真程序及分析 3.3 模糊免疫PID 控制算法 3.3.1 模糊免疫PID 控制算法原理 3.3.2 仿真程序及分析 第4 章 神经PID 控制 4.1 基于单神经元网络的PID 智能控制 4.1.1 几种典型的学习规则 4.1.2 单神经元自适应PID 控制 4.1.3 改进的单神经元自适应PID 控制 4.1.4 仿真程序及分析 4.1.5 基于二次型性能指标学习算法的单神经元自适应PID 控制 4.1.6 仿真程序及分析 4.2 基于BP 神经网络整定的PID 控制 4.2.1 基于BP 神经网络的PID 整定原理 4.2.2 仿真程序及分析 4.3 基于RBF 神经网络整定的PID 控制 4.3.1 RBF 神经网络模型 4.3.2 RBF 网络PID 整定原理 4.3.3 仿真程序及分析 4.4 基于RBF 神经网络辨识的单神经元PID 模型参考自适应控制 4.4.1 神经网络模型参考自适应控制原理 4.4.2 仿真程序及分析 4.5 基于CMAC(神经网络)与PID 的并行控制 4.5.1 CMAC 概述 4.5.2 CMAC 与PID 复合控制算法 4.5.3 仿真程序及分析 4.6 CMAC 与PID 并行控制的Simulink 仿真 4.6.1 Simulink 仿真方法 4.6.2 仿真程序及分析 第5 章 基于遗传算法整定的PID 控制 5.1 遗传算法的基本原理 5.2 遗传算法的优化设计 5.2.1 遗传算法的构成要素 5.2.2 遗传算法的应用步骤 5.3 遗传算法求函数极大值 5.3.1 遗传算法求函数极大值实例 5.3.2 仿真程序 5.4 基于遗传算法PID 整定 5.4.1 基于遗传算法PID 整定原理 5.4.2 基于实数编码遗传算法PID 整定 5.4.3 仿真程序 5.4.4 基于二进制编码遗传算法PID 整定 5.4.5 仿真程序 5.5 基于遗传算法摩擦模型参数辨识的PID 控制 5.5.1 仿真实例 5.5.2 仿真程序 第6 章 先进PID 多变量解耦控制 6.1 PID 多变量解耦控制 6.1.1 PID 解耦控制原理 6.1.2 仿真程序及分析 6.2 单神经元PID 解耦控制 6.2.1 单神经元PID 解耦控制原理 6.2.2 仿真程序及分析 6.3 基于DRNN 神经网络整定的PID 解耦控制 6.3.1 基于DRNN 神经网络参数自学习PID 解耦控制原理 6.3.2 DRNN 神经网络的Jacobian 信息辨识 6.3.3 仿真程序及分析 第7 章 几种先进PID 控制方法 7.1 基于干扰观测器的PID 控制 7.1.1 干扰观测器设计原理 7.1.2 连续系统的控制仿真 7.1.3 离散系统的控制仿真 7.2 非线性系统的PID 鲁棒控制 7.2.1 基于NCD 优化的非线性优化PID 控制 7.2.2 基于NCD 与优化函数结合的非线性优化PID 控制 7.3 一类非线性PID 控制器设计 7.3.1 非线性控制器设计原理 7.3.2 仿真程序及分析 7.4 基于重复控制补偿的高精度PID 控制 7.4.1 重复控制原理 7.4.2 基于重复控制补偿的PID 控制 7.4.3 仿真程序及分析 7.5 基于零相差前馈补偿的PID 控制 7.5.1 零相差控制原理 7.5.2 基于零相差前馈补偿的PID 控制 7.5.3 仿真程序及分析 7.6 基于卡尔曼滤波器的PID 控制 7.6.1 卡尔曼滤波器原理 7.6.2 仿真程序及分析 7.6.3 基于卡尔曼滤波器的PID 控制 7.6.4 仿真程序及分析 7.7 单级倒立摆的PID 控制 7.7.1 单级倒立摆建模 7.7.2 单级倒立摆控制 7.7.3 仿真程序及分析 7.8 吊车-双摆系统的控制 7.8.1 吊车-双摆系统的建模 7.8.2 吊车-双摆系统的仿真 第8 章 灰色PID 控制 8.1 灰色控制原理 8.1.1 生成数列 8.1.2 GM 灰色模型 8.2 灰色PID 控制 8.2.1 灰色PID 控制的理论基础 8.2.2 连续系统灰色PID 控制 8.2.3 仿真程序及分析 8.2.4 离散系统灰色PID 控制 8.2.5 仿真程序及分析 8.3 灰色PID 的位置跟踪 8.3.1 连续系统灰色PID 位置跟踪 8.3.2 仿真程序及分析 8.3.3 离散系统灰色PID 位置跟踪 8.3.4 仿真程序及分析 第9 章 伺服系统PID 控制 9.1 伺服系统低速摩擦条件下PID 控制 9.1.1 Stribeck 摩擦模型描述 9.1.2 一个典型伺服系统描述 9.1.3 仿真程序及分析 9.2 伺服系统三环的PID 控制 9.2.1 伺服系统三环的PID 控制原理 9.2.2 仿真程序及分析 9.3 二质量伺服系统的PID 控制 9.3.1 二质量伺服系统的PID 控制原理 9.3.2 仿真程序及分析 第10 章 PID 实时控制的C++语言设计及应用 10.1 M 语言的C++转化 10.2 基于C++的三轴飞行模拟转台伺服系统PID 实时控制 10.2.1 控制系统构成 10.2.2 系统各部分功能的软件设计 10.2.3 仿真程序及分析 参考文献
评论 46
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值