# Buck 电路控制仿真

# 引言

Buck 电路是一种常见的直流降压型开关电源,其基本功能是将较高的直流电压高效转换为较低的直流电压,广泛应用于手机充电器、电池管理系统、电机驱动器等场景中。其核心由功率开关管、电感、电容及续流二极管构成,通过高频率地控制开关元件的导通与关断,实现能量在电感与电容之间的传递和稳定输出。

在开关导通期间,输入电流通过电感向负载供电并储能;开关关断后,电感释放能量并通过二极管持续供电。通过调节开关的占空比 D,可精确控制输出电压,其电压转换关系满足 Vo = Vi × D。由于其结构简单、转换效率高(通常可达 80% ~ 95%),Buck 电路成为现代电源系统中的基础构成模块。

为了实现对输出电压的稳定控制,本案例基于 Sysplorer 平台,分别采用 PID 控制器、离散传递函数模型以及外部 ccaller 接口三种方式对 Buck 电路进行调节仿真,深入分析其在不同控制策略下的响应性能与稳定性。仿真结果将为后续硬件设计与控制算法部署提供有力支持。

单击右侧打开示例按钮,在 Sysplorer 中打开文件。

# 构建 Buck 电路控制对象

首先需要在库浏览器中添加 TYElectrical(基础电气模型库)。添加的步骤为:先单击库浏览器,再单击模型库,最后单击 TYElectrical

在 TYElectrical 库中搜索 SynchronousBuck 同步降压电路(其对应模型库路径为 TYElectrical.Examples.IntegrationExamples.SynchronousBuck),双击该电路模型即可打开示例模型。后续可在此基础上进行二次开发,将其作为 Buck 电路控制的被控对象。

# Buck 电路示例改造

为满足被控对象的接口要求,Buck 电路模型需具备输入与输出端口,并引入随机扰动源。具体修改包括:将原有的脉冲电压源替换为受控 PWM 电压发生器,并新增输入端口以接收控制信号;在终端电阻上添加电压传感器模块,并通过新增的输出端口将输出电压信号引出;此外,引入可变电阻模块与随机数模块组合形成扰动源,以模拟负载波动对系统稳定性的影响。具体改造步骤如下:

  1. 首先,右击 SynchronousBuck 同步降压电路,选择复制模型。进入新模型设置界面后,为其命名(此处我们命名为 SynchronousBuck_new_1),接着在该界面的插入到下拉选项中选择 Buck_Contrl。单击确定后,新模型将自动打开,后续可在该模型中对 SynchronousBuck 电路进行改造。

  2. 右击新模型中的 PulseVoltageGenerator 组件,将其从模型中删除。

  3. 在 TYElectrical 库内,分别搜索 VariableResistor(可变电阻器)、ControlledPWMVoltage(受控 PWM 电压发生器)、VoltageSensor(电压传感器);同时在 Modelica 库中,搜索 normalnoise(随机扰动)、RealInput(输入端口)、RealOutput(输出端口)。各组件对应的模型库路径如下表所示。

    组件名 组件对应的模型库路径
    VariableResistor TYElectrical.BasicComponents.ldealBasicComponents.VariableResistor
    ControlledPWMVoltage TYElectrical.DigitalComponents.GeneralCircuits.ControlledPWMVoltage
    VoltageSensor TYElectrical.Sensors.VoltageSensor
    normalnoise Modelica.Blocks.Noise.NormalNoise
    RealInput Modelica.Blocks.Interfaces.Reallnput
    RealOutput Modelica.Blocks.Interfaces.RealOutput
  4. 依次单击上面找到的六个组件,并按住鼠标左键,将它们拖拽至 SynchronousBuck_new_1 模型对应位置(如下图所示)。

  5. 右击 ControlledPWMVoltage 组件,选择编辑参数,将参数 ModelingOption 选择为物理信号,将参数 f 设置为 100000;再右击 normalnoise 组件,同样选择编辑参数,将参数 samplePeriod 设置为 1e-4,将参数 sigma 设置为 0.3。

  6. 最后再按图完成连线,改造后的 SynchronousBuck 同步降压电路(即所需 Buck 电路)便搭建完成。

# 构建简单控制环路

