剑客
关注科技互联网

基于模型设计——电力电子的利器

基于模型设计——电力电子的利器

本人是电力电子专业,跳到了汽车行业,做着电力电子在汽车行业应用的工作。之前只听说汽车开发要求很高,标准很严,毕竟人命关天,进入行业后,才知道门道太多了,不过也算开了眼界,知道了一些能提高效率的开发方法,回过头来才发现以前的自己好土鳖。今天分享一下感触最深的控制软件编程的问题。

控制软件是电力电子的核心之一,所有的算法逻辑都会通过控制软件去实现,可以认为软件是一个实现算法的工具。对软件的要求,就是能准确、高效的实现我们的想法就可以了。

软件方面,我的成长过程分了五个阶段。

第一个阶段是随心所欲。

当初还在高校实验室的时候,为了做原型机,基本上就是找芯片的例程,在中断里面添代码,能输出PWM,能实现控制效果、示波器能捕捉想要的波形就达到目的了。太原始了……

第二阶段是模块化编程。

参加工作后,开始思考代码的高聚合、低耦合、复用性。代码开始做模块化编程,比如把PI调节器进行封装,设计模块的输入、输出、参数和调用方式,对模块进行测试和编写设计文档。

第三阶段是系统编程。

这时候,开始思考嵌入式芯片的控制软件应该怎么规划,怎么设计硬件层、服务层、应用层,怎么用操作系统,是否需要数据库。因为不是搞嵌入式软件出身,搞这个太痛苦。为此学习了好多高级C语言编程、操作系统等知识。

第四阶段是基于模型设计。

基于模型设计的对立面,是基于软件设计。我前面三个阶段所做的,都是基于软件设计,工作的核心内容,就是在设计软件,重复做定义变量、定义函数等工作。我觉得效率很低,因为相当于我大部分时间在学习工具,核心的控制算法反而没有太多精力和时间去提升。

目前比较土鳖的程序设计思路是这样的:先在simulink中搭建仿真模型,用模型去实现算法;仿真没问题后,开始将模型人工翻译成C语言;烧写到芯片中,进行调试。当然,稍微好一点的会做Sfunction的仿真。

基于模型设计,是在simulink中搭建仿真模型,直接进行测试,如果满足要求后,用工具直接生产C代码,然后在芯片中直接使用。当然,如果是汽车行业,不能这么简单粗暴,还有各种测试和验证,不过在大部分电力电子行业,代码基本是可以直接用的,和仿真结果基本一致。(本着严谨的态度,用了“基本”二字,但我还没发现不一致的)。

这简直是电力电子工程师的福音,只用关心控制算法,由于编程而引起的各种bug减小到了最低。我知道,你肯定会怀疑生产代码的效率。请放心,代码的水平会略高于一个中级水平的C程序员,我见过好多公司的算法开发人员,C代码水平还停留在初级阶段。而且即使你是一个高级水平的C程序员,看不起自动代码的水平,但代码自动生成在几秒内完成的工作,你可能好几天还干不完,把多余的时间拿来陪陪女朋友、老婆和孩子、看看书多好。我知道,你肯定会问,自动生成的代码能看懂吗?我想说,确实很难看懂,大部分我只能看明白这一块代码大概是干嘛的,具体每一行代码或者某个变量的作用,基本看不懂。可是我为什么要看懂代码呢?我只要能看懂模型就可以了,C代码只是模型翻译成的一种中间语言而已,我不用看懂。编译器还会把C代码翻译成汇编,现在还有谁会去一行一行的看汇编代码呢。那看不懂代码会影响调试吗?不影响。功能性bug会在模型阶段都解决了,如真有问题,输出看两个变量就能进行问题定位。

基于模型设计真这么好,是不是不用在费心搞C语言这些了?恰恰相反,我认为对C代码越熟悉,越能利用工具生成更高效的C代码。有些代码生成选项,是建立在对C代码深刻认识上的。毕竟吃饱肚子的,不是最后一块饼。

基于模型设计难学吗?我觉得入门还算难,特别是如果你对simulink的各种参数定义不是很了解、C语言水平不是很高。不过好在现在互联网时代,网上各种资源很多。建议多去看看matlab的官网,上面有视频做一些基础的入门讲解。

第五阶段是规范建模。

不再手敲代码后,每天都跟建模打交道,期间总觉得自己的模型看着别扭,每天都想重构。后来接触了MAAB(Mathwork Automotive Advisory Board),一个matlab写的一个关于汽车行业建模规范,包括simulink和stateflow的建模规范,里面内容很多,跟MISRA差不多,就是一些怎么命名、连线、布局的规范。这儿贴一个里面关于建模层次结构的规范。

基于模型设计——电力电子的利器

模型应分为四层,包括顶层、触发层、结构层和数据流层。顶层应该是说明模型的输入、输出接口,和模型功能的描述。触发层是各功能块的触发条件、执行时间周期等。结构层就是各个功能块了,各功能块应该是原子系统。数据流层就是最底层,描述了数据如何计算处理。有兴趣的去网上看看这个文档吧,百度文库有,matlab网站上也有。

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址