2016-11-28 7 views
1

IOT 2つの実行中のウィンドウを中断します。クロックを使用する方法はありますがラズベリーパイの上に、私はSPIを通してそれにMCP4921 DACを接続ラズベリーパイ2.</p> <p>へのjavascriptアプリケーション信号発生器のWindows IOTユニバーサルを開発しています

私がしようとしているのは、与えられた周波数、振幅、オフセットで正弦波を生成することです。私はすでにデバイスが動作していますが、正確なウェーブを生成しようとすると、10Hzの正確なsin波でさえもアプリケーションが遅くなります。

現在の波は、このように生成されます。

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); 
     } 
    }); 
}); 

私は、私はそれが良い習慣ではないことを知って、それが再び少なくとも10ミリ実行する前のを待つにするsetIntervalを使用しようとしました。

ラズベリータイマー、クロック、またはカスタム割り込みISR機能を0.1 msごとに実行する方法はありますか?

私は既にBCM2835 DatasheetBCM2836 Datasheetデータシートにdmaレジスタを見ました。私は、どのようにラズベリー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)で操作を繰り返すことはできません。

    OS階層に基づいて実装された であるため、割り込みISRが問題を解決できるとは思わないです。

    上記のとおり、SPIのDMAモードを試してみることもできます。しかし、 は、残念ながら、SPI DMAを操作するための有効なドライバがアルドゥイーノとWindowsのIoTコアにラズベリーの レジスタの両方に関連しないようです。だから、 あなた自身でドライバを書く必要があるかもしれません。これは約development of device drivers for the Microsoft Windows platformです。 Pwmは、 Windows IoTコアでDMAを使用しているBCM2836ドライバです。

関連する問題