在改造完 Buck 电路被控对象模型后,在顶层构建一个简单控制环路。构建步骤如下:

  1. 右击 Buck ContrI (BUCK 电路控制案例),选择在 Buck Con...K 电路控制案例中新建 Sysblock 模型...。进入新的 Sysblock 模型设置环节,为其命名,此处我们设为 Buck_ctrl_1,并添加描述 buck 电路控制模型,单击确定后即可打开新的 Sysblock 模型。

  2. 接着进行新 Sysblock 模型的构建。在 Sysblock 库中,分别搜索 Inport 组件、Outport 组件、Sum 组件、DiscretePIDController 组件和 Saturation 组件(各组件模型库路径见下表)。

    组件名 组件对应的模型库路径
    Inport Sysblock.Port.Inport
    Outport Sysblock.Port.Outport
    Sum Sysblock.MathOperation.Sum
    DiscretePIDController Sysblock.Discrete.DiscretePIDController
    Saturation Sysblock.Discontinuities.Saturation
  3. 依次单击上面找到的五个组件,并按住鼠标左键,将这些组件拖拽到 Buck_ctrl_1 模型的对应位置(如下图所示),再依照图示完成连线,这样用于控制 buck 电路的简单 PID 控制模型就构建好了。注意输入端口有两个,为了加以区分,分别将这两个输入端口重命名为 V_ref 和 V_feedback。重命名组件的操作方法如下:先单击目标组件,此时组件下方会出现蓝色字体的默认名称,再次单击该蓝色字体,即可进入编辑状态,输入新名称完成重命名。

  4. 设置 Sum 组件和 Saturation 组件的参数:双击 Sum 组件,将其符号列表由 “++” 改为 “+-”;双击 Saturation 组件,将其上限设为 1、下限设为 0。

  5. 设置 DiscretePIDController 组件的参数:双击该组件,将比例 P 的值设为 PID_P,积分 I 的值设为 PID_I,微分 D 的值设为 PID_D。其中,PID_P、PID_I 和 PID_D 是 Buck_ctrl_1 模型的参数,其设置方法如下:在软件界面上方功能区单击建模>数据管理器按钮;在模型层次中找到并单击 Buck_ctrl_1(Buck ContrI),然后单击该数据管理器界面上方功能区的 选项 3 次,从而在Buck_ctrl_1 模型中添加 3 个参数,将其名称分别修改为 PID_P、PID_I 和 PID_D;最后勾选参数列的三个选项框,即可将这三个参数声明为模型参数。


  6. 为了方便记录仿真时需要保存的信号,可在模型中右击信号线,勾选菜单中的记录所选信号功能来完成记录。菜单中的记录所选信号为可选按钮,勾选状态即表示该信号已被记录,此时信号线上方会显示 标记。关于此功能的详细使用说明,可参考链接:记录仿真时要保存的信号。此处记录的是 Saturation 组件的输出信号。

  7. Buck_ctrl_1 模型进行仿真设置:双击打开 Buck_ctrl_1 模型,在软件界面上方功能区,单击主页>仿真设置按钮,打开仿真设置界面。在该界面设置四个参数,仿真步长设为 1e-06,仿真终止时间设为 0.003,积分算法的类型选为变步长,算法选为 Dassl (BDF,变阶,刚性)

  8. 右击 Buck ContrI (BUCK 电路控制案例),选择在 Buck Con...K 电路控制案例中新建模型...。进入新模型设置环节,将其命名为 top_model_1,添加描述顶层混合模型,单击确定后即可成功构建一个新的空模型。

  9. 双击 top_model_1(顶层混合模型) 将其打开,然后分别单击 Buck_ctrl_1 模型和 SynchronousBuck_new_1 模型,并按住鼠标左键将这两个模型拖到 top_model_1 里。此外,在 Modelica 库中搜索 Constant 组件(Constant 组件对应的模型库路径为 ConstantModelica.Blocks.Sources.Constant),单击 Constant 组件,并按住鼠标左键将这个组件也拖到 top_model_1 里。按照下图所示进行连线,这样一个简单的 Buck 电路控制环路就构建好了。

  10. 右击 top_model_1 中的 Constant 组件,选择编辑参数,将其参数值设为 12,以此模拟 12V 的目标电压。单击 top_model_1 中的 buck_ctrl_1_1 组件,初步将 PID_P 设为 1、PID_I 设为 0.1、PID_D 设为 0(后续会详细分析 PID 控制的参数调优,单击跳转到 PID 参数调优部分)。基于 PID 控制策略,利用目标电压与实际电压的偏差,可实现对 buck 电路占空比的控制。

