Engee 文档
Notebook

Arduino的代码生成(直接数字合成)

此示例显示了信号的直接数字合成(DDS)模型,随后在Arduino上执行。

导言

直接数字合成的任务是在具有可调参数的发生器的输出端生成给定形状的信号。 在这个例子中,将实现在五个输出波形之间切换外部离散信号-具有正斜率和负斜率的锯齿波,三角形,正弦和弯曲。 输出信号的频率和幅度将使用两个外部模拟信号进行调整。

硬件部分

在此示例中,Arduino MEGA2560调试板用作目标设备。 输出信号在输出No.9处产生。 使用PWM和RC低通滤波器进行数模信号转换。 PWM频率为 ,RC滤波器的截止频率 过滤顺序为2。 RC电路的参数: .

输出波形开关信号由上拉电阻上带有嘎嘎声消除电路的按钮触点送至数字输入2号 和并联电容 .

为了控制输出信号的频率和幅度,电阻电位器连接到Arduino调试板的模拟输入A0和A1 .

元件的连接图如下图所示。

arduino_dds_bb.png

输出信号由低通滤波器输出端的Hantec DSO示波器捕获。 还用于通过限流电阻经滤波后输出信号至扬声器。 个3.5mm音频输出插孔连接。

模型描述

与模型中的控制器外围设备交互 arduino_dds 使用四个块 C Function:

  • DigitalInput_Mode -初始化数字输入2号,轮询输入状态。 在Engee中建模时,它会生成周期性锯齿信号,以在计数器单元的输入端组织负边沿。 ModeCounter 并切换输出波形。
  • AnalogInput_Freq -轮询模拟输入A0上的频率值。 在Engee中建模时设置输出信号的条件频率 .
  • AnalogInput_Amp -轮询模拟输入A1上的幅度值。 在Engee中建模时设置输出信号的条件幅度 .
  • HFPWM_Output -以最大可用频率(62.5kHz)在9号输出处初始化PWM操作,并将新的占空比值传输到PWM控制器模块。

关于外围块的操作的细节在对这些块中的代码的注释中给出。

image_2.png

在子系统中定义了计算五种指定波形的算法: PositiveSaw -具有正斜率的锯齿, NegativeSaw -带负斜率的锯齿, Triangle -三角形, Sinusoidal -正弦和 Square -具有50%钻孔的蜿蜒流。 块用于在输出波形算法之间切换 Multiport Switch,其从子系统控制 ModeCounter. 在子系统中 ModeCounter 输入信号的负边沿突出显示,并对击键次数进行计数。

因此,在Engee中建模时,具有恒定频率和幅度设置的输出信号将在指定波形之间周期性地切换。

模拟结果

下载并执行创建的模型:

In [ ]:
Pkg.add(["WAV"])
In [ ]:
if "arduino_dds" in [m.name for m in engee.get_all_models()]
    m = engee.open( "arduino_dds" );
else
    m = engee.load( "$(@__DIR__)/arduino_dds.engee" );
end

data = engee.run(m);

从获得的模型数据中,我们将绘制生成的信号。:

In [ ]:
using Plots
plotlyjs()
plot(data["pwmduty"].time, data["pwmduty"].value,
    legend=false, size=(900,300), lw=2, st=:step)
xlabel!("Время, сек")
ylabel!("Значение")
Out[0]:

正如你所看到的,大约每0.2秒输出信号改变其形状。

为Arduino生成代码

要上传到Arduino,您需要从开发的模型生成代码。:

In [ ]:
engee.generate_code( "$(@__DIR__)/arduino_dds.engee",
                     "$(@__DIR__)/arduino_dds_code")
[ Info: Generated code and artifacts: /user/start/examples/codegen/arduino_dds/arduino_dds_code

我们将连接用户草图中指定目录中生成的文件。 arduino_dds.ino. 下载这些文件并使用Arduino IDE将它们上传到Arduino MEGA

所附草图定义宏和全局变量,添加自定义生成的文件和第三方库,并调用模型的初始化和循环计算函数。 草图还包含注释来解释代码的工作原理。

在Arduino上运行程序

成功编译并将草图上传到目标设备后,我们将在RC滤波器的输出端连接一个Hantec DSO数字示波器,并捕获生成信号的形状。 测量实验显示了在产生的形状之间切换,随后产生具有可调频率的锯齿信号,然后具有可调幅度。

dds_good1.gif

为了使DDS模型更具代表性,将扬声器连接到RC电路的输出端,并将产生的声音记录在文件中。 arduino_dds_audio.wav. 下一个代码单元格允许您将接收到的音频文件上传到脚本并播放它。 播放音轨以确保开发的模型正常工作。 它在输出波形依次切换时记录声音,然后以正斜率调整锯齿信号的频率和幅度。

In [ ]:
using WAV, Base64
x, fs = wavread( "$(@__DIR__)/arduino_dds_audio.wav" );

buf = IOBuffer();
wavwrite(x, buf; Fs=fs);
data = base64encode(unsafe_string(pointer(buf.data), buf.size));
markup = """<audio controls="controls" {autoplay}>
              <source src="data:audio/wav;base64,$data" type="audio/wav" />
              Your browser does not support the audio element.
              </audio>"""
display( "text/html", markup );

结论

在本演示中,开发了一个频率和幅度可调的直接数字信号合成模型,并能够在锯齿波正负、三角形、正弦和弯曲之间切换波形。 Engee中的仿真结果和在目标设备上的执行是成功的,并且已经显示了它们的身份。