gpt4 book ai didi

javascript - 有没有办法在运行 Windows IoT 的树莓派 2 上使用时钟中断

转载 作者:太空宇宙 更新时间:2023-11-04 16:18:37 26 4
gpt4 key购买 nike

我正在开发适用于 Raspberry Pi 2 的信号生成器 Windows IoT 通用 JavaScript 应用程序。

我通过 SPI 将 MCP4921 DAC 连接到它。

我想做的是生成具有给定频率、幅度和偏移的正弦波。我已经让设备工作了,但是当我尝试产生精确的波时,应用程序甚至会减慢 10 Hz 精确的正弦波。

目前wave是这样生成的。

var Spi = Windows.Devices.Spi;
var Enumeration = Windows.Devices.Enumeration;

var frequency = 10;
var ts = 1 / frequency;
var updateFreq = ts / 100;
var time = 0;
var offset = 2;
var amplitude = 2;
var resolution = 4095;
var voltage = 5;

var settings = Spi.SpiConnectionSettings(0);
settings.clockFrequency = 2 * Math.pow(10, 7);
settings.mode = Spi.SpiMode.mode0;

var ags = Spi.SpiDevice.getDeviceSelector();


Enumeration.DeviceInformation.findAllAsync(ags, null).done(dis => {
Spi.SpiDevice.fromIdAsync(dis[0].id, settings).done(device => {
for (; ;) {
var value = offset + amplitude * Math.sin(2 * Math.PI * frequency * time);
var dacValue = parseInt(resolution / voltage * value);
if (dacValue > resolution) dacValue = resolution;
time += updateFreq;
if (time > 1000) time = 0;
var buffer = new Uint8Array(2);

buffer[0] = 0x30 | (dacValue >>> 8);
buffer[1] = 0xFF & dacValue;

device.write(buffer);
}
});
});

我尝试使用 setInterval,我知道这不是一个好的做法,它至少要等待 10 毫秒才能再次运行。

有没有办法修改树莓派定时器、时钟或其他任何东西来每 0.1 毫秒运行一次自定义中断 ISR 函数?

我已经查看了 dma 寄存器 BCM2835 DatasheetBCM2836 Datasheet数据表。我找不到任何解决方案来管理 Raspberry Pi 时钟中断,只能解决引脚中断问题。

我也知道如何在 Arduino Uno 中执行此操作,但它对我没有帮助,因为我不知道如何操作树莓派寄存器。

这是生成的正弦波的图像。

Sine Wave

提前致谢。

最佳答案

  • 如果可能,您可以尝试使用 LUT 进行正弦生成,因为这些行:

            var value = offset + amplitude * Math.sin(2 * Math.PI * frequency * time);
    var dacValue = parseInt(resolution / voltage * value);

    非常耗时。本质上,使用 LUT,您需要预生成正弦波样本并将其存储在 RAM 中。

  • 如果您的目的是通过计算耗时来计算正弦波值,我认为您不应该使用

             `time += updateFreq;`
    首先。这样,如果您依靠软件计时,最终可能会得到严重扭曲的波形。我建议使用计时器。

  • Windows IoT 不是实时操作系统。即使使用高分辨率定时器它不能以极其精确的方式重复操作由于软件时序不确定性,间隔(<1ms)。

    我不认为中断 ISR 可以解决你的问题,因为它也是基于OS层实现。

    正如您提到的,您可以尝试使用 SPI 的 DMA 模式。但,不幸的是,似乎没有有效的驱动程序来操纵 SPI DMA 相关的Arduino 和 Windows IoT 核心中的 Raspberry 寄存器。那么你可能需要自己写驱动。这是关于development ofdevice drivers for the Microsoft Windows platformPwm是一个Windows IoT core上使用DMA的BCM2836驱动可以引用。

关于javascript - 有没有办法在运行 Windows IoT 的树莓派 2 上使用时钟中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40855008/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com