代码之家  ›  专栏  ›  技术社区  ›  EspeH

在运行windows iot的raspberry pi 2上是否有使用时钟中断的方法

  •  1
  • EspeH  · 技术社区  · 8 年前

    我正在开发信号发生器Windows Iot通用javascript应用程序到树莓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);
            }
        });
    });
    

    是否有任何方法可以修改复盆子定时器、时钟或任何东西,以每0.1ms运行一次自定义中断ISR功能?

    我已经查看了dma寄存器 BCM2835 Datasheet BCM2836 Datasheet 数据表。我找不到任何解决方案来管理复盆子Pi时钟中断,只有引脚中断。

    我也知道如何在Arduino Uno中进行,但这对我没有帮助,因为我不知道如何操作复盆子寄存器。

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

    Sine Wave

    提前谢谢。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Jackie    8 年前
    • 如果可能,您可以尝试使用LUT生成正弦,因为 线:

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

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

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

               `time += updateFreq;`
      

      首先。这样,如果你依赖软件计时,你可能会得到严重的波形偏差。我建议使用计时器。

    • Windows物联网不是实时操作系统。即使使用 高分辨率计时器:它不能以非常精确的方式重复操作 由于软件定时不确定性,间隔(<1ms)。

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

      正如您提到的,您可以尝试使用SPI的DMA模式。但是 不幸的是,似乎没有有效的驱动程序来操作SPI DMA相关 在Arduino和Windows物联网核心中注册复盆子。那么,你 可能需要自己编写驱动程序。这是关于 development of device drivers for the Microsoft Windows platform . Pwm 是 BCM2836驱动程序在Windows物联网核心上使用DMA,您可以参考。