三相正弦信号发生器
在本演示中,我们将介绍如何嵌入从Engee模型的子系统生成的代码。
导言
本例的目的是开发三相正弦波发生器的模型。 发生器的输入信号是输出信号的幅度[V]和频率[Hz]:瞬时相位电压。 正弦信号的相位差为 .
在示例过程中,我们将在Engee模型中进行算法建模,代码生成,嵌入和验证,在目标设备(Arduino兼容平台)上进行嵌入和测试。
模型描述
开发的模型 sine_generator.engee 它是包含在子系统内部的三相正弦信号发生器的算法。 SinGen. 幅度值应用于子系统输入 Amp = 1.0 和频率 Freq = 25.0. 输出正弦信号 Sin_A, Sin_B 和 Sin_C 他们被记录下来。
模型的计算步骤为0.001秒。
子系统内容 SinGen 如下图所示。
该子系统使用以下方程再现标准计算:
模拟结果
下载并执行所描述的模型:
if "sine_generator" in [m.name for m in engee.get_all_models()]
m = engee.open( "sine_generator" );
else
m = engee.load( "$(@__DIR__)/sine_generator.engee" );
end
data = engee.run(m);
从获得的模型数据中,我们将绘制输出变量-瞬时相位电压。 SinGen.Sin_A, SinGen.Sin_B, SinGen.Sin_C.
using Plots
plotlyjs()
plot(data["SinGen.Sin_A"].time, data["SinGen.Sin_A"].value,
label="V_a", size=(900,300), lw=2, st=:step)
plot!(data["SinGen.Sin_B"].time, data["SinGen.Sin_B"].value,
label="V_b", size=(900,300), lw=2, st=:step)
plot!(data["SinGen.Sin_C"].time, data["SinGen.Sin_C"].value,
label="V_c", size=(900,300), lw=2, st=:step,
legend=:topleft)
xlabel!("Время, сек")
ylabel!("Напряжение, В")
仿真结果得到的输出信号图为三相正弦电压 V_a, V_b, V_c 频率为25Hz,振幅为1V,相移 .
代码生成
要嵌入开发的算法,有必要从子系统生成代码 SinGen:
engee.generate_code( "$(@__DIR__)/sine_generator.engee",
"$(@__DIR__)/sine_generator_SinGen_code";
subsystem_name="SinGen" )
由于执行代码生成命令,文件在指定的目录中创建 main.c, sine_generator_SinGen.h 和 sine_generator_SinGen.c.
现在让我们来看看并测试嵌入从模型生成的代码的方法。
在Engee模型中嵌入代码
为了测试生成代码的操作,我们将其嵌入到Engee模型中。 sine_generator_test.engee. 算法的输入和输出参数与原始模型中的参数相同 sine_generator.engee. 然而,算法本身在这里是在嵌入到块中的生成的C文件的基础上实现的。 C Function.
嵌入代码如下。 在街区里 C Function 指定生成文件的位置,初始化输入和输出变量,并调用从模型生成的计算函数。
选项卡的内容 </> OutputCode 街区 C Function:
``'C
//工程师-开始
//
//构建source_files/user/start/examples/codegen/sine_generator/sine_generator_SinGen_code/sine_generator_SinGen。c
//build include_directories/user/start/examples/codegen/sine_generator/sine_generator_SinGen_code
//构建library_directories
//build headers sine_generator_SinGen.h
//构建定义
//建立图书馆
//
//名称范围标签类型大小端口
//符号A输入'a'双1 1
//符号F输入'F'双12
//符号Va输出'Va'双11
//符号Vb输出'Vb'双1 2
//符号Vc输出'Vc'双13
//
//engee-cfunction-end
//
//传输sine_generator_SinGen_U频率和幅度值
到结构。频率=F;
sine_generator_SinGen_U.振幅=A;
sine_generator_SinGen_step();
//按相位转移结构的瞬时电压值
Va=sine_generator_SinGen_Y.Sin_A;
Vb=sine_generator_SinGen_Y.Sin_B;
Vc=sine_generator_SinGen_Y.Sin_C;
选项卡的内容 </> StartCode 街区 C Function:
``'C
//打电话
sine_generator_SinGen_init()初始化函数;
选项卡的内容 </> TerminateCode 街区 C Function:
``'C
//打电话
sine_generator_SinGen_term()终止函数;
嵌入式代码建模
下载并执行模型 sine_generator_test.engee 测试生成的代码:
if "sine_generator_test" in [n.name for n in engee.get_all_models()]
n = engee.open( "sine_generator_test" );
else
n = engee.load( "$(@__DIR__)/sine_generator_test.engee" );
end
test = engee.run(m);
从获得的模型数据中,我们将绘制输出变量-瞬时相位电压。 SinGen.Sin_A, SinGen.Sin_B, SinGen.Sin_C.
plot(test["SinGen.Sin_A"].time, test["SinGen.Sin_A"].value,
label="V_a", size=(900,300), lw=2, st=:step)
plot!(test["SinGen.Sin_B"].time, test["SinGen.Sin_B"].value,
label="V_b", size=(900,300), lw=2, st=:step)
plot!(test["SinGen.Sin_C"].time, test["SinGen.Sin_C"].value,
label="V_c", size=(900,300), lw=2, st=:step,
legend=:topleft)
xlabel!("Время, сек")
ylabel!("Напряжение, В")
从得到的曲线图可以看出,在测试模型中得到的电压信号也具有具有指定频率、幅值和相移的正弦外观。
我们还比较了初始模型和测试模型正弦a相信号的仿真结果。:
plot(data["SinGen.Sin_A"].time, data["SinGen.Sin_A"].value,
label="V_a", size=(900,300), lw=4, st=:step)
plot!(test["SinGen.Sin_A"].time, test["SinGen.Sin_A"].value,
label="V_a_test", size=(900,300), lw=2, st=:step,
legend=:topleft)
xlabel!("Время, сек")
ylabel!("Напряжение, В")
从上面的图表可以看出,初始模型的建模结果和用于验证代码生成结果的模型是完全相同的。
在Arduino草图中嵌入代码
要在目标设备上测试开发的算法,您需要连接生成的文件。 sine_generator_SinGen.c 和 sine_generator_SinGen.h 到用户程序项目。
本示例使用Amperka的Iskra Neo控制器进行演示。 在目标设备上执行算法包括将控制器生成的信号的值传输到串行端口。 传输值的显示将由Arduino IDE工具进行。
为了嵌入算法代码,先前开发了Arduino IDE的草图。 sine_generator.ino,这也是附加到这个演示的文件夹。 草图的内容在功能上与块的内容相同 C Function Engee测试模型,除了与外围设备工作的功能和计算步骤维护周期。 在代码的注释中给出了草图如何工作的详细描述。
Arduino上的代码执行
成功编译并将草图上传到目标设备后,我们将从Arduino IDE工具包中打开"串行绘图仪"。 带有输出信号的绘图仪的屏幕截图如下图所示。
绘图仪图表显示,生成的信号也具有预设的幅度、频率和相移。
结论
在本演示中,开发了具有预设参数(幅度、频率和相移)的三相正弦信号发生器模型。 在Engee模型中调试生成器算法,然后通过嵌入到Engee模型中测试生成的代码生成文件,最后将生成的C文件上传到自定义草图并在目标设备上进行测试。
因此,使用正弦波发生器的简单示例,我们研究了从Engee模型生成代码的可能性。