2016-11-28 67 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,您可以參考。

相關問題