导语:控制软件是电力电子的核心之一所有的算法逻辑都会通过控制软件去实现可以认为软件是一个实现算法的工具对软件的要求就是能准高效的实现我们的想法
本人是电力电子专业,跳到了汽车行业,做着电力电子在汽车行业应用的工作。之前只听说汽车开发要求很高,标准很严,毕竟人命关天,进入行业后,才知道门道太多了,不过也算开了眼界,知道了一些能提高效率的开发方法,回过头来才发现以前的自己好土鳖。今天分享一下感触最深的控制软件编程的问题。
控制软件是电力电子的核心之一,所有的算法逻辑都会通过控制软件去实现,可以认为软件是一个实现算法的工具。对软件的要求,就是能准确、高效的实现我们的想法就可以了。
软件方面,我的成长过程分了五个阶段。
第一个阶段是随心所欲。
当初还在高校实验室的时候,为了做原型机,基本上就是找芯片的例程,在中断里面添代码,能输出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网站上也有。
后记
1、MBD(Model based design)主要用来生成算法、逻辑相关的代码,这也是控制软件最想要做的事情,这部分和芯片关系不大。唯一的关系在于,需要设定芯片的数据类型定义,就是C语言中int数据类型,在特定的芯片中是8位的还是16位的。MBD 不擅长做和芯片底层、外设相关的设计,这部分最好是手工编写平台性代码,或者用芯片厂家提供的底层代码。MBD开发人员需要设计好接口函数即可。
2、有人问MAAB在哪儿下载?我想问这个问题的人,是习惯了互联网嗟来之食。具有独立思考和创新的第一步,就是要学会用搜索引擎。
3、我的文章第一次得到了这么多人的关注,还被收录了,很开心。其实我所写的,对于做汽车软件的人来说都是理当如此的,只是我想这个好东西应该被更多做电力电子的人知道,我也相信迟早会在行业里面推广起来的。题外话:话说matlab的这个工具,由于利益关系,mathwork公司在汽车行业里面大范围推广、开论坛讲座,却很少把它推广到电力电子领域,这是因为咱们电力电子行业要求不高,各公司没有购买matlab服务的需求。
本文转载自公众号电力电子杂谈
作者 | 陈老四
本文来源于网络,本着学习交流的目的进行转载,已标注原始作者和出处,如存在异议,请联系editor@xingongye.cn。如您对内容有疑问,请告之,以便我们及时处理。
暂无评论,等你抢沙发