# 仿真结果数据的绘图布局

首先对 top_model_1 模型进行仿真设置:双击打开 top_model_1 模型,在软件界面上方功能区,单击主页>仿真设置按钮,打开仿真设置界面。在该界面设置四个参数,仿真步长设为 1e-06,仿真终止时间设为 0.003,积分算法的类型选为变步长,算法选为 Dassl (BDF,变阶,刚性)

完成仿真设置后,再次在软件界面上方功能区单击主页>仿真按钮,等待仿真结束。正常情况下结果查看器界面会自动打开(如果该界面没有自动打开,则在软件界面上方功能区,单击主页>结果查看器按钮查看仿真结果)。进入结果查看器界面后,在上方功能区单击仿真>曲线按钮,打开曲线窗口(首次打开时默认名称为 y(t) 曲线窗口 - 1),接着在仿真浏览器中勾选关键信号(包括 SynchronousBuck_new_1 模型对应的 VariableResistor 的 R 值、buck_ctrl_1 模型对应的 V_feedback、outport、V_ref),即可在曲线窗口查看这些信号的仿真结果。

虽然信号曲线显示和数值都可以观测到,但是每次仿真结束后都需要在仿真浏览器中挑一遍略显繁琐,所以使用仿真-图表-曲线下拉框-保存曲线绘制功能进行结果数据的绘图布局保存。曲线绘图保存步骤:

  1. 在上方功能区单击仿真>曲线按钮,此时会打开一个新的曲线窗口,即 y(t) 曲线窗口 - 2。随后,在上方功能区单击图表>添加子窗口按钮,单击该按钮旁的下拉键,选择 Plot 3×1,即可将新的曲线窗口划分为 3×1 布局的三个子窗口。接下来需为三个子窗口分别设置显示内容:单击子窗口 1,在仿真浏览器中勾选 buck_ctrl_1 模型所对应的 outport;单击子窗口 2,在仿真浏览器中勾选 buck_ctrl_1 模型所对应的 V_feedback 和 V_ref;单击子窗口 3,在仿真浏览器中勾选 SynchronousBuck_new_1 模型所对应的 VariableResistor 的 R 值 。完成上述操作后,y(t) 曲线窗口 - 2 呈现为:

  2. 对每个子窗口进行如下操作:右击子窗口,选择属性,进而修改图例名称及布局,具体设置如下:子窗口 1 需将 buck_ctrl_1_1.outport 对应的图例名称设为 PWM 占空比输出【0-1】,子窗口 2 需将 buck_ctrl_1_1.V_ref 对应的图例名称设为期望电压值 (12V)、将 buck_ctrl_1_1.V_feedback 对应的图例名称设为反馈电压 (V),子窗口 3 则需将 synchronousBuck_new_1_1.variableResistor.R [Ohm] 对应的图例名称设为扰动电阻值 [Ohm]。同时,三个子窗口的布局均需选择为嵌入-上边。以下分别为子窗口 1 的设置示意图,以及所有设置完成后的整体效果示意图:

  3. 在结果查看器界面的仿真>曲线下方的下拉按钮,找到并选择保存曲线绘制功能;接着,若为新建操作,需单击新建命令前的单选按钮并为其命名,若为后续修改操作,则单击覆盖命令前的单选按钮;随后在自动运行时机选项中选择仿真后,再勾选需要保存的曲线窗口(此处选择曲线窗口 2);最后单击确定,即可完成曲线保存的设置。

  4. 关闭所有结果窗口后,再次单击功能区仿真选项卡中的仿真按钮,待仿真结束,系统便会按照已保存的绘图布局自动完成绘制。

# 使用 record 控制 Buck 参数

# record 介绍

record 关键字用于定义记录,这些记录通常用于变量分组。该定义或其任何组成部分只允许使用公共部分(即不允许使用方程、算法、初始方程、初始算法和保护部分),不能用于连接。记录的元素可能没有前缀输入、输出、内部、外部或流。通过隐式可用的记录构造函数进行增强。此外,根据常规的类型兼容性规则,记录组件可以用作表达式和赋值左侧的组件引用。

record 关键字的使用说明的链接:record

# 基于电路模型参数构建 record

改造后的 Buck 电路模型(即 SynchronousBuck_new_1 模型),其图形版界面与文本版界面如下所示(若需切换这两种界面,可在软件界面上方功能区的主页选项卡中进行选择):

观察改造后的 Buck 电路模型,顶层定义了 7 个参数:

parameter Modelica.SIunits.Frequency f = 50e3 "MOSFET信号频率";
parameter Real D = 0.5 "占空比";
parameter Modelica.SIunits.Voltage Vth = 2 "阈值电压";
parameter Modelica.SIunits.Resistance R1 = 5 "MOSFET1输入电阻";
parameter Modelica.SIunits.Resistance R2 = 20 "MOSFET2输入电阻";
parameter Modelica.SIunits.Capacitance Cgd = 80e-12 "MOSFET的gd间电容";
parameter Modelica.SIunits.Capacitance Cgs = 270e-12 "MOSFET的gs间电容";

其中 f 和 D 因为模型改造后不再使用,所以按如下步骤构建 record:

  1. 右击 Buck ContrI (BUCK 电路控制案例),选择在 Buck Con...K 电路控制案例中新建模型...。此时会弹出新建模型窗口,先进行命名(此处设为 buck_record_1),并添加描述 Buck 电路参数;接着选择类别为 record,完成所有设置后单击确定即可。

  2. 双击新建的 record 将其打开(注意需切换至文本版界面:先单击主页>文本按钮),随后复制粘贴需要定义的参数即可。

    parameter Modelica.SIunits.Voltage Vth = 2 "阈值电压";
    parameter Modelica.SIunits.Resistance R1 = 5 "MOSFET1输入电阻";
    parameter Modelica.SIunits.Resistance R2 = 20 "MOSFET2输入电阻";
    parameter Modelica.SIunits.Capacitance Cgd = 80e-12 "MOSFET的gd间电容";
    parameter Modelica.SIunits.Capacitance Cgs = 270e-12 "MOSFET的gs间电容";
    
  3. 完成 record 创建。

# 使用 record 控制 Buck 电路参数

使用 record 组件的操作极为简便,只需将用户模型中的 record 组件拖拽至 Buck 电路(即 SynchronousBuck_new_1 模型)即可。为便于与原 SynchronousBuck_new_1 模型进行对比,建议通过复制该模型来处理添加 record 组件后的情况,具体操作步骤如下:右击 SynchronousBuck_new_1 (同步降压电路),选择复制模型,进入新模型设置界面后,为其命名(此处命名为 SynchronousBuck_new_record_1),并添加描述同步降压电路加 record,单击确定后,新模型将自动打开,此时单击 buck_record_1 (Buck 电路参数) 组件,并按住鼠标左键将其拖入该新模型即可(注意在新模型中 buck_record_1 的实际名称为 buck_record_1_1)。

但是 record 中定义的参数与原本模型中参数存在冲突,所以需要对原本的参数进行修改,替换为 record 变量。具体操作步骤如下:双击 SynchronousBuck_new_record_1(同步降压电路加 record) 以打开该模型。在软件界面上方的功能区中,单击主页>文本按钮,即可查看模型的文本版本。在文本编辑状态下,保留模型中原有的变量声明部分,直接将变量的赋值内容修改为 buck_record_1 中的对应内容:

