2016-11-28 68 views
1

我开发信号发生器的Windows物联网通用的JavaScript应用程序树莓派2有没有办法使用时钟的方式中断对树莓PI 2个运行Windows IOT

我连MCP4921 DAC它直通SPI。

我想要做的是产生给定的频率,振幅和偏移量的正弦波。我已经有了设备的工作,但是当我尝试产生准确的波形时,应用甚至会使10Hz准确的正弦波减慢。

当前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毫秒后再运行。

是否有任何方法修改树莓定时器,时钟或任何运行自定义中断ISR功能每0.1毫秒?

我已经看过dma寄存器BCM2835 DatasheetBCM2836 Datasheet数据表。我无法找到任何解决方案,只有在引脚中断的情况下才能管理Raspberry Pi时钟中断。

我也知道如何在Arduino Uno中完成它,但它不会帮助我,因为我不知道如何操作覆盆子寄存器。

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

Sine Wave

在此先感谢。

回答

1
  • 如果可能的话,你可以尝试使用LUT为正弦一代,因为这些 行:

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

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

  • 如果你的目的是通过计算经过时间calcualte正弦波值,我不认为你应该首先使用

      `time += updateFreq;` 
    

    。这样,你就依赖于软件时序,最终可能会出现严重偏斜的波形。我会建议使用一个计时器。

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

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

    正如您所提到的,您可能会尝试使用SPI的DMA模式。但是,不幸的是,在Arduino和Windows IoT核心中,操纵SPI DMA的似乎没有任何有效的驱动程序涉及Raspberry的 寄存器。所以,你可能需要自己写驱动程序。这大约是development of device drivers for the Microsoft Windows platformPwm是一个 BCM2836驱动程序在Windows IoT核心上使用DMA,您可以参考。

相关问题