先开个坑,后面再填。
这个坑我会填的,因为这就是我的研究生方向。
不得不说,MATLAB真的是个神器啊。功能强大,只要想做的,基本都能做到。可惜我自己本科的时候,专业并不是控制,而是机械,因此很少用到MATLAB,除了有一节视觉识别的课程上稍微写了一点点东西之外,对这个软件一无所知。我实际开始接触这个软件并使用,是在大四跨专业保研成功后,进实验室搬砖开始。
在MATLAB上进行电机控制仿真,我们主要使用的是Simulink的功能,配合S-Function,用C语言编写控制代码来实现。这样的好处是,在C语言通用性的支持下,把控制代码移植到其他平台上实际应用会很方便。
在MATLAB中配置S-function的CPP编译器会有点坑,需要去安装对应MATLAB版本的编译器,并配置好系统变量。
配置完成后,可以在matlab中运行如下代码,会自动生成对应的C++ block模块。
%本文件用于模块的初始化设置
%legacy_code('help');%打开help文档
setenv('MW_MINGW64_LOC','C:\mingw-w64\x86_64-6.3.0-win32-seh-rt_v5-rev2\mingw64');
mex -setup C++;
def = legacy_code('initialize'); %定义参数集变量
def.SFunctionName = 'bldc_ctl'; %定义s-function名称
def.SourceFiles = {'motor_ctrl.cpp','Tool_Filter.cpp','Tool_PID.cpp'}; %定义源文件
def.HeaderFiles = {'motor_ctrl.hpp','Tool_Filter.hpp','Tool_PID.hpp'}; %定义头文件
def.HostLibFiles = {''}; %定义库文件
def.TargetLibFiles = {''};
def.IncPaths = {'..\Function'}; %定义头文件路径 若在目录下则不需设置
def.SrcPaths = {'..\Function'}; %定义源文件路径
def.LibPaths = {''}; %定义库文件路径
def.InitializeConditionsFcnSpec = 'void Motor_init(void)'; %初始化函数定义
def.StartFcnSpec = ''; %启动函数定义
def.OutputFcnSpec = 'void Motor_ctrl(double u1[3], int8 u2[1], double u3[1], double u4[2], double u5[1], double y1[3], double y2[13])' %输出函数定义
def.TerminateFcnSpec = ''; %停止函数定义
def.Options.language = 'C++';
def.SampleTime = [1e-6]; %定义采样时间 若不设置则与输入的采样时间相同
cd('generate');
%legacy_code('sfcn_cmex_generate', def); %生成文件
%legacy_code('compile', def); %编译文件
%legacy_code('slblock_generate', def); %封装为模块
% legacy_code('sfcn_tlc_generate', def); %生成tlc文件
legacy_code('generate_for_sim', def); %完成s-function文件的生成,编译,模块封装
% legacy_code('rtwmakecfg_generate', def); %生成m文件
cd('../')
如果一切顺利,那么生成对应的模块大概会像这个样子:
也可能会不太像,跟上面的代码配置相关。
待续。