2016-11-28 17 views
1

Я разрабатываю генератор сигналов для Windows ВГД Универсального Javascript приложения для Raspberry Pi 2.Есть ли способ использовать часы прерывание на Raspberry Pi 2 запущенных окон ВГДА

Я подключен MCP4921 DAC к нему через SPI.

Я пытаюсь создать синусоидальную волну с заданной частотой, амплитудой и смещением. У меня уже работает устройство, но когда я пытаюсь создать точную волну, приложение должно замедлять даже точную синхронную волну 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-х мс перед запуском снова.

Есть ли способ изменить таймер малины, часы или что-то другое для выполнения функции прерывания ISR на каждые 0,1 мс?

Я уже смотрел dma регистратуры на BCM2835 Datasheet и BCM2836 Datasheet техническое описание. Я не могу найти никаких решений, как управлять прерываниями малины 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 вам нужно предварительно сгенерированных образцов синусоидальной волны и сохранить их в ОЗУ.

  • Если вы задумали calcualte значения синусоидального пути подсчета затраченного времени, я не думаю, что вы должны использовать

      `time += updateFreq;` 
    

    в первую очередь. Таким образом, вы рассчитываете на время программного обеспечения, вы можете столкнуться с серьезными искаженными волнами. Я бы предложил использовать таймер.

  • Windows IoT - это не операционная система в режиме реального времени. Даже при использовании таймера с высоким разрешением он не может повторять операции с чрезвычайно точными интервалами (< 1 мс) из-за неопределенности программного обеспечения.

    Я не думаю, что прерывание ISR может решить вашу проблему, потому что это также реализовано на основе уровня ОС.

    Как вы упомянули, вы можете попробовать использовать режим DMA SPI. Но, , к сожалению, кажется, что не действительный драйвер для управления SPI DMA связан регистров малины как в Arduino, так и в ядре Windows IoT.Таким образом, вам может понадобиться написать драйвер самостоятельно. Это примерно development of device drivers for the Microsoft Windows platform. Pwm является драйвером BCM2836 с использованием DMA в ядре IoT Windows, с которым вы можете ссылаться.