Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在运行windows iot的raspberry pi 2上有没有办法使用时钟中断_Javascript_Raspberry Pi2_Spi_Windowsiot_Isr - Fatal编程技术网

Javascript 在运行windows iot的raspberry pi 2上有没有办法使用时钟中断

Javascript 在运行windows iot的raspberry pi 2上有没有办法使用时钟中断,javascript,raspberry-pi2,spi,windowsiot,isr,Javascript,Raspberry Pi2,Spi,Windowsiot,Isr,我正在为Raspberry Pi 2开发信号发生器Windows Iot通用javascript应用程序 我通过SPI将MCP4921 DAC连接到它 我想做的是产生具有给定频率、振幅和偏移量的正弦波。我已经让设备工作,但当我试图产生精确的波,应用程序是减慢甚至10赫兹精确的正弦波 目前波浪是这样产生的 var Spi = Windows.Devices.Spi; var Enumeration = Windows.Devices.Enumeration; var frequency = 10

我正在为Raspberry Pi 2开发信号发生器Windows Iot通用javascript应用程序

我通过SPI将MCP4921 DAC连接到它

我想做的是产生具有给定频率、振幅和偏移量的正弦波。我已经让设备工作,但当我试图产生精确的波,应用程序是减慢甚至10赫兹精确的正弦波

目前波浪是这样产生的

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毫秒才能再次运行

是否有任何方法可以修改raspberry定时器、时钟或任何东西,以便每0.1毫秒运行一次自定义中断ISR功能

我已经看过dma寄存器和数据表了。我找不到任何解决方案来管理Raspberry Pi时钟中断,只有pin中断

我也知道如何在Arduino Uno中使用它,但这对我没有帮助,因为我不知道如何操作覆盆子寄存器

这是生成的正弦波的图像

提前感谢。

  • 如果可能,您可以尝试使用LUT生成正弦,因为 线路:

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

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

             `time += updateFreq;`
    
    首先。这样,如果你指望软件计时,你可能会得到严重的波形扭曲。我建议使用计时器

  • Windows IoT不是实时操作系统。即使使用 高分辨率定时器它不能以极其精确的速度重复操作 间歇(
             `time += updateFreq;`