// 原代码
// parameter Modelica.SIunits.Voltage Vth = 2 "阈值电压";
// parameter Modelica.SIunits.Resistance R1 = 5 "MOSFET1输入电阻";
// parameter Modelica.SIunits.Resistance R2 = 20 "MOSFET2输入电阻";
// parameter Modelica.SIunits.Capacitance Cgd = 80e-12 "MOSFET的gd间电容";
// parameter Modelica.SIunits.Capacitance Cgs = 270e-12 "MOSFET的gs间电容";
// 保留模型变量声明,直接将变量赋值修改为 buck_record_1 中的内容
// 注意 buck_record_1_1 为 buck_record_1 在该 SynchronousBuck_new_record_1 模型中的实际名称
parameter Modelica.SIunits.Voltage Vth = buck_record_1_1.Vth "阈值电压";
parameter Modelica.SIunits.Resistance R1 = buck_record_1_1.R1 "MOSFET1输入电阻";
parameter Modelica.SIunits.Resistance R2 = buck_record_1_1.R2 "MOSFET2输入电阻";
parameter Modelica.SIunits.Capacitance Cgd = buck_record_1_1.Cgd "MOSFET的gd间电容";
parameter Modelica.SIunits.Capacitance Cgs = buck_record_1_1.Cgs "MOSFET的gs间电容";

修改完 SynchronousBuck_new_record_1 电路模型后回到顶层模型 top_model_1。在顶层模型中原有 Buck 电路控制环路的基础上再构建一个新的 Buck 电路控制环路。分别单击 Buck_ctrl_1 模型和 SynchronousBuck_new_record_1 模型,并按住鼠标左键将这两个模型拖到 top_model_1 里。此外,在 Modelica 库中搜索 Constant 组件(Constant 组件对应的模型库路径为 ConstantModelica.Blocks.Sources.Constant),单击 Constant 组件,并按住鼠标左键将这个组件也拖到 top_model_1 里,同时设置该组件的参数值为 12。按照下图所示进行连线,这样一个新的 Buck 电路控制环路就构建好了。

此时,如果需要修改 SynchronousBuck_new_record_1 电路模型中的相关参数,例如两个 MOSFET 输入电阻以及阈值电压时,可以通过修改 buck_record_1 组件中参数数值来控制 SynchronousBuck_new_record_1 电路的参数。无需再点开 SynchronousBuck_new_record_1 电路模型再选中组件后再修改模型参数。

这里再将 dCVoltageSource 组件产生的电源电压添加到 record 中进行统一管理。具体操作步骤为:先在 buck_record_1 组件中添加一行代码parameter Modelica.SIunits.Voltage Vdc = 30 "电源电压";,然后右击 SynchronousBuck_new_record_1 电路模型中的 dCVoltageSource 组件,选择编辑参数,将默认的参数值 30 改为 buck_record_1_1.Vdc。

通过 buck_record_1 组件将 SynchronousBuck_new_record_1 模块的电源电压修改为 40V(修改的步骤为:先双击打开 buck_record_1 组件,接着单击主页>文本按钮以将组件切换为文本版界面,最后将 parameter Modelica.SIunits.Voltage Vdc = 30 这一行中的 “30” 改为 “40”),同时保持 SynchronousBuck_new_1 模块的电源电压为 30V。之后,双击打开 top_model_1 模块,在软件界面上方功能区单击主页>仿真按钮,然后等待仿真完成。仿真结束后,正常情况下结果查看器界面会自动打开(如果该界面没有自动打开,则在软件界面上方功能区,单击主页>结果查看器按钮查看仿真结果)。进入结果查看器界面后,单击上方功能区的仿真>曲线按钮,打开新的曲线窗口。随后,在仿真浏览器中勾选关键信号,包括与 SynchronousBuck_new_1 (电源电压 30V)对应的 buck_ctrl_1 模型的 V_feedback、V_ref,以及与 SynchronousBuck_new_record_1(电源电压 40V) 对应的 buck_ctrl_2 模型的 V_feedback,即可在曲线窗口查看这些信号的仿真结果。这些仿真结果验证了通过 buck_record_1 组件修改 SynchronousBuck_new_record_1 模块参数的有效性。

# PID 控制

当 Buck 电路的控制策略为 PID 控制时,其顶层模型图及 PID 控制模块的详细框图如下:

在 PID 控制中,P 表示比例环节、I 表示积分环节、D 表示微分环节。首先使用 PI 控制进行测试,设置 P = 1,I = 0.1,仿真结果如下:

从图中电压反馈曲线看,系统启动有超调,后续存在小幅波动,结合当前 P = 1、I = 0.1,优化思路如下:

  1. 比例环节(P):当前比例增益 P = 1,系统启动有明显超调,说明比例作用可适当减小,降低系统响应刚性,削弱超调趋势。可尝试 P = 0.7 − 0.9,平衡响应速度与超调量。

  2. 积分环节(I):积分 I = 0.1 下,曲线后期仍有小幅波动,说明积分对稳态误差的消除力不足,但积分过强易加剧超调。可适度增大积分,比如 I = 0.12 − 0.15,加强稳态修正能力,同时观察超调变化,若超调反弹则需微调。

  3. 微分环节(D):曲线有动态波动,可引入微分环节抑制震荡。微分能预判趋势、阻尼波动,可以先设 D = 0.0001 − 0.0003,利用其抗扰特性,辅助减少电压波动,让曲线更平滑收敛。

设置(P = 0.8,I = 0.2,D = 0.0001)后,曲线效果如图:

从曲线看,当前参数下系统有稳态误差(反馈电压略低于 12V),且启动阶段上升过程可优化,基于强化积分消稳态、微调比例增响应、适配微分稳震荡思路,可以对参数进一步优化,思路如下:

  1. 积分环节(I)— 主攻稳态误差:当前 I = 0.2 仍有稳态误差,说明积分对偏差的累积修正力不足。可适度增大 I,比如尝试 I = 0.3 ∼ 0.4。积分增强后,系统会更积极地利用历史偏差推动反馈电压向 12V 靠拢,逐步消除稳态差。但注意:积分过强可能让启动超调变大、调节时间延长,需配合观察曲线波动。

  2. 比例环节(P)— 配合提升响应:比例 P = 0.8 偏保守,可小幅增大 P (如 P = 0.9 ∼ 1.1。比例作用增强能加快系统响应速度,让电压更快逼近目标值,与强化后的积分协同,既加速又消稳态差。但 P 过大会放大扰动,若出现震荡,可通过微分或回退 P 调整。

  3. 微分环节(D)— 优化动态特性:当前 D = 0.0001 几乎无作用,若调整 P、I 后出现小幅震荡(或想提前抑制潜在波动),可适度增大 D,比如 D = 0.001 ∼ 0.005。微分能预判电压变化趋势,阻尼震荡,让曲线更平滑收敛到 12V;但 D 过强会让系统变迟钝,需精准拿捏。

  4. 调试逻辑(小步长迭代):(1)单变量调 I:固定 P = 0.8、D = 0.0001,逐步加 I(每次 + 0.05),直到稳态误差明显缩小,记录此时 I。(2)再联动调 P:基于新 I,微调 P(± 0.1),观察响应速度和超调,找快且稳的平衡点。(3)最后补 D:若有震荡,从 D = 0.0001 开始试,逐步加直到波动收敛,同时确保不拖慢响应。

最终调节参数(P = 1,I = 200,D = 0.0001)后,曲线效果:

# 离散传递函数控制

当 Buck 电路采用离散传递函数控制策略时,与直接 PID 控制的区别在于,需将 DiscretePIDController 组件替换为 DiscreteTransferFcn 组件。该组件的模型库路径为:Sysblock.Discrete.DiscreteTransferFcn,使用时需配置传递函数的分子项与分母项,相关参数的详细推导过程已在本节中说明。以下分别为离散传递函数控制时的顶层模型图,以及离散传递函数控制模块的详细框图:

基于上面的 PID 控制得到的参数结果(P = 1,I = 200,D = 0.0001),使用后向差分法(Backward Euler)离散化,得到相应的离散传递函数,推导过程如下:

  1. 连续PID传递函数

    连续域 PID 的标准形式为:

    代入 PID 控制参数后得:

  2. 后向差分法离散化

    根据后向差分法的离散化公式:

    当采样周期 Ts = 1×10−6 秒时,代入可得:

  3. 离散化后的PID传递函数

    逐项替换:

    • 比例项:保持为 1
    • 积分项:
    • 微分项:
  4. 合并为统一分式

    通分后整理得:

  5. 展开分子和分母得到最终函数

    将分子分母同乘 z2,化为多项式形式:

    分子分母系数如下:

    • 分子系数为: 101.0002z2 − 201.0001z + 100

    • 分母系数为: z2 - z

双击 Buck_ctrl_TransferFcn 模块中的 discreteTransferFcn 组件,打开参数设置界面,将分子分母系数填入到相应位置:

通过仿真验证离散传递函数控制的最终控制效果:

# 外部 CCaller 控制

CCaller 模块是用于在框图建模环境与 C 语言编写的代码之间建立接口的系统模块。 其主要功能是提供一种可靠的机制,使得框图建模能够调用 C 语言编写的函数,进行高效的数据交换、计算处理和任务执行。通过 CCaller 模块,框图建模可以轻松地与 C 语言代码进行互动,借助 C 语言的高效计算能力,提升框图建模能力。

CCaller 模块的使用说明的链接:CCaller

当 Buck 电路采用外部 CCaller 控制策略时,与直接 PID 控制的核心差异在于:需要把 DiscretePIDController 组件替换成 CCaller 组件,并且要添加两个 typeConversion 组件。CCaller 组件在模型库中的路径是 Sysblock.Utilities.CCaller;typeConversion 组件的模型库路径为 Sysblock.MathOperation.Typeconversion。使用过程中,要对相关的 C 语言文件进行配置,本节已对具体的文件内容和配置流程做了详细阐述。下面分别展示采用外部 CCaller 控制时的顶层模型图以及外部 CCaller 控制模块的详细框图。

注意

  1. 在外部 CCaller 控制模块的框图界面里,CCaller 组件仅可添加一次。
  2. 顶层模型图中只能存在一个外部 CCaller 控制模块的框图,不能将该模块框图多次拖入 top_model 中。

该 CCaller 控制模块以偏差值作为输入信号,经过内部处理后输出相应的控制量。模块在运行过程中,调用了两个重要的 C 语言文件:pid_controller.h 和 pid_controller.c。其中,pid_controller.h 头文件主要用于定义 PID 参数的宏定义,并声明相关函数原型,为程序提供统一的参数接口和函数调用规范;而 pid_controller.c 源文件则负责实现具体的 PID 控制算法,通过严谨的代码逻辑将输入的偏差值转化为合理的控制量,从而保障 CCaller 控制模块功能的有效实现。

pid_controller.h 文件的代码如下:

#ifndef PID_CONTROLLER_H
#define PID_CONTROLLER_H

// PID控制器参数
#define KP 1.0f
#define KI 200.0f
#define KD 0.0001f
#define TS 0.000001f // 1e-6

// 函数声明
float pid_controller(float error);

#endif // PID_CONTROLLER_H    

pid_controller.c 文件的代码如下:

#include "pid_controller.h"

// 静态变量保存PID控制器状态
static float integral = 0.0f;
static float prev_error = 0.0f;

float pid_controller(float error) {
    // 计算积分项
    integral += error * TS;
    
    // 计算微分项
    float derivative = (error - prev_error) / TS;
    
    // 计算PID输出
    float output = KP * error + KI * integral + KD * derivative;
    
    // 保存当前误差用于下一次计算
    prev_error = error;
    
    return output;
}      

使用 CCaller 将这两个 C 语言文件导入模型的步骤如下:

  1. 双击 Buck_ctrl_ccaller 模块中的 CCaller 组件,打开设置界面。

  2. 包含文件行的末尾,单击 ... 按钮以打开选择包含文件界面。在该界面中,双击ectr_c文件夹进入,随后单击选中pid_controller.h文件,最后单击界面底部的打开按钮,即可将ectr_c文件夹中的pid_controller.h文件添加至包含文件列表中。

  3. 再次在包含文件行的末尾,单击 ... 按钮以打开选择包含文件界面。在该界面中,双击ectr_c文件夹进入,随后单击选中pid_controller.c文件,最后单击界面底部的打开按钮,即可将ectr_c文件夹中的pid_controller.c文件也添加至包含文件列表中。

  4. 包含文件行单击下拉框,选择 pid_controller.h

  5. 函数原型行单击下拉框,从选项中选择 float pid_controller(float error)

  6. 完成上述设置后,单击确定按钮完成导入。

此外,还需要双击 ccaller 模块左侧的 typeConversion 组件,将输出数据类型设置为 float。

单击仿真,观察仿真结果,与 PID 控制器以及传递函数控制器结果保持一致: