我正在开发信号发生器Windows Iot通用javascript应用程序到树莓Pi 2。
我通过SPI将MCP4921 DAC连接到它。
我想做的是生成具有给定频率、振幅和偏移量的正弦波。我已经让设备工作了,但当我试图产生精确的波时,应用程序是减慢甚至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);
}
});
});
是否有任何方法可以修改复盆子定时器、时钟或任何东西,以每0.1ms运行一次自定义中断ISR功能?
我已经查看了dma寄存器
BCM2835 Datasheet
和
BCM2836 Datasheet
数据表。我找不到任何解决方案来管理复盆子Pi时钟中断,只有引脚中断。
我也知道如何在Arduino Uno中进行,但这对我没有帮助,因为我不知道如何操作复盆子寄存器。
这是生成的正弦波的图像。
提前谢谢。