“它不仅包括功率级的设计,还包括控件的开发,这些控件通常在微控制器上实现。很少有开发人员在所有学科上都具备同样的技能,能够以同样高的质量水平设计系统的每个部分。像我一样的电气工程师通常不是受过教育的软件开发人员。在学习期间,他们中的大多数人都用C或脚本语言开发过小型程序,但只有少数人参与过大型软件项目并学会遵循结构化编程的原则。
”
它不仅包括功率级的设计,还包括控件的开发,这些控件通常在微控制器上实现。很少有开发人员在所有学科上都具备同样的技能,能够以同样高的质量水平设计系统的每个部分。像我一样的电气工程师通常不是受过教育的软件开发人员。在学习期间,他们中的大多数人都用C或脚本语言开发过小型程序,但只有少数人参与过大型软件项目并学会遵循结构化编程的原则。
然而,在工作中,电气工程师经常被分配对嵌入式微控制器进行编程的任务,这是有充分理由的:他们在如何控制电力电子电路方面拥有经验,并且了解整个系统的要求。此外,他们对微控制器的片上外设(例如 PWM 发生器和模数转换器 (ADC))有很好的了解。不利的一面是,对于典型的电气工程师来说,当代码编译没有错误、系统按预期运行以及所有测试都通过时,产品开发就完成了。特别是在当今上市时间较短的压力下,几乎没有内在动力去编写可在产品的整个生命周期内重用和维护的代码。
因此,手写的代码库通常缺乏模块化、清晰的结构和适当的文档。因此,对于外部人员来说,从代码中找出它执行的功能变得很困难。即使是控制代码的作者自己,在几年后重新审视自己的代码时也可能会摸不着头脑,想知道他们在编写代码时的想法是什么。这就是为什么我们应该支持电气工程师所擅长的领域,即电子和控制设计,并将软件架构和实现留给经验丰富的软件开发人员或自动生成代码的计算机程序。
将控件建模为框图
绘制控制系统自然的方法是表示信号流的框图。他们以清晰易懂的方式可视化底层控制概念。属于在一起的功能单元可以封装在子系统中,以隐藏复杂性并创建层次结构。大多数控制系统仿真软件都是基于框图,这并不奇怪。
虽然仿真软件 PLECS 主要是为了加速电力电子电路的仿真而开发的,但它还为控制系统的设计提供了广泛的信号处理模块集合。PLECS 库包括连续和离散传递函数、不连续和非线性模块以及坐标变换、锁相环 (PLL) 和 PID 控制器等电力电子应用经常需要的元件。作为示例,图 1 显示了太阳能逆变器中使用的电流控制器的框图。
图 1. 具有谐振积分器和抗复位饱和的电流控制器
与类似工具一样,PLECS 中设计的框图可以转换为等效的 C 代码。图 2 显示了 PLECS 为图 1 中的控制器生成的代码的摘录。生成的代码可以在不同的目标系统(例如微控制器)上编译和执行。从框图模型自动生成控制代码,而不是仅仅使用模型进行离线仿真并手动实现代码,具有一些显着的优点:
控制工程师可以专注于功能而不是其实现。
不需要经验丰富的嵌入式软件开发人员。
即使在开发过程的后期也可以对模型进行更改。
该模型本质上提供了清晰且的文档。
模型及其实现始终保持同步
我不想隐藏这样一个事实:使用模型作为定义控制代码的基础也有一些缺点:
该模型必须包含有关数据类型、采样率和执行任务的额外信息。
在处理框图时,用于跟踪更改的 Diff 工具仍处于起步阶段。
用户放弃了对实现细节和低级优化的控制。
并非所有低级功能都可以通过模型组件获得。
尽管自动代码生成有很多好处,但只有从一开始就加速和简化开发过程,它才会被接受。然而,节省的时间很大程度上取决于所使用的工具链。在 Plexim,我们付出了巨大的努力,使使用 PLECS 和 PLECS Coder 的嵌入式代码生成成为一种简单直观的体验。
访问 I/O 外设
当开始微控制器项目时,令人头疼的通常不是控制算法本身的实现,而是配置和访问微控制器的 I/O 外设。在开始在中断驱动的控制环路内生成 PWM 并获取 ADC 读数之前,您需要学习 1000 多页的技术手册。新手不仅要应对如此陡峭的学习曲线。即使您已经了解某个微控制器系列的详细信息,在处理另一家制造商的微控制器时,您可能需要几乎从头开始。尽管竞争制造商的微控制器可能提供类似的外设,但命名约定和实现细节可能截然不同。
图 2. PLECS 生成的控制器 C 代码片段
对于涉及自动代码生成的高效工作流程,仅将控制算法的目标无关部分从框图转换为 C 代码并将生成的代码导入特定于目标的软件项目是不够的。这种方法仍然需要用户编写和维护粘合代码来寻址特定于目标的外设,这是一项手动且容易出错的任务。如果需要具有一步代码生成功能的全自动工作流程,则有关目标外设的所有信息都必须包含在模型中。外设可以在模型中由在仿真期间充当信号源或接收器的各个模块来表示。在代码生成过程中,这些模块可以将特定于目标的代码注入到项目中,以配置相应的外设并提供数据访问。
图 3. 太阳能逆变器的完整控制器模型,包括触发器和任务管理
PLECS 中的目标块
对于电力电子应用中常见的选定微控制器系列,Plexim 提供专用目标支持包 (TSP),与 PLECS 和 PLECS 编码器结合使用。这些 TSP 包含一个目标块库,代表各个微控制器的各种片上外设。目标块可以通过其圆角与其他控制块区分开。
每个目标块都有一个对话框,允许用户配置相应的硬件外设。如果是模拟输入,用户可以选择 ADC 单元、输入通道、比例、偏移和采集时间窗口。由于每次数据采集都是由事件(例如定时器)启动的,因此用户还可以指定触发源。用户无需在配置寄存器中设置各个位,而是使用自然语言选项在更抽象的级别上配置外设。尽管不同微控制器系列之间的选项可能略有不同,并且并非所有硬件资源在每个芯片上都可用,但目标块提供的硬件抽象使得将模型移植到另一个微控制器变得非常容易。
PLECS 中的目标块不仅提供对数字和模拟输入或输出的直观访问。它们还可以组合多个外设以提供更复杂的功能,例如具有斜坡补偿和前沿消隐的峰值电流控制。图 3 显示了太阳能逆变器的完整控制器模型,包括特定于目标的外围模块。当前控制器子系统包含图 1 的模型。
当查看目标块的底层时,您会注意到两种不同的实现,就像在可配置子系统中一样。一种实现是基于文本的,并包含 Lua 脚本语言的元代码。它用于根据对话框条目生成片上外设的代码。另一种实现是 PLECS 模型,它在离线仿真期间模拟硬件外设的行为。对于 ADC,离线模型由触发采样保持元件和量化器组成。
代码生成子系统
要利用 I/O 外设的离线模型,控件必须与目标块一起包装在子系统中。当代表数据源的目标模块(例如 ADC)被放置在子系统中时,输入端子将被添加到子系统模块。该输入可以连接到控制子系统外部的信号源,例如电路模型中的测量。同样,代表数据端点的目标模块(例如 PWM 发生器)将在子系统中创建输出端子。该输出可用作电源电路中半导体开关的栅极信号。将子系统中的控件分组不会对控制代码生成产生不利影响,因为可以告诉 PLECS 编码器仅为单个子系统生成代码。相反,当遵循这种方法时,在将代码部署到微控制器之前,可以使用离线仿真根据工厂模型来开发和验证控制系统。事实上,无需修改即可使用完全相同的模型进行离线仿真和代码生成,这确保了模型和代码始终保持同步。图 4 显示了太阳能逆变器的整体电路模型,其中图 3 中的控制器模型包含在一个子系统中。
基于事件的控制任务执行 当采用微控制器对电力电子系统进行闭环控制时,电流和电压测量值的采集通常与 PWM 生成同步。同步采样确保以尽可能低的开关谐波采集电流和电压。在大多数数字电流控制环路中,PWM 发生器会定期触发 ADC 以对模拟测量结果进行采样。一旦 ADC 完成采样量的转换,它就会通过触发中断来发出新数字值存在的信号。在中断服务程序中,使用新获取的值计算控制算法,并将更新的占空比传递到 PWM 生成器。在其他配置中,
在 PLECS 中,我们引入了一种特殊的信号类型(如图 3 中的棕色虚线所示)来定义和可视化触发事件的传播。为了对上述控制环进行建模,用户首先需要选择 PWM 发生器应在何种条件下发出触发事件,例如计数器下溢或溢出。然后,将 PWM 发生器的触发输出连接到 ADC 模块的触发输入,以控制采集时序。为了指示每次转换完成后都调用控制任务计算,ADC 的触发输出终必须连接到特殊的“控制任务触发器”块。
多任务环境
单个控制回路通常不足以控制逆变器和驱动系统。大多数情况下,您会发现级联结构具有快速的内部电流控制环路和用于电压或速度调节的较慢的外部环路。虽然外环的计算可能需要一些时间,但简单电流控制任务的计算通常很快。然而,由于电流控制是高度动态的,因此必须以更高的执行速率来执行。为了地利用微控制器的计算能力,这种级联控制方案可以通过抢占式速率单调多任务处理来实现,其中快速电流控制任务中断较慢的外部控制环路的计算。控制模型必须分成具有不同采样率和中断优先级的多个任务。在PLECS中,这种划分是使用每个帧都包含一组块的帧以图形方式执行的。每个框架引用编码器设置中定义的特定任务。如果您的目标是多核处理器,您可以将各个任务分配给不同的。在图 3 中,黄色框将单独的任务分配给功率点跟踪器 (MPP) 和电压调节器,它们以比控制系统其他部分更低的采样率运行。
图 4. 太阳能逆变器的电源电路,其控件包含在代码生成子系统中
要在同一任务中计算的块不一定必须放在同一帧中。由于多个帧可以引用相同的任务,因此将块分配给不同的任务不会干扰控制系统的逻辑结构。其他嵌入式代码生成工具采用子系统或特殊块来将各个任务彼此分开。然而,为了不同的目的而重复使用这些现有的结构可能会令人困惑。相反,PLECS 中的任务帧让用户立即识别出一组共享特定于实现的属性的块。
分享到:
猜你喜欢