网上能搜索到的有关电力电子建模和控制器设计的资料说得都比较晦涩,里面似乎总是有些细节没有直接说出来,而且书本上又总是把建模和控制器设计分开讲解。因此本文从基本的Buck/Boost电路出发,记录一下我对建模与控制器设计的理解。

Buck电路

平均模型

平均值定义如下:
x(t)Ts=1Tstt+Tsx(τ)dτ
可以证明有以下特性:
dx(t)dtTs=1Tstt+Tsdx(τ)dτdτ=ddt[1Tstt+Tsx(τ)dτ]=dx(t)Tsdt

Ax(t)+By(t)Ts=Ax(t)Ts+By(t)Ts

理想化开关管,定义开关函数为
d(t)={1, t[t,t+ton)0, t[t+ton,t+Ts)
对Buck电路中的电感、电容和负载分别列出等式,那么Buck电路的时域模型就可以写作:
{uL(t)=d(t)vin(t)vo(t)=LdiL(t)dtic(t)=iL(t)io(t)=Cdvo(t)dtio(t)=vo(t)R
从Buck电路的时域模型可以直接得出Buck的平均模型:
{d(t)vin(t)vo(t)=LdiL(t)dtiL(t)=Cdvo(t)dt+io(t)io(t)=vo(t)R

进行拉氏变换后得到:

{DVin(s)Vo(s)=LsIL(s)IL(s)=CsVo(s)+Io(s)Io(s)=Vo(s)R

思考

拉式变换时公式中的D为常量,是把占空比当作常量来看待。实际电路中占空比一般是从0开始增长,最后才稳定到一个值。用这个模型进行控制器设计时,为什么可以把D当作常量?

我们难以分析这两个量同时变化的情况(非线性),注意两个变量相乘的拉氏变换结果会非常复杂,即L[f(t)g(t)]=12πjF(s)G(s),因此只能假定一个稳定,另一个变化。对于简单的Buck电路,这两个量无论那个变化,都对后面控制器的设计没有太大影响。对模型的理解应该灵活变化,如果我们关注的是稳态时的情况,就把占空比看成常数。如果关注暂态的情况,就把输入电压看成常数。大部分情况下,个人觉得应该把输入电压Vin(s)作为常量,而将占空比D写作D(s)作为模型的真正输入。

模型的输入到底是什么

在后面控制器设计的时候,我们的模型选取DVin作为模型输入。这很奇怪,我们在电路中控制器明明只能控制占空比,为什么可以选取这个作为模型输入呢?

数学模型的输入是什么并不是很重要。因为利用这个数学模型设计的控制器在实际使用的时候还需要加入一步调制,将控制器输出的量再转化为MCU实际能控制的量(PWM占空比),因此控制对象的输入是什么并不重要,可以是Vin,也可以是DVinPI输出数值上会趋近于这个值。工程上可以直接定义PI输出的含义,其含义由调制部分决定,当系统达到稳态时,PI输出数值上与我们定义的含义相等,但是暂态时其值并没有物理含义
假如设计的控制器输出数值为iL(t)d(t),也就是模型选取iL(t)d(t)作为输入,那么调制就是将这一输出除以iL,从而得到想要的d(t)占空比。
Boost模型尚且可以推导出以d作为输入的模型,但是后续的Boost平均模型,就无法得到。

模型的输入其实也很重要。因为输入不同,调制方式就不同,不同的调制精度不同。如果将Vin(s)作为模型输入,则模型内部必然含有D,实际上D是变化量,存在一个Vo=DVin的关系,因此模型的暂态过程精度是下降的,以及当我改变期望输出电压值却不改变模型中的D时,PI控制器稳态输出的数值大小发生变化。例如期望输出由Vo变为2Vo,但是不改变输入电压,PI稳态时的输出会由Vin变为2Vin,数值上比我的Vin大了。
如果将dvin都看作是变化的量,则d(t)vin(t)是一个非线性的量,我们对其进行拉式变换后,就无法进行控制器设计了,所有的分析几乎都基于线性这一前提。因此可以将这两个量提出,看成一个变量作为模型的输入,这样模型内部就不存在非线性量,更加符合线性的直觉。然后在进行调制时,控制器输出的意义是:d(t)vin(t),这时候我们读取输入侧电压,将控制器输出除以vin(t),即可得到占空比。

在后文中的Boost模型中就出现了多个(1D)常数,但无法像Buck模型一样简单地避免。可以认为,模型就是基于占空比为D(常数)这一工作状态建立的。如果实际占空比偏离这个设计的模型中的D越大,那么模型越不精确,越接近这个D,那么模型越精确。所以,建模只是一种初略的设计参数的手段,本质还是用线性近似去分析设计。

工程上设计的时候常常是在控制器达到稳态的时候进行扫环路,判断增益裕度与相位裕度是否达标。暂态过程是难以进行分析的,通常通过留足裕度来保证控制器能在模型存在扰动或者变化的时候将模型控稳。因此我们不用太关心未达到稳态时的模型。但是注意需要在不同负载下都对控制器进行测试。

控制器设计

不建议直接求解传递函数,因为不利于看到模型内部的细节,从而制定出合适的前馈。这里直接根据拉式变换得到的模型绘制出框图,如下。将输入Dvin(s)提出,从输入画到输出vo(s),把公式原汁原味地转换为框图。

buckbuck

对于这个模型,其传递函数是二阶的。如果在输入处引入vo前馈(电路一定会采集输出电压),那么模型就可以消除掉一个闭环,从而控制对象变为一阶对象。如下图所示红色线标记。此时设计电流环的控制器时,控制对象变为1Ls。设计电压外环时,由于内环带宽一般比外环大很多,电流环控制器控制速度很快,外环输出的iref经过电流环后输出的iL很快就达到iref,因此电流环可以忽略不计,在下图中电流环传函等效成1,对于电压环来说,其控制对象就变得简单了。

buck_ff_ctrl.drawiobuck_ff_ctrl.drawio

注意到框图中还有一个由1Cs1R构成的闭环,这个闭环是否也需要用io前馈去掉呢?实际上不需要,因为这个闭环本身就是一阶的。此外由于模型存在误差以及采样误差等原因,在实际电路中如果直接加入io前馈,效果可能会更加差。

利用这两个框图搭建好仿真,利用Simulink的PID(Z)模块(离散PID)和PID TUNE工具即可分别将内环外环设计为想要的带宽和相位裕度,然后直接将参数写入实际的MCU中。

由于数学模型的输入是Dvin(s),我们设计的PID控制器在加上前馈vo后,才能得到Dvin(s)。但是此时还没有得到我们需要的占空比,因此我们还要进行调制,将上一步输出的Dvin(s)除以采样电路中得到的vin,这样就得到了占空比d。

带宽和裕度的设计需要根据要求调整。如果需要动态响应好,那么带宽一般要大。通常会要求开环bode图增益曲线以-20dB/dec穿越0dB,这时候开环的穿越频率与闭环的截止频率(带宽)非常接近(真的吗?怎么证明?)。由于开环bode图容易绘制,因此多用开环bode图的穿越频率当作带宽来设计。

稳定的负反馈系统,开环系统的穿越频率和闭环系统的带宽很接近,存在wb>wc且有同向性。工程上近似时,时常把两者直接混用。
参考:(文库) 别让网文毁了你的环路分析

(1)相位裕度应大于45°。相位裕度越大,相应的超调量就越小。一般来说,工程应用中,相位裕度是45°~60°。
(2)为了防止幅频特性曲线以-40 dB/dec 穿越0 dB,引起电路相位快速变化,产生较大的超调,系统在穿越频率f处的斜率应为-20 dB/dec。
(3)为防止实际电路中系统参数的微小波动引起开环增益的剧烈变化,幅值裕度应大于 10 dB。另外,虽然较大的穿越频率术有助于系统获得更快的响应能力,但为获得无失真的输出信号,穿越频率还需满足fc<2fs。因而实际工程设计中,可取值为fs/6<f<fs/10
来源:准谐振改进型SEPIC变换器建模与分析(电源学报)

参考:开关电源穿越频率选取

开关频率与带宽的关系:开关电源的控制环截止频率和开关频率有什么关系? - future energy的回答 - 知乎
https://www.zhihu.com/question/29230624/answer/45084377

思考:现在新管子的出现,开关频率可以越来越高。如果离散控制器的控制频率是20K,开关频率是200K,那么电流环的控制器的截止频率取开关频率的1/10,即20K可以吗?
回答:不可以。控制器离散化会依赖一个采样时间Ts(这个时间是控制频率的倒数),离散化后至少频率满足f(0,12Ts],系统才不会出现混叠现象,其中12Ts是系统的奈奎斯特频率。混叠现象就是高于奈奎斯特频率的频率成分将被重构成低于奈奎斯特频率的信号。当出现混叠时,控制器读取到的高频信号频率下降并且幅值不正常,无法达到设计的目的。混叠解释:为什么不满足奈奎斯特采样定理就会出现混叠现象?混叠是由于傅里叶变换引入的吗? - 知乎 (zhihu.com)

离散控制器每计算一次相当于采样一次,可以用Simulink中的离散时间延迟模块对Sine源采样。当延迟模块的采样时间等于Sine信号(需要给相位)的频率的一半时,系统勉强可以采样出同频率的方波,一旦超过就无法正常采样了。此外也可以利用Matlab绘制一个离散系统的bode图,会发现有一根纵线,纵线横坐标对应离散系统的采样频率的一半,即奈奎斯特频率。

Boost电路

Boost电路比Buck电路的模型更加古怪,可以求解出Buck平均模型和小信号模型的D(s)Vo(s)的传递函数(上文中未给出),但是无法求解出Boost平均模型的。

平均模型

Boost电路的平均模型如下:
{vin(s)(1D)vo(s)=LsIL(s)(1D)IL(s)=Csvo(s)+vo(s)R

同样地可以绘制出框图。但是需要注意到,此时系统的模型框图中不可避免地出现(1D)了,并且(1D)vo黏在一起难舍难分。如果将D看作变量,那么这个模型属于非线性的大信号平均模型。由于vo(s)是输出,因此我们不能将其看作是常数,为了拉式变换以及实现线性化,只能将D看作常数。因此,D一旦固定下来,这个模型就是描述d(t)D的模型了。

小信号模型

我们在平均模型中将D视作常数相当于做了一次线性化操作。那么,还有另一种线性化的操作也非常常见,就是小信号建模。

小信号模型是一种建立在某一静态工作点附近对电路进行线性化分析的手段。电路工作状态距离这一静态工作点越远,模型偏差就越大。需要假设所有的大信号可以写成常数+小扰动的形式:

x(t)=X+x^(t)

将这个等式替换掉时域模型中的所有大信号,然后分离等式中的常量和扰动量,将两个小信号乘积忽略,从而将非线性项消去,因此小信号模型在推导中会得到两个部分,一部分是各个常量之间的关系,另一部分是交流量之间的关系,我们使用交流量之间的关系进行拉氏变换从而得到频域的小信号模型。以Boost时域模型的一部分为例:

(1d(t))vo(t)=d(t)vo(t)=(D+d^(t))(Vo+vo^(t))=DVo+Dvo^(t)+d^(t)Vo+d^(t)vo^(t)DVo+Dvo^(t)+d^(t)Vo(1D)Vo+(1D)vo^(t)Vod^(t)

解释:这一部分将1d(t)替换为d(t),然后再替换为常数+扰动的形式,即d(t)=D+d^(t)D=1D,但是d^(t)=d^(t)

Vin+vin^(t)(1D)Vo(1D)vo^(t)+Vod^(t)=Ld(IL+iL^(t))dt=0+LdiL^(t)dt{Vin(1D)Vo=0vin^(t)+d^(t)Vo(1D)vo^(t)=LdiL^(t)dt

解释:将等式两边的常数提出,交流小信号也提出,即可得到两个等式。

完整Boost变换器的小信号模型如下:
{vin^(s)+d^(s)Vo(1D)vo^(s)=LsiL^(s)(1D)iL^(s)d^(s)IL=Csvo^(s)+vo^(s)RIo=VoRIL=Io1DVo=Vi1D

一般在使用小信号模型的时候,将vin^(s)取0,即输入扰动为0,然后以d^(s)作为输入,vo^(s)作为输出。根据线性系统的叠加原理,如果存在输入扰动,vin^(s)扰动对vo^(s)的影响可以在d^(s)=0的情况下进行分析,然后叠加在一起就是完整的输出响应。

小信号模型之辩

网上能查询到的不少文献是直接利用Gvd(s)=vo^(s)d^(s)的传递函数作为控制对象来设计PI控制器参数的,并且直接混用小信号和大信号,即默认X^(s)=X(s),然后给定的参考量是常数VoGvd(s)的传函如下:

Gvd(s)=Vi(1D)21Ls(1D)2R1+Ls(1D)2R+LCs2(1D)2

如果直接将这个小信号模型输入大信号结果会输出什么?先看看其单位阶跃响应的稳态值:

lims0sGvd(s)1s=lims0Gvd(s)=Vi(1D)2=Vo1D

如果输入一个大信号D(常数),其输出显然不是我们期望的Vo,这与实际并不符合。如果你在仿真里面取D=0.5,会发现其输出又是所设计的Vo了,这是一个简单的小陷阱。

因此使用这个模型时还是要回归到其原本含义上,不要混用大信号和小信号。我们不能给一个大信号给小信号模型,然后期望小信号模型输出一个大信号,这个偏差是很大的。小信号的用途主要有两个,一个是进行扰动分析,另一个是用于控制器设计。这个模型反映的就是给定占空比扰动对输出电压的影响,可以搭建一个仿真模型仿真验证。

小信号模型可用来设计控制器吗?

这个视频中在讨论小信号模型的可用性上给出了解释:boost变换器的小信号模型的可用性分析。作者认为使用小信号模型并不能用于控制器的设计。但是我个人认为,小信号模型在一定程度上是可以用于控制器设计的,但是只能用于分析稳态时抵御扰动的能力。我们在设计控制器的时候基本上都是基于某一稳态工作点进行设计,小信号模型恰好就是在这一个稳态点进行推导的,因此其天然就可以用来描述系统的特性。

当使用小信号模型的时候,电压环的参考值其实是期望的电压扰动量值。如果这个期望值给太大超过可线性化范围(相对Vo本身来说),比如直接给定Vo,那么模型中各部分的输出与实际偏差会很大,虽然vo^(t)可能可以控到Vo,但是iL^(t)一定和实际电路中的扰动量大小不符。但又正是因为线性化,因此期望值变大多少倍输出也会放大多少倍,所以并不影响阶跃响应曲线瞬态的变化趋势。

以一般的双环PI控制器不加前馈为例进行说明:当没有前馈时,系统处于初始状态,控制器开始作用,直到系统达到稳态,此时电流环输出的变化量就可以看成一个D+d^(t),因为系统在微小变化范围内是可以看作线性的,因此满足叠加定理。这个固定的D经过系统后可输出常量Vo,变化的d^(t)经过系统可输出vo^(t),因此合并得到系统的总输出为Vo+vo^(t)。电压环的参考是VrefVo,反馈是Vo+vo^(t),因此做差后输入到电压环的就是0vo^(t),可以看成期望电压扰动为0。电压环在稳定时输出的量是Iref+iref^(t)IL+iref^(t),电流环的反馈量是IL+iL^(t),做差得到电流环输入是iref^(t)iL^(t)。至此完成闭环,和s域的小信号模型的控制器一一联系起来了。

根据线性叠加定理,其实可以把所有的常量和微小变化量抽离出来,这个微小变化量所处的系统就是我们的小信号模型系统。而所有的常量,其实是PI控制器控制过程中自动累加上去得到的,属于模型的静态工作点。我们设计控制器,就是为了降低模型中各种各样的扰动通道的影响,以及对抗模型自身参数变化造成的静态工作点偏移

这就是为什么基于小信号模型设计出来的双环PI放在实际电路仿真中也能用的原因,看上去直接混用了大小信号,实际上改变一下对PI输出的看法即可将小信号模型和实际稳态电路联系起来。不过写到这里,我总感觉PI能把系统从不稳定状态拉到一个稳态的状态有点玄学,或者说难以用数学建模进行跟踪。但是这一过程是非线性的,我目前的能力还只能在线性范围内蹦跶。

对比平均模型和小信号模型,其实平均模型包含了系统从0开始启动的过程,而小信号模型只是描述系统在某个工作点附近的扰动关系。使用小型化模型并不是太方便,一是因为在设计控制器的时候,小信号模型更加复杂,平均模型已经够用了。二是小信号模型中变量的物理意义是微小扰动。

如果要用小信号模型…

如果要用小信号模型进行控制器设计,我认为同样按照一般的设计思路来进行即可,只不过此时模型的各个变量含义都是小信号扰动。

在s域利用传递函数进行设计控制器的时候,电压环的参考值按道理来说应该是0,但是给0系统不会有任何响应,因为系统本就是稳定的。因此可以给一个相对于Vo来说较小的常数数值,然后就能得到阶跃响应了。阶跃响应能够反映一部分瞬态和稳态,更加重要的是看开环Bode图,然后按照基本的环路设计方案来进行。如果希望s域模型输出数值上和电路仿真模型中的一一对应,只需要给对应的小信号量加上它对应的常数值即可。但是这个s域的模型永远无法很精确地模拟出电路的启动过程,以及扰动巨大时的瞬态响应,因为这个模型本身就是对已经达到稳态的系统建模得到的。

考虑到小信号模型中PI输出(x(t))与实际电路中PI输出(X+x^(t))数值上不同,因此一定要注意限幅。另外加前馈时也要注意限幅值。加了前馈后电流环限幅值应该发生变化,否则可能会导致输出不一致。例如不加前馈,环路限幅是[0.01, 0.85],加了前馈后,环路限幅是[-0.85, 0.85],并且前馈后也应当加限幅。

下面也给出Boost电路的小信号模型。
boost_small_signalboost_small_signal

其中,红色的变量是输入,绿色的是输出。如果vo^(t)叠加上常量Vo,就得到了大信号vo(t)

d^(s)前移到模型最左侧,模型就以d^(s)为输入,以vo^(s)为输出了,然后vin^(s)就是模型中的扰动输入,在设计控制器时可以忽略,设计完毕后再将扰动通道开启,即可得到存在扰动情况下的输出。但是移动d^(s)后会产生微分,对仿真不友好。由于模型的输入是d^(t),因此这样设计的控制器没有调制这一步。