1

Raspberry Pi 2 へのシグナル ジェネレーター Windows Iot ユニバーサル JavaScript アプリケーションを開発しています。

MCP4921 DAC を SPI 経由で接続しました。

私がやろうとしているのは、特定の周波数、振幅、およびオフセットで正弦波を生成することです。私はすでにデバイスを動作させていますが、正確な波を生成しようとすると、アプリケーションは 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) で操作を繰り返すことはできません。

    OSレイヤーに基づいて実装されているため、割り込みISRで問題を解決できるとは思いません。

    あなたが述べたように、SPI の DMA モードを使用してみてください。しかし、残念ながら、Arduino と Windows IoT コアの両方で、Raspberry の SPI DMA 関連レジスタを操作するための有効なドライバーはないようです。そのため、ドライバーを自分で作成する必要がある場合があります。これは、Microsoft Windows プラットフォーム用のデバイス ドライバーの開発に関するものです。Pwmは、参照できる Windows IoT コアで DMA を使用する BCM2836 ドライバーです。

于 2016-11-29T07:42:59.850 に答える