# 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 电压发生器,并新增输入端口以接收控制信号;在终端电阻上添加电压传感器模块,并通过新增的输出端口将输出电压信号引出;此外,引入可变电阻模块与随机数模块组合形成扰动源,以模拟负载波动对系统稳定性的影响。具体改造步骤如下:
首先,右击 SynchronousBuck 同步降压电路,选择复制模型。进入新模型设置界面后,为其命名(此处我们命名为 SynchronousBuck_new_1),接着在该界面的插入到下拉选项中选择 Buck_Contrl。单击确定后,新模型将自动打开,后续可在该模型中对 SynchronousBuck 电路进行改造。

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

在 TYElectrical 库内,分别搜索 VariableResistor(可变电阻器)、ControlledPWMVoltage(受控 PWM 电压发生器)、VoltageSensor(电压传感器);同时在 Modelica 库中,搜索 normalnoise(随机扰动)、RealInput(输入端口)、RealOutput(输出端口)。各组件对应的模型库路径如下表所示。
组件名 组件对应的模型库路径 VariableResistorTYElectrical.BasicComponents.ldealBasicComponents.VariableResistor ControlledPWMVoltageTYElectrical.DigitalComponents.GeneralCircuits.ControlledPWMVoltage VoltageSensorTYElectrical.Sensors.VoltageSensor normalnoiseModelica.Blocks.Noise.NormalNoise RealInputModelica.Blocks.Interfaces.Reallnput RealOutputModelica.Blocks.Interfaces.RealOutput 依次单击上面找到的六个组件,并按住鼠标左键,将它们拖拽至 SynchronousBuck_new_1 模型对应位置(如下图所示)。

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

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

# 构建简单控制环路
在改造完 Buck 电路被控对象模型后,在顶层构建一个简单控制环路。构建步骤如下:
右击 Buck ContrI (BUCK 电路控制案例),选择在 Buck Con...K 电路控制案例中新建 Sysblock 模型...。进入新的 Sysblock 模型设置环节,为其命名,此处我们设为 Buck_ctrl_1,并添加描述 buck 电路控制模型,单击确定后即可打开新的 Sysblock 模型。

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

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

设置 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;最后勾选参数列的三个选项框,即可将这三个参数声明为模型参数。

为了方便记录仿真时需要保存的信号,可在模型中右击信号线,勾选菜单中的记录所选信号功能来完成记录。菜单中的记录所选信号为可选按钮,勾选状态即表示该信号已被记录,此时信号线上方会显示
标记。关于此功能的详细使用说明,可参考链接:记录仿真时要保存的信号。此处记录的是 Saturation 组件的输出信号。
对 Buck_ctrl_1 模型进行仿真设置:双击打开 Buck_ctrl_1 模型,在软件界面上方功能区,单击主页>仿真设置按钮,打开仿真设置界面。在该界面设置四个参数,仿真步长设为 1e-06,仿真终止时间设为 0.003,积分算法的类型选为变步长,算法选为 Dassl (BDF,变阶,刚性)。

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

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

右击 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),即可在曲线窗口查看这些信号的仿真结果。
虽然信号曲线显示和数值都可以观测到,但是每次仿真结束后都需要在仿真浏览器中挑一遍略显繁琐,所以使用仿真-图表-曲线下拉框-保存曲线绘制功能进行结果数据的绘图布局保存。曲线绘图保存步骤:
在上方功能区单击仿真>曲线按钮,此时会打开一个新的曲线窗口,即 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 呈现为:

对每个子窗口进行如下操作:右击子窗口,选择属性,进而修改图例名称及布局,具体设置如下:子窗口 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 的设置示意图,以及所有设置完成后的整体效果示意图:

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

关闭所有结果窗口后,再次单击功能区仿真选项卡中的仿真按钮,待仿真结束,系统便会按照已保存的绘图布局自动完成绘制。
# 使用 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:
右击 Buck ContrI (BUCK 电路控制案例),选择在 Buck Con...K 电路控制案例中新建模型...。此时会弹出新建模型窗口,先进行命名(此处设为 buck_record_1),并添加描述 Buck 电路参数;接着选择类别为 record,完成所有设置后单击确定即可。

双击新建的 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间电容";
完成 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,优化思路如下:
比例环节(P):当前比例增益 P = 1,系统启动有明显超调,说明比例作用可适当减小,降低系统响应刚性,削弱超调趋势。可尝试 P = 0.7 − 0.9,平衡响应速度与超调量。
积分环节(I):积分 I = 0.1 下,曲线后期仍有小幅波动,说明积分对稳态误差的消除力不足,但积分过强易加剧超调。可适度增大积分,比如 I = 0.12 − 0.15,加强稳态修正能力,同时观察超调变化,若超调反弹则需微调。
微分环节(D):曲线有动态波动,可引入微分环节抑制震荡。微分能预判趋势、阻尼波动,可以先设 D = 0.0001 − 0.0003,利用其抗扰特性,辅助减少电压波动,让曲线更平滑收敛。
设置(P = 0.8,I = 0.2,D = 0.0001)后,曲线效果如图:
从曲线看,当前参数下系统有稳态误差(反馈电压略低于 12V),且启动阶段上升过程可优化,基于强化积分消稳态、微调比例增响应、适配微分稳震荡思路,可以对参数进一步优化,思路如下:
积分环节(I)— 主攻稳态误差:当前 I = 0.2 仍有稳态误差,说明积分对偏差的累积修正力不足。可适度增大 I,比如尝试 I = 0.3 ∼ 0.4。积分增强后,系统会更积极地利用历史偏差推动反馈电压向 12V 靠拢,逐步消除稳态差。但注意:积分过强可能让启动超调变大、调节时间延长,需配合观察曲线波动。
比例环节(P)— 配合提升响应:比例 P = 0.8 偏保守,可小幅增大 P (如 P = 0.9 ∼ 1.1。比例作用增强能加快系统响应速度,让电压更快逼近目标值,与强化后的积分协同,既加速又消稳态差。但 P 过大会放大扰动,若出现震荡,可通过微分或回退 P 调整。
微分环节(D)— 优化动态特性:当前 D = 0.0001 几乎无作用,若调整 P、I 后出现小幅震荡(或想提前抑制潜在波动),可适度增大 D,比如 D = 0.001 ∼ 0.005。微分能预判电压变化趋势,阻尼震荡,让曲线更平滑收敛到 12V;但 D 过强会让系统变迟钝,需精准拿捏。
调试逻辑(小步长迭代):(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)离散化,得到相应的离散传递函数,推导过程如下:
连续PID传递函数
连续域 PID 的标准形式为:
代入 PID 控制参数后得:
后向差分法离散化
根据后向差分法的离散化公式:
当采样周期 Ts = 1×10−6 秒时,代入可得:
离散化后的PID传递函数
逐项替换:
- 比例项:保持为 1
- 积分项:
- 微分项:
合并为统一分式
通分后整理得:
展开分子和分母得到最终函数
将分子分母同乘 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 控制模块的详细框图。
注意
- 在外部 CCaller 控制模块的框图界面里,CCaller 组件仅可添加一次。
- 顶层模型图中只能存在一个外部 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 语言文件导入模型的步骤如下:
双击 Buck_ctrl_ccaller 模块中的 CCaller 组件,打开设置界面。
在包含文件行的末尾,单击 ... 按钮以打开选择包含文件界面。在该界面中,双击
ectr_c文件夹进入,随后单击选中pid_controller.h文件,最后单击界面底部的打开按钮,即可将ectr_c文件夹中的pid_controller.h文件添加至包含文件列表中。再次在包含文件行的末尾,单击 ... 按钮以打开选择包含文件界面。在该界面中,双击
ectr_c文件夹进入,随后单击选中pid_controller.c文件,最后单击界面底部的打开按钮,即可将ectr_c文件夹中的pid_controller.c文件也添加至包含文件列表中。在包含文件行单击下拉框,选择 pid_controller.h。
在函数原型行单击下拉框,从选项中选择 float pid_controller(float error)。
完成上述设置后,单击确定按钮完成导入。
此外,还需要双击 ccaller 模块左侧的 typeConversion 组件,将输出数据类型设置为 float。
单击仿真,观察仿真结果,与 PID 控制器以及传递函数控制器结果保持一致:
