大多数基于 Arduino Zero/MKR 的示波器是:
Arduino Zero/MKR 具有一个 350kSps 12 位 ADC。考虑到它,这是很棒的规格。然而,释放这种能力是另一回事。托管在 Arduino Zero/MKR 中的 SAMD21G18 提供 USB2.0 全速。
因此,访问 350kSps ADC 需要示波器解决方案来捕获这些样本,通过 USB2.0 线路传输它们并以 60Hz 的速率将它们投射到屏幕上,即在 16ms 的时间范围内。此外,为了允许准确定时采样,ADC 读数需要伴随时间测量。
该项目继续寻求破解这一挑战!
下图列出了该应用程序的主要功能:
每帧 60hz 或 16ms vs ADC:350kSps
=> 每 16 毫秒 5600 个样本,
1 个样本 = 开销字节(至少完整性)+ 12/16/8 位样本 + 12/16/8 位时间戳 = 3 到 6 个字节
=> 5600 x 3 到 6 字节每 16 毫秒 = 16 800 到 33 600 字节每 16 毫秒
USB2.0 全速提供:
以上(错误地)假设 USB 传输可以与 ADC 捕获并行发生。
=> 跨行实现多线程是可能的,因为有必要尽可能接近我们的目标。
openGL 要求:
上述示例(假设读数准确)显示:
我们以 270kSps 采样(当我们采样时,请记住 Arduino 板上的 USB 传输也需要处理器时间)。
通过 USB 线收集和发送 1023 字节数据的时间大约需要 6.7 毫秒:这里的 1023 字节数据等于:1023 x 8 / (12 + 12 + 7) = 264 个样本重复 4 次以获得 1024 个样本(理论上它会只需 4 毫秒)。
这些数据在 15ms+.35ms+1.6ms ~2.1ms 内进行转换、构建和绘制。
openGL 的总帧速率为 9.2 毫秒(让程序尽可能快地运行)。因此,我们可以尝试将样本读数增加到 2048,而不会牺牲太多的屏幕刷新率。
正如我们上面所写的,我们需要实现多个线程以尽可能地允许并行处理。
该应用程序具有 3 个线程:
1) C#图形用户界面
(从其他线程中分离出来,让相对较慢的 UI 至少尽可能地干扰主任务,即捕获 USB 并在屏幕上投影)
2) C++ DLL OpenGL。用于包装 OpenGL 窗口的本机 C DLL。好处是代码易于移植到其他平台/ UI。OpenGL 是开源的,并且是目前最快的之一。
3) C++ DLL USB。用于包装 winUSB 驱动程序的本机 C DLL。选择的原因是 winUSB.sys USB 驱动程序安装在每台 Windows 计算机上,它支持同步数据传输。同步数据传输用于流数据。它为速度留下了数据完整性检查。通过这种方式,您可以每毫秒传输 1023 字节。
通过实施多线程方案,屏幕可以在另一个线程从 USB 线捕获新数据时构建,同时用户将鼠标悬停在用户界面上。
该应用程序不是那么用户友好的使用:
1) Arduino 板(或任何其他 ADC/USB 捕获设备)需要实现同步 USB 数据传输。默认情况下,ArduinoCore 不支持此功能。在本项目提供的草图中,我提供了 Arduino 代码,以使用等时 USB 接口扩展 ArduinoCore(同时不会失去仍然使用Serial.print功能的可能性)。该扩展可在常规 Arduino IDE 中使用(因此无需更改 ArduinoCore 本身)。
2) WinUSB.inf驱动文件需要在测试模式下运行Windows安装。这是因为没有驾驶证。
3) 目前我在 Github 上留下了未编译的 YetAnotherUSB 示波器软件。这是为了邀请用户进入代码并自行调整、编译和构建。
未来的改进:
YetAnotherUSB 示波器软件是在 VS 2019 上使用最新的 .NET 框架开发的,并在 64 位上进行了测试。换句话说,该应用程序相对未经测试且开发不足,无法在多个平台(32 位或 linux)上运行。
此外,多线程还没有变得超级健壮。(在极端情况下可能会出现无限循环,例如在读取时拔下 USB 等)
仍然缺少一些功能,即。FFT 分析、触发和记忆能力。
我希望这对您有所启发,并且您可以使用/借用代码进行自己的(进一步)开发。
继续制作!
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !