1

我正在为 Raspberry Pi 2 开发信号发生器 Windows IoT 通用 javascript 应用程序。

我通过 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 数据表BCM2836 数据表数据表中查看了 dma 寄存器。我找不到任何解决方案如何管理 Raspberry Pi 时钟中断,只有引脚中断。

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

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

正弦波

提前致谢。

4

1 回答 1

1
  • 如果可能,您可以尝试使用 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 模式。但是,不幸的是,似乎没有有效的驱动程序可以在 Arduino 和 Windows IoT 核心中操作 SPI DMA 相关的 Raspberry 寄存器。因此,您可能需要自己编写驱动程序。这是关于为 Microsoft Windows 平台开发设备驱动程序的Pwm是在 Windows IoT 核心上使用 DMA 的 BCM2836 驱动程序,您可以参考。

于 2016-11-29T07:42:59.850 回答