有没有办法在 raspberry pi 2 运行 windows iot 上使用时钟中断

Is there a way to use clock interrupts on raspberry pi 2 running windows iot

我正在开发信号发生器 Windows Iot universal javascript 应用到 Raspberry Pi 2.

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

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

当前波是这样生成的

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 函数?

我已经在 BCM2835 Datasheet and BCM2836 Datasheet 数据表中查看了 dma 寄存器。我找不到任何如何管理 Raspberry Pi 时钟中断的解决方案,仅针对引脚中断。

我也知道如何在 Arduino Uno 中做到这一点,但它对我没有帮助,因为我不知道如何操作树莓派寄存器。

这是生成的正弦波图像。

提前致谢。

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

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

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

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

             `time += updateFreq;`
    

    首先。这样,您指望软件计时,您最终可能会得到严重偏斜的波形。我建议使用计时器。

  • Windows物联网不是实时操作系统。即使使用 高分辨率计时器它不能极其精确地重复操作 intervals(<1ms) 由于软件定时的不确定性。

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

    正如您所说,您可以尝试使用 SPI 的 DMA 模式。但, 不幸的是,似乎没有有效的驱动程序来操作 SPI DMA relate 在 Arduino 和 Windows IoT 核心中注册 Raspberry。那么你 可能需要自己写驱动。这是关于 的发展 Microsoft Windows 平台 的设备驱动程序。 Pwm 是一个 BCM2836驱动在Windows物联网内核上使用DMA你可以参考。