程序项目代做,有需求私信(小程序、网站、爬虫、电路板设计、驱动、应用程序开发、毕设疑难问题处理等)

基于直流有刷电机的速度闭环控制以及matlab仿真

一、自动控制系统简介

首先,让我们理解什么是自动控制系统。顾名思义,它就是能在没有人的直接干预下,自动地使某个设备或过程(我们称之为“被控对象”)按照预定规律运行的系统。

一个简单的例子是电热水壶。你设定一个目标(100℃沸腾),它就能自动加热并在达到温度后断开电源。这里面就包含了一个简单的自动控制系统。

自动控制系统是为实现某一控制目标所需要的所有物理部件的有机组合体。在工程上,自动控制系统主要分为两大类:开环控制系统和闭环控制系统。

1.1 开环控制系统

定义:开环控制不能够检测误差,不能够校正误差,只能够按照事先确定好的程序和产生信号的条件,依次去控制对象并且无抑制的干扰能力。

它的结构框图是这样的:

以生活中的电吹风为例,电吹风是一个常见开环控制系统,通过设置吹风机的档位可以改变风扇的转速和电热丝的温度,进而调节输出的温度和风速。 电吹风的开环控制框图如下:

你按下3档按钮,电机就以固定的电压运行。它不会因为天气变热或风被阻挡而自动调整转速。

1.2 闭环自动控制系统

现在,让我们回到接水的例子。这次我们用一个更聪明的方法:你眼睛一直盯着杯子的水位,手在不断微调阀门——水快满了就关小一点,水太少了就开大一点。你的眼睛(传感器)将水位(输出量)实时反馈给大脑(控制器),大脑再指挥手(执行器)进行调整。

定义:闭环控制也就是(负)反馈控制,系统组成包括传感器,控制装置), 执行机构。传感器检测被控对象的状态信息(输出量),并将其转变成物理(电)信号传给控制装置。 控制装置比较被控对象当前状态(输出量)对希望状态(给定量)的偏差,产生一个控制信号,通过执行机构驱动被控对象运动, 使其运动状态接近希望状态。具体可见一下框图:

控制系统与电机有什么关系

二、PID算法

PID算法是控制领域非常常见的算法,小到控制温度,大到控制飞机的飞行姿态和速度等等,都会涉及到PID控制, 在控制领域可以算是万能的算法,如果你能够掌握PID算法的控制与实现,那么已经足以应对控制领域的一般问题了。

并且在众多控制算法中PID是最能体现反馈思想的算法;可以算上是经典之作,那么如此好用的算法是不是很复杂呢? 并不是,经典不等同于复杂,往往经典的东西是都是简单的。所以放心学习就好了!

以小车速度为例,你一定会发现这样一个问题;

  • 当你刚把充满的12V电池装在小车上时,然后在程序上给了一个固定50%的占空比, 此时小车跑的很快动力很足;
  • 但是跑着跑着就慢了下来,因为电池电压的影响小车速度变慢了,在刚充满的时候12V电池50%的占空比 相当于直接作用在电机两端的电压是12V x 50% = 6V
  • 当使用一段时间后电池的电压变为9V,虽然程序占空比没有变,但是由于电池电压降低了, 所以作用在电机两端的电压也就变了,所以小车变慢了

那么怎么才能够使小车按照恒定速度行驶呢?其思想就是当小车速度慢了,就增加占空比。 那么速度慢多少开始增加占空比呢?怎么增加?增加多少呢?

此时,PID算法就是一个非常好的选择,对于增加多少的问题,一定要通过PID算法,因为速度和占空比到底是个什么关系,谁也不知道。 但是此时使用PID算法,通过编码器的速度反馈,可以实时的知道小车的速度是否慢了,然后利用目标速度与实际速度的误差带入算法, 即可获得当前占空比,达到控制速度的效果。

2.1 算法介绍

PIDProportional(比例)、Integral(积分)、Differential(微分)的首字母缩写; 是一种结合比例、积分和微分三种环节于一体的闭环控制算法,它是目前为止在连续控制系统中计数最为成熟的一种控制算法; 在工业控制、机器人、无人机、机械臂和平衡车等领域有着极为重要的作用。

该控制算法出现于20世纪3040年代,至今为止经久不衰, 适用于对被控对象模型了解不清楚的场合。实际运行的经验和理论的分析都表明,运用这种控制规律对许多工业过程进行控制时, 都能得到比较满意的效果。PID控制的实质是对目标值和实际值误差进行比例、积分、微分运算后的结果用来作用在输出上。

PID控制器的输出就是这三项作用之和。它的数学模型可以表示为:

\[u(t)=K_pe(t) + {K_i}\int_{0}^{t}e(τ)dt+K_d\frac{de(t)}{dt} \]

其中:

  • \(K_p\):比例增益;
  • \(K_i\):积分增益;
  • \(K_d\):微分增益;
  • \(u(t)\)PID控制器的输出;
  • \(e(t)\):误差,即 设定值与实际反馈值的差。
2.1.1 比例环节

比例环节的输出与输入成正比关系,能够迅速的反应偏差,偏差减小的速度取决于比例系数\(K_p\)

  • \(K_p\)越大偏差减小的就越快,但是极易引起震荡;
  • \(K_p\)减小发生震荡的可能性减小,但是调节的速度变慢;

单纯的比例环节无法消除静态误差,这时候就需要积分环节。

2.1.2 积分环节

在比例环节产生了静态误差,在积分环节中,主要用于就是消除静态误差提高系统的无差度。

积分作用的强弱,取决于积分增益\(K_i\)\(K_i\)越大积分作用越强,反之则越弱。

积分环节作用的存在与偏差e(t)的存在时间有关,只要系统存在着偏差,积分环节就会不断起作用,对输入偏差进行积分, 使控制器的输出及执行器的开度不断变化,产生控制作用以减小偏差。

在积分时间足够的情况下,可以完全消除静差,这时积分控制作用将维持不变。 \(K_i\)越大,积分速度越快,积分作用越强。积分作用太强会使系统超调加大,甚至使系统出现振荡。

2.1.3 微分环节

微分环节的作用是反应系统偏差的一个变化趋势,也可以说是变化率,可以在误差来临之前提前引入一个有效的修正信号, 有利于提高输出响应的快速性,减小被控量的超调和增加系统的稳定性,虽然积分环节可以消除静态误差但是降低了系统的响应速度, 所以引入微分控制器就显得很有必要,尤其是具有较大惯性的被控对象使用PI控制器很难得到很好的动态调节品质,系统会产生较大的超调和振荡, 这时可以引入微分作用。

在偏差刚出现或变化的瞬间,不仅根据偏差量作出及时反应(即比例环节作用), 还可以根据偏差量的变化趋势(速度)提前给出较大的控制作用(即微分环节作用),将偏差消灭在萌芽状态, 这样可以大大减小系统的动态偏差和调节时问,使系统的动态调节品质得以改善。

微分环节有助于系统减小超调,克服振荡, 加快系统的响应速度,减小调节时间,从而改善了系统的动态性能,但微分增益过大,会使系统出现不稳定。 微分控制作用一个很大的缺陷是容易引入高频噪声,所有在干扰信号比较严重的流量控制系统中不宜引入微分控制作用。

2.2 PID各项的作用

下面是我从《电机控制进阶1——PID速度控制》文章中看到有关PID作用比较通俗易懂的解释,这里我就直接搬过来了。

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

2.2.1 比例环节

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

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

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

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

D的作用就相当于阻力:

  • 它与变化速度(单位时间内的变化量)有关,变化的越大,它施加的阻力也就越大;
  • 它的方向与目标值无关,比如,当物块从下到上经过平衡位置时,它的方向一直是朝下;

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

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

2.2.3 积分环节

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

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

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

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

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

参数整定找最佳,从小到大顺序查,
先是比例后积分,最后再把微分加,
曲线振荡很频繁,比例度盘要放大,
曲线漂浮绕大湾,比例度盘往小扳,
曲线偏离回复慢,积分时间往下降,
曲线波动周期长,积分时间再加长,
曲线振荡频率快,先把微分降下来,
动差大来波动慢,微分时间应加长,
理想曲线两个波,前高后低4比1,
一看二调多分析,调节质量不会低。

2.3 PID调参实例

接下来通过PID算法来进行电机的速度控制,该实例来自野火,这个案例我们不去关注代码实现,仅仅去参考这个PID参数整定的过程,我们希望通过这个案例能够学会PID参数整定的精髓。

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

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

2.3.1 先调节P

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

P I D
10 0 0

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

P I D
100 0 0

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

2.3.2 再调节I

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

P I D
100 0.2 0

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

P I D
100 1.0 0

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

P I D
100 3.0 0

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

P I D
100 6.0 0

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

2.3.3 最后调节D

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

P I D
100 6.0 3.0

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

P I D
100 6.0 6.0

三、PID算法离散化

3.1 框图

先看一下PID算法的一般形式:

通过以上框图不难看出,PID控制其实就是对偏差的控制过程;

  • 如果偏差为0,则比例环节不起作用,只有存在偏差时,比例环节才起作用;
  • 积分环节主要是用来消除静差,所谓静差,就是系统稳定后输出值和设定值之间的差值,积分环节实际上就是偏差累计的过程, 把累计的误差加到原有系统上以抵消系统造成的静差;
  • 而微分信号则反应了偏差信号的变化规律,也可以说是变化趋势,根据偏差信号的变化趋势来进行超前调节, 从而增加了系统的预知性。

我们从一个典型的连续时间PID控制器开始,其输出\(u(t)\) 由误差\(e(t)\)决定:

\[u(t)=K_pe(t) + {K_i}\int_{0}^{t}e(τ)dt+K_d\frac{de(t)}{dt} \]

其中:

  • \(K_p\):比例增益;
  • \(K_i\):积分增益;
  • \(K_d\):微分增益;
  • \(u(t)\)PID控制器的输出;
  • \(e(t)\):设定值\(r(t)\)与过程变量 \(y(t)\)之间的误差。

我们的目标是将这个连续的模拟控制器,转换为数字控制器(如微处理器)可以执行的数字算法。

3.2 离散化

3.2.1 采样

在数字系统中,我们无法连续地处理信号,而是以固定的时间间隔进行采样。我们定义:

  • \(T_s\):采样周期,例如0.1秒;
  • \(t=kT_s\):第\(k\)个采样时刻,其中\(k=0,1, 2,…\)

相应地,我们将连续信号离散化:

  • \(e(k)=e(kT_s)\):第k个采样时刻的误差值;
  • \(u(k)=u(kT_s)\):第k个采样时刻的控制输出;

现在,我们需要分别处理PID公式中的三项:比例项、积分项和微分项。

3.2.2 比例项(P项)离散化

比例项是最简单的,因为它不涉及时间的历史。它只依赖于当前时刻的误差。

连续形式:

\[P(t)=K_pe(t) \]

离散形式,我们只需将连续时间t替换为离散索引k

\[P(k)=K_pe(k) \]

3.2.3 积分项(I项)离散化

积分项是推导的关键。连续积分\(\int_{0}^{t}dτ\) 表示从时间0到当前时间t的误差曲线下的面积。

连续形式:

\[I(t)=K_i\int_{0}^{t}e(τ)dτ \]

在离散时间中,我们无法计算连续的积分。我们只能用一系列矩形的面积之和来近似这个连续的面积。这里我们介绍两种最常见的数值积分方法:

3.2.3.1 前向矩形法

这种方法使用前一个采样时刻的值来近似整个采样区间的函数值。

\(t=(k−1)T_s\)\(t=kT_s\)的积分面积近似为:

\[\int_{(k-1)T_s}^{kT_s}e(τ)dτ≈T_se(k-1) \]

因此,到第k步的总积分可以写为:

\[\int_{0}^{kT_s}e(τ)dτ≈T_s\sum_{i=1}^{k}e(i-1)=T_s\sum_{i=0}^{k-1}e(i) \]

所以,积分项的离散形式为:

\[I(k)=K_iT_s\sum_{i=0}^{k-1}e(i) \]

为了在程序中避免存储所有历史误差值,我们使用递推关系;

\[I(k)=K_iT_s\sum_{i=0}^{k-1}e(i) \]

\[I(k-1)=K_iT_s\sum_{i=0}^{k-2}e(i) \]

将两式相减:

\[I(k)-I(k-1)=K_iT_se(k-1) \]

所以:

\[I(k)=I(k-1) + K_iT_se(k-1) \]

因此我们可以得到:积分项是上一时刻的积分值加上\(K_iT_s\)乘以上一时刻的误差。

3.2.3.2 后向矩形法

这种方法使用当前采样时刻的值来近似整个采样区间的函数值。这是更常用、更稳定的方法。

\(t=(k−1)T_s\)\(t=kT_s\)的积分面积近似为:

\[\int_{(k-1)T_s}^{kT_s}e(τ)dτ≈T_se(k) \]

因此,到第k步的总积分可以写为:

\[\int_{0}^{kT_s}e(τ)dτ≈T_s\sum_{i=1}^{k}e(i) \]

所以,积分项的离散形式为:

\[I(k)=K_iT_s\sum_{i=1}^{k}e(i) \]

我们使用递推关系;

\[I(k)=K_iT_s\sum_{i=1}^{k}e(i) \]

\[I(k-1)=K_iT_s\sum_{i=1}^{k-1}e(i) \]

将两式相减:

\[I(k)-I(k-1)=K_iT_se(k) \]

所以:

\[I(k)=I(k-1) + K_iT_se(k) \]

因此我们可以得到:积分项是上一时刻的积分值加上\(K_iT_s\)乘以当前时刻的误差。

3.2.4 微分项(D项)离散化

微分项代表误差的变化率。在连续时间中,它是误差的导数。

连续形式:

\[D(t)=K_d\frac{de(t)}{dt} \]

在离散时间中,我们只能用差分来近似导数。最直接的方法是后向差分,它使用当前值和前一个值。

\[\frac{de(t)}{dt}≈\frac{e(k)-e(k-1)}{T_s} \]

这个近似的几何意义是计算通过点\(((k-1)T_s,e(k-1))\)和点\((kT_s, e(k))\)的直线的斜率。

因此,微分项的离散形式为:

\[D(t)=K_d\frac{e(k)-e(k-1)}{T_s} \]

因此我们可以得到:微分项是\(\frac{K_d}{T_s}\)乘以(当前误差 - 上一次误差)。

3.3 位置式/增量式PID

3.3.1 位置式PID算法

现在我们将离散化的三项组合起来。我们选择更常用的后向欧拉法用于积分项。

位置式PID公式:

\[u(k)=K_pe(k)+I(k)+D(k) \]

\[u(k)=K_pe(k)+K_iT_s\sum_{i=1}^{k}e(i)+\frac{K_d}{T_s}[e(k)-e(k-1)] \]

目前这种表达形式为位置式,也叫作全量式PID。然而,在实际的程序实现中,我们更倾向于使用递推形式,因为它逻辑清晰,并且自然地提供了积分项的记忆功能。

3.3.2 增量式PID算法

位置式PID直接计算控制量的绝对输出值\(u(k)\)。而增量式PID计算的是控制量的变化量\(Δu(k)=u(k)−u(k−1)\)。这在执行机构是步进电机等场合非常有用。

我们从位置式PID公式开始推导(使用后向欧拉法):

\[u(k)=K_pe(k)+K_iT_s\sum_{i=1}^{k}e(i)+ \frac{K_d}{T_s}[e(k)-e(k-1)] \]

写出\(k−1\)时刻的公式:

\[u(k-1)=K_pe(k-1)+K_iT_s\sum_{i=1}^{k-1}e(i)+ \frac{K_d}{T_s}[e(k-1)-e(k-2)] \]

现在,计算增量\(Δu(k)=u(k)−u(k−1)\)

\[Δu(k)=[K_pe(k)+K_iT_s\sum_{i=1}^{k}e(i)+ \frac{K_d}{T_s}[e(k)-e(k-1)]] - [K_pe(k-1)+K_iT_s\sum_{i=1}^{k-1}e(i)+ \frac{K_d}{T_s}[e(k-1)-e(k-2)]] \]

观察求和项:

\[K_iT_s\sum_{i=1}^{k}e(i)-K_iT_s\sum_{i=1}^{k-1}e(i)=K_iT_se(k) \]

将其代入上式:

\[Δu(k)=K_p[e(k)-e(k-1)]+K_iT_se(k)+\frac{K_d}{T_s}[e(k)-2e(k-1)+e(k-2)] \]

我们也可以将其写成系数形式:

\[Δu(k)=q_0e(k)+q_1e(k-1)+q_2e(k-2)] \]

其中:

  • \(q_0=K_p+K_iT_s+\frac{K_d}{Ts}\)
  • \(q_1=-K_p-2\frac{K_d}{T_s}\)
  • \(q_2=\frac{K_d}{T_s}\);

到此,增量式PID表达方式就推导完了,从公式可以看出增量式PID的输出与近三次的偏差有很大关系;需要注意的是我们推导的是对于上一次来说的调节量,也就是说当前的输出等于上一次加增加的调节量, 公式如下:

\[u(k)=u(k−1) + Δu(k) \]

3.4 算法实现

3.4.1 位置式PIDC语言伪代码
// PID控制器结构体,用于存储状态
typedef struct {
    float Kp, Ki, Kd;  // PID增益
    float Ts;          // 采样时间
    float integral;    // 积分项的记忆值 I(k-1)
    float prev_error;  // 上一次的误差 e(k-1)
    float out_max;     // 输出上限(抗积分饱和)
    float out_min;     // 输出下限(抗积分饱和)
} PIDController;

// PID计算函数
float PID_Compute(PIDController *pid, float setpoint, float measurement) {
    // 1. 计算当前误差
    float error = setpoint - measurement;

    // 2. 计算比例项
    float proportional = pid->Kp * error;

    // 3. 计算积分项 (使用后向欧拉法: I(k) = I(k-1) + Ki*Ts*e(k))
    pid->integral = pid->integral + pid->Ki * pid->Ts * error;
    // 【重要】这里需要加入抗积分饱和逻辑,限制integral的值,防止输出失控

    // 4. 计算微分项 (使用后向差分: D(k) = Kd*(e(k)-e(k-1))/Ts)
    float derivative = (pid->Kd / pid->Ts) * (error - pid->prev_error);

    // 5. 计算总输出
    float output = proportional + pid->integral + derivative;

    // 6. 输出限幅
    if (output > pid->out_max) output = pid->out_max;
    if (output < pid->out_min) output = pid->out_min;

    // 7. 更新状态,为下一次计算做准备
    pid->prev_error = error;

    return output;
}
3.4.2 增量式PIDC语言伪代码
typedef struct {
    float Kp, Ki, Kd;
    float Ts;
    float prev_error;      // e(k-1)
    float prev_error2;     // e(k-2)
    float out_max;
    float out_min;
    float output;          // 当前总输出 u(k)
} IncrementalPID;

float PID_Compute(IncrementalPID *pid, float setpoint, float measurement) {
    float error = setpoint - measurement;

    // 计算控制增量
    float delta_u = pid->Kp * (error - pid->prev_error)
                  + pid->Ki * pid->Ts * error
                  + (pid->Kd / pid->Ts) * (error - 2*pid->prev_error + pid->prev_error2);

    // 计算新的总输出
    pid->output = pid->output + delta_u;

    // 输出限幅
    if (pid->output > pid->out_max) pid->output = pid->out_max;
    if (pid->output < pid->out_min) pid->output = pid->out_min;

    // 更新误差历史
    pid->prev_error2 = pid->prev_error;
    pid->prev_error = error;

    return pid->output;
}

四、simulink仿真

在《基于直流有刷电机的开环调速控制以及matlab仿真》中我们介绍了基于IGBT的开环直流调速系统仿真,今天我们来介绍基于IGBT的转速单闭环直流调速系统仿真。

开环直流调速系统的启动电流大,转矩随负载变化而变化,负载越大,转速降落越大,因此无法在负载变动时保存转速的影响。

为了提高直流调速系统的动态性能指标,通常采用闭环控制系统(单闭环或双闭环);

  • 对调速指标要求不高的场合,采用单闭环系统;
  • 对调速指标要求高的场合,采用双闭环系统;

按反馈的方式不同,可分为转速反馈、电流反馈、电压反馈;在单闭环系统中,一般采用转速反馈。

4.1 原理

转速单闭环直流调速系统原理如图所示;

4.1.1 组成结构

闭环系统主要由以下部分组成:

  • 给定与反馈(比较环节):这是一个我们希望电机达到的目标速度,单位通常是rpm。在仿真中,它由一个Constant模块提供,比如设置为1500 rpm

    • 转速反馈值:这是一个从电机轴上测量到的实际速度值;

    • 误差计算:转速给定值与转速反馈值的差值;

      • e > 0:实际转速低于目标转速,系统需要加速;

      • e < 0:实际转速高于目标转速,系统需要减速;

      • e = 0:实际转速等于目标转速,系统达到理想稳态。

  • 转速调节器(大脑决策):转速调节器通常采用PI(比例-积分)控制器。它的输入是误差 e,输出是一个控制信号PWM发生器的占空比;

  • PWM发生器与IGBT全桥(执行机构);

  • 直流电机(控制对象);

  • 反馈环节(感知系统)。

4.1.2 闭环动态过程

假设给定转速从0变为1500 rpm,系统响应如下:

1)瞬间 (t=0+):误差 e = 1500 - 0 = 1500

2)PI调节器:接收到巨大的正误差,其输出PWM占空比D迅速增大至上限幅值;

3)PWMIGBT:由于PWM占空比 D 最大,电机获得最高电压 Vmotor ≈ Vdc

4)电机:在最高电压下,电枢电流 \(I_a\)和电磁转矩\(T\)达到最大,电机以最大能力恒转矩启动,转速快速上升;

5)反馈与调节:

  • 随着点击转速升高,误差e开始减小。
  • PI调节器看到e在减小,其输出PWM占空比D开始从饱和区退出并逐渐减小,Vmotor 降低;

6)接近稳态:当非常接近1500 rpm时,误差e变得很小;

  • 比例输出\(K_p*e\)很小;
  • 但积分输出\({K_i}\int_{0}^{t}e(τ)dt\) 已经累积到一个稳定值,这个值恰好等于克服负载转矩\(T_L\)和摩擦所需的电压;

7)稳态:误差 e = 0

  • 比例输出为 0
  • 积分输出维持在一个恒定值,使 Vmotor 稳定,电机匀速运行。

这个动态的、连续的检测-比较-计算-执行-反馈过程,就是闭环控制的精髓。它使系统能够抵抗负载扰动(如突然加负载导致转速下降,误差e会立刻为正,PI调节器增加输出以恢复转速)并精确跟踪给定指令。

4.2 Simulink仿真模型搭建步骤

4.2.1 直流电源

选择Simscape/Electrical/Specialized Power Systems/Sources中的直流电压源模块DC Voltage Source,双击在对话框中将直流电压设置为24V

4.2.2 IGBT全桥模块

然后在Simscape/Electrical/Specialized Power Systems/Power Electronics库中选择Universal Bridge模块;双击设置如下参数:

  • Number of bridge arms:指定了桥式电路的结构,设置为2,即两个桥臂,组成全桥电路;每个桥臂由一对上下开关器件(IGBT和反并联二极管)组成;
  • Snubber resistances Rs(0hms):这是与每个开关器件并联的缓冲电路的电阻值,设置为为1e5,默认值;
  • Power Electronic device:选择桥臂中使用的功率半导体器件类型,设置为IGBT/Diodes
  • Ron0hms):这是IGBT和二极管在导通状态下的理想导通电阻,1e-3,默认值;
  • Forward voltages:设定了IGBT和二极管导通时的门槛电压/导通阈值电压,[0 0]

img

4.2.3 直流电机模块

Simscape/Electrical/Specialized Power Systems/Electrical Machine选择直流电动机DC Machine

双击这个模型,打开它的参数设置窗口。首先配置configuration页:

  • preset model:这是设置直流电机型号的。这里我选择不使用内置型号,自己设置各个参数,即选择No
  • Mechanical input:选择Torque TL是设置成输入转矩TL
  • field type:当preset model选择了某种型号时是灰色的,无法修改,只有在上面的preset model选择了No之后才能选;
    • wound:可以理解成需要外接励磁回路;
    • permanent magnet:则是永磁体,简单理解成用两块磁铁放在那里,这里我们选择这个;选择类型为永磁体permanent magnet之后,这个电机的外观会有所变化。励磁回路的两个端子消失了,而出现了表示磁体的N、S。这个很容易理解,用了永磁体,就不需要外接电源来提供磁场了;

最终configuration页配置如下:

img

接着配置parameters页,这一页是设置电机参数的,除了initial speed(初速度,单位为rad/s)和initial field(初始磁场)两个参数外(最下面两行),其他参数只有在configuration页的preset model选择了No之后才能修改;

  • Armature resistance and inductance [Ra (ohms) La (H) ]:电枢回路电阻\(R_a\)设置为0.312,电枢回路电感\(L_a\)设置成0.006H
  • Torque constant (N.m/A):设置为0.01146;
  • Total inertia J (kg.m^2):电机转动惯量,这里我们设置为1e-4;由于\(T−T_L=J\frac{dΩ}{dt}\),因此J会影响电动机转速加速的快速;
  • Viscous friction coefficient Bm (N.m.s):粘滞摩擦系数;
  • Coulomb friction torque Tf (N.m):静摩擦转矩;
  • Initial speed (rad/s):设置为0

仿真时当成理想的电机算,没有摩擦,把BmTf都设置成0。最终parameters页配置如下:

img

4.2.4 转速给定信号

Simulink/Sources选择Constant,使用 Constant 模块设定目标转速(单位:rpm)。例如,设为 5000

4.2.5. 转速反馈环节

从直流电机模块的输出端获取电机的转速实际是角速度\(w\),单位为rad/s。使用 Simulink/Math Operations/Gain 模块,增益设置为 \(60/(2*pi)≈9.55\),将\(rad/s\)转换回rpm,以便与给定转速比较。

注意:为了模拟真实传感器并抑制高频噪声,可以添加一个 Transfer Fcn 模块作为低通滤波器,例如 \(\frac{1} {0.01*s + 1}\)

4.2.6 转速调节器

Simulink/Continuous选择PID Controller,通常使用PI(比例-积分)调节器;

  • 比例环节\(K_p\)提供快速响应;
  • 积分环节\(K_i\)消除静差。

初始参数整定(需根据系统动态调整):

  • Proportional (P): 从一个小值开始,如 0.01
  • Integral (I): 同样从小值开始,如 0.01

限幅至关重要!必须在PI调节器后添加一个 Saturation 模块,将其输出限制在[0, 100] 范围内。这个限幅值决定了PWM调制波的幅值,从而决定了IGBT桥的最大输出电压。

4.2.7 PWM发生器

将转速调节器的输出(模拟量)转换为驱动IGBT的脉冲信号;

实现方法:

1)载波:使用 Simulink/Sources/Repeating Sequence 模块生成一个高频三角波作为载波。频率应远高于系统响应频率。设置其时间向量为 [0 1/4/f 3/4/f 1/f]f 为开关频率,我们配置为10k Hz),幅值向量为 [0 -1 1 0]

2)比较器:

  • 对于双极性PWM,需要将调节器输出与三角载波进行比较;
  • 全桥需要四路驱动信号:调节器输出与三角载波比较生成两对互补的驱动信号;

这里我们封装一个子系统:

  • 包含一个输入:PWM的占空比,值区间在[0 100]
  • 包含一个复合输出信号:即Q1、Q2、Q3、Q4管的PWM控制信号;

PWM发生器子系统组成如下:

4.2.8 仿真模型

最后完成仿真模型如下图所示:

点击菜单栏的建模 -> 模型设置;

1)求解器:选择 ode23s (适用于电力电子这种刚性系统);

2)仿真时间:仿真参数的Start time设置为0Stop time设置为2s

3)最大步长:设置为开关周期的1/101/100,例如1e-5秒,以准确捕捉PWM细节;

4.2.9 调试

给定转速为5000,观察系统响应。

1)第一步:将I设为0,先整定P

  • 设置 I=0,完全关闭积分作用;
  • P从一个非常小的值开始,比如 0.01

这里P依次增大P,从0.01 -> 0.05 -> 0.1-> 0.2 -> 0.5-> 1-> 2-> 5 -> .......;

P增大到一定程度时,系统会开始转速出现临界振荡,即转速会在目标值上下做等幅振荡;

P 值 初始响应特征 稳定后转速 静差(5000 - 稳定值) 核心结论
0.1 0.2 秒内衰减振荡(最大 4700) 4300 700 转 P 过小,调节力不足,静差极大
1 0.2 秒内衰减振荡(最大 5100) 4930 70 转 P 偏小,静差仍大
10 0.2 秒内衰减振荡(最大 5200) 4993 7 转 P 适中,静差缩小
20 0.2 秒内衰减振荡(最大 5200) 4996 4 转 P 较优,静差小
40 0.2 秒内衰减振荡(最大 5200) 4998 2 转 P 最优,静差极小
100 0.2 秒内衰减振荡(最大 5200) 4999 1 转 P 偏激进,静差接近最小

首选P=40:偏差仅2,且P值相对温和,后续加入I参数后不易出现超调,抗干扰能力强(比如负载轻微波动时,转速不会剧烈变化);

将转速放大:

启动过程:

  • 启动初期,目标5000转与初始转速偏差大,P=40的输出驱动力让电机快速加速 —— 因电机响应快,转速瞬间冲过目标值(5200转,超调200转);
  • 超调后,偏差反向(转速 > 目标值),P的输出立即反向调节(相当于 “刹车”),但此时电机已有惯性,无法瞬间停住,只能通过 “振荡→逐步收敛” 来稳定,这是纯P控制在大惯性系统中的固有局限(不是P值没调好);

2)第二步:保持P不变,整定I

  • 保持上一步确定的最佳P值;
  • I从一个非常小的值开始,比如 0.1-> 0.2 -> 0.5-> 1-> 2-> 5 -> .......;
积分作用 系统响应特征 典型问题
I过大(作用过强) 快速消除偏差,但易超调、振荡(甚至发散) 转速冲到目标值以上(如 5002~5005),来回波动难以稳定
I过小(作用过弱) 偏差消除缓慢,甚至残留稳态偏差 转速长期停在 4998~4999,无法逼近 5000
I适中(作用匹配) 3~10 秒内逐步消除偏差,无明显超调 转速平稳上升至 5000 并保持,波动≤±1

通过不断的调试我们最终确定了P=40I=0.2

将转速放大:

此外:

  • 观察电枢电流是否在安全范围内,可以看到启动电流依然很大;
  • 对于电机启动瞬间转速的超调,我们可以尝试加入微分环节,以防止出现超调。\(K_d\)越大,微分作用越强,\(K_d\)越小,微分作用越弱。系统调试时通常把\(K_d\)从小往大调,具体参数由试验决定。
4.2.10 转速给定阶跃信号

Simulink/Sources选择Step,替换之前的Constant,阶跃时间设置为1,初始值为5000,终值为10000

仿真后输出波形:

参考文章

[1] 控制系统与电机的关系

[2] PID算法的通俗解说

[3] PID控制器参数整定

[5] 直流电机速度环控制实现

[6] PID 算法的原理与应用 (通俗易懂)

[7] 电力电子应用技术的MATLAB仿真 林飞、杜飞

[8] Un*、Id分别突变情况下单闭环直流调速系统仿真

[9] 转速单闭环直流调速系统实用PPT

[10] 电机控制进阶1——PID速度控制

posted @ 2025-11-22 22:02  大奥特曼打小怪兽  阅读(16)  评论(0)    收藏  举报
如果有任何技术小问题,欢迎大家交流沟通,共同进步