通过 TCP 协议将信号数据从 gnuradio 传输到 Arduino Due,以在引脚 DAC0 上生成信号

问题描述 投票:0回答:1

只想在 gnuradio 中创建信号并使用 TCP 协议将其发送到 Arduino Due 和以太网屏蔽 w5100,这将在 DAC0 引脚上生成信号。但是我在三天多的时间里试图解决这个问题。 GRC 项目具有连接到 TCP 接收器块的信号源块(类型 - 字节,频率 - 100Hz,波形 - 正弦波,采样率 32000Hz)。 Arduino 接收信号,但来自引脚 DAC 的信号看起来像方波。怎么了? 第二个问题,如何在 arduino sketch 中将 32 位值转换为 12 位值(如果在 gnuradio 信号源块中选择浮点类型)?

Arduino 草图:

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 137, 10);
EthernetServer server(8788);

void setup() {
analogWriteResolution(8); // set DAC resolution to 8 bits
Ethernet.begin(mac, ip);
server.begin();
}

void loop() {
EthernetClient client = server.available();
if (client) {
while (client.connected()) {
  if (client.available()) {
    byte val = client.read();
    analogWrite(DAC0, val); // generate signal on DAC0 pin
   }
  }
client.stop();
 }
}
arduino data-conversion gnuradio arduino-due
1个回答
0
投票

这个 arduino sketch 似乎更值得怀疑——你不是等待数据可用,而是获取它(如果没有可用的数据包则自旋锁);而不是让定时器定期将值复制到 DAC,您只需尽快写入它们即可。遗憾的是,这行不通,因为数据以数据包的形式到达。当有新数据包时,您的

while()
将有很多字节可以快速写出。数据包一被消费,就没有什么可写的了。

所以,您需要重新构建 Arduino 端:

  • 您需要指示您的微控制器定期进行 DMA 传输,
  • 您需要将第一个传入数据包复制到该 DMA 缓冲区的输入缓冲区
  • 您需要指示 DMA 控制器在第一次运行为空时获取下一个输入缓冲区

恐怕我不知道在 Arduino 下如何做到这一点。

第二个问题,如何在 arduino sketch 中将 32 位值转换为 12 位(如果在 gnuradio 信号源块中选择 float 类型)?

通过乘以一个适当的常数,并转换为一个 16 位整数,可能;然后只使用与 DAC 相关的 12 位。但是:你永远不想那样做。在主机上的 GNU Radio 中进行浮点处理,在那里转换为 16 位中的 12 位整数,并通过以太网发送准备好的数据。浪费带宽和计算能力发送 32 位是没有意义的,您只需要 12 位!

© www.soinside.com 2019 - 2024. All rights reserved.