定制和扩展Simscape库,一个定制的直流电机
创建一个定制的基于方程的组件使用符号数学工具箱™Simscape库。
介绍
的符号数学工具箱提供了一种灵活的方式来开发模型从第一工程原则在任何空间维度。您可以开发为稳态或瞬态物理数学模型。
您可以开发和解决所需的方程来表示所需的物理组件;并执行自己的降维模型之间的映射输入x和感兴趣的一个量f (x)。
在这里f自定义组件可以代表形式的控制方程:
数学公式
常微分方程的数值模拟和pde
在这个例子的步骤
参数化一个Simscape™组件使用
symReadSSCVariables
自定义方程Simscape组件使用
diff
解决稳态方程分析使用
解决
和潜艇
解时间方程数值在使用MATLAB®
matlabFunction
和数值
创建一个Simscape组件使用
symWriteSSC
要运行这个示例,您必须有许可证Simscape和符号数学工具箱。
直流电机模型
直流电机是一种装置将电能转化为机械能,反之亦然。直流电机的原理图(左)所示。块提供了模拟直流电机Simscape电™(正确的图),这是一个可选的产品Simscape。
在这个例子中,我们将获得的降维模型表示一个直流电机使用管理常微分方程(常微分方程)。直流电机,电机电压和电流来源于机械转矩的基尔霍夫定律和公式来源于牛顿定律。利用这些方程我们可以实现一个自定义和参数Simscape组件。
导入模板组件的参数和变量
假设您有一个Simscape组件MyMotorTemplate.ssc
在当前文件夹或默认的MATLAB的道路。该组件还没有方程。模板记录的参数和变量将被用来发展我们的马达。您可以使用类型
提供一个预览的模板。
类型MyMotorTemplate.ssc
组件MyMotorTemplate %定制直流电机%这个块实现了一个自定义的直流电机节点p = foundation.electrical.electrical;% +:左n = foundation.electrical.electrical;% -:左r = foundation.mechanical.rotational.rotational;% R:对c = foundation.mechanical.rotational.rotational;% C:右端参数R ={3.9,“欧姆”};%电枢电阻L = {0.000012, ' H '};%电枢电感J ={0.000001公斤* m ^ 2的};%惯性博士= {0.000003,(N * m * s) / rad '};%转子阻尼Ki = {0.000072, (N * m) / '};%转矩常数Kb = {0.000072, (V * s) / rad的}; %Back-emf constant end variables torque = {0, 'N*m'}; %Total Torque tau = {0, 'N*m'}; %Electric Torque w = {0, 'rad/s'}; %Angular Velocity I = {0, 'A'}; %Current V = {0, 'V'}; %Applied voltage Vb = {0, 'V'}; %Counter electromotive force end function setup if(R<=0) error('Winding resistance must be greater than 0.'); end end branches torque : r.t -> c.t; % Through variable tau from r to c I : p.i -> n.i; % Through variable i from p to n end equations w == r.w -c.w; % Across variable w from r to c V == p.v -n.v; % Across variable v from p to n end end
读名称、值和单位从模板组件的参数。
[parNames, parValues parUnits] = symReadSSCParameters (“MyMotorTemplate”);
显示参数,它们的值,和相应的单位向量。
vpa ([parNames;parValues;parUnits), 10)
ans =
参数名称添加到通过使用MATLAB工作区信谊
函数。参数出现在工作区中符号变量。您可以使用谁
在工作区中列出的变量。
信谊(parNames)对称
你的符号变量:J博士Kb Ki L R答
读取和显示组件的变量的名称。使用ReturnFunction
同时将这些变量转换为变量的函数t
。
[varFuns, varValues varUnits] = symReadSSCVariables (“MyMotorTemplate”,“ReturnFunction”,真正的);vpa ([varFuns;varValues;varUnits), 10)
ans =
变量名称添加到通过使用MATLAB工作区信谊
函数。在工作区中变量表现为符号函数。确认你已经宣布所有必需的象征性的变量和函数使用信谊
。
信谊(varFuns)对称
你的符号变量:J博士Ki R Vb t扭矩我Kb L V ansτw
定义方程组建模直流电机
机械转矩的微分方程被定义为eq1
和eq2
。我(t)
代表了当前和w (t)
角速度。
eq1 =转矩+ J * diff (w (t)) = =是* w (t) +τ(t)
eq1 (t) =
eq2 =τ(t) = = Ki *我(t)
eq2 =
电电压和电流方程eq3
和eq4
。V (t)和Vb (t)分别代表了外加电压和反电动势。
eq3 = L * diff(我(t)) + R *我(t) = = V (t) - Vb (t)
eq3 =
eq4 = Vb (t) = = Kb * w (t)
eq4 =
我们可以列出他们在一起。这里假设电动机的转矩电流成正比。
方程式=公式([eq1;eq2;eq3;eq4])
方程式=
提取左右的方程。
操作数=孩子(方程式);operList ={}):[操作数;lh = operList(1:2:结束)
lh =1×4单元阵列{[J * diff (w (t), t…]}{[τ(t)]} {[L * diff (t (t),…]}{(Vb (t))}
rhs = operList(2:2:结束)
rhs =1×4单元阵列{(τ(t) - * w (t)博士]}{[Ki *我(t)]} {[V (t) - Vb (t)]} {(Kb * w (t))}
第二个和第四个方程定义的值τ(t)
和Vb (t)
。简化系统的四个方程组的两个方程,把这些值代入第一个和第三个方程。
方程(1)=潜艇(方程式(1),lh (2), rhs (2))
公式=
方程(2)=潜艇(方程式(3),lh (4), rhs (4))
公式=
方程”。
ans =
在解决方程之前,替代参数的数值。此外,使用V (t) = 1
。
公式=潜艇(方程,[parNames, V (t)], [parValues 1]);公式=潜艇(方程,扭矩,0);vpa(方程。',10)
ans =
解决方程的稳定状态
为此,删除的时间依赖的功能w (t)
和我(t)
。例如,替代符号变量ww
和二世
。
信谊ww二世equations_steady =潜艇(方程(w (t),我(t)], [ww, ii]);结果=解决(ww, equations_steady ii);steadyStateW = vpa (result.ww, 10)
steadyStateW =
steadyStateI = vpa (result.ii, 10)
steadyStateI =
数值模拟在MATLAB使用符号表达式matlabFunction
和数值
创建一个有效的输入数值
从符号方程。使用odeToVectorField
创建代表了动力系统的MATLAB程序
与初始条件
。
[vfEquations, tVals] = odeToVectorField(方程)
vfEquations =
tVals =
M = matlabFunction (vfEquations“var”,{“t”,“Y”})
M =function_handle与价值:@ (t、Y) [Y (1)。* (-3.25 e + 5) - Y (2) * 6.0 + 8.333333333333333 e + 4; Y (1)。* 7.2 e + 1 Y (2) * 3.0]。
解决使用初始条件的微分方程w (0) = 0
和我(0)= 0
。
解决方案=数值(M, [0 3], [0 0])
解决方案=结构体字段:解决:“数值”extdata: [1 x1 struct] x: [0 1.8833 3.7618 7.4754 1.4468 2.4114 e-09 e-08 e-08 e-07 e-06……y: [2 x293775双]统计:[1 x1 struct] idata: [1 x1 struct]
评估解决方案在以下几点t= (0.5,0.75,1)。第一个值是当前我(t)
第二个值是角速度w (t)
。我们看到,角速度的解决方案已经开始接近一个稳定状态steadyStateW
。
德瓦尔(解决方案,0.5),德瓦尔(解决方案,综合成绩),德瓦尔(解决方案,1)
ans =2×10.2563 - 4.7795
ans =2×10.2563 - 5.5034
ans =2×10.2563 - 5.8453
steadyStateW
steadyStateW =
策划解决方案。
时间= linspace (0, - 2.5);iValues =德瓦尔(解决方案、时间、1);wValues =德瓦尔(解决方案、时间、2);steadyStateValuesI = vpa (steadyStateI * (1100), 10);steadyStateValuesW = vpa (steadyStateW * (1100), 10);图;plot1 =次要情节(2,1,1);plot2 =次要情节(2,1,2);情节(wValues plot1,时间,“蓝”、时间、steadyStateValuesW“——红”,“线宽”1)图(iValues plot2,时间,“绿色”、时间、steadyStateValuesI“——红”,“线宽”1)标题(plot1“直流电机角速度”)标题(plot2直流电机——当前的)ylabel (plot1“角速度(rad / s)”)ylabel (plot2“当前的(一个)”)包含(plot1“时间[s]”)包含(plot2“时间[s]”)传说(plot1“w (t)”,“w (t):稳态”,“位置”,“northeastoutside”)传说(plot2“我(t)”,“我(t):稳态”,“位置”,“northeastoutside”)
保存您的数学模型用于Simscape
使用原始方程生成Simscape代码方程式
。
symWriteSSC (“MyMotor.ssc”,“MyMotorTemplate.ssc”方程式,…“H1Header”,%定制直流电机的,…“HelpText”,{%这个块实现了一个自定义的直流电机的})
显示生成的组件使用类型
命令。
类型MyMotor.ssc
组件MyMotor %定制直流电机%这个块实现了一个自定义的直流电机节点p = foundation.electrical.electrical;% +:左n = foundation.electrical.electrical;% -:左r = foundation.mechanical.rotational.rotational;% R:对c = foundation.mechanical.rotational.rotational;% C:右端参数R ={3.9,“欧姆”};%电枢电阻L = {0.000012, ' H '};%电枢电感J ={0.000001公斤* m ^ 2的};%惯性博士= {0.000003,(N * m * s) / rad '};%转子阻尼Ki = {0.000072, (N * m) / '};%转矩常数Kb = {0.000072, (V * s) / rad的}; %Back-emf constant end variables torque = {0, 'N*m'}; %Total Torque tau = {0, 'N*m'}; %Electric Torque w = {0, 'rad/s'}; %Angular Velocity I = {0, 'A'}; %Current V = {0, 'V'}; %Applied voltage Vb = {0, 'V'}; %Counter electromotive force end function setup if(R<=0) error('Winding resistance must be greater than 0.'); end end branches torque : r.t -> c.t; % Through variable tau from r to c I : p.i -> n.i; % Through variable i from p to n end equations w == r.w -c.w; % Across variable w from r to c V == p.v -n.v; % Across variable v from p to n torque+J*w.der == tau-Dr*w; tau == Ki*I; L*I.der+R*I == V-Vb; Vb == Kb*w; end end
建立一个Simscape图书馆从生成的组件。
如果~ isdir (' + MyLib 'mkdir)+ MyLib;结束拷贝文件MyMotor.ssc+ MyLib;ssc_buildMyLib;
生成模型库“MyLib金宝app_lib”当前目录“/ tmp / Bdoc22b_2134332_2480843 / tpb0956bf9 symbolic-ex98670381”……