2016-11-28 3 views
1

I-Signalgenerator Windows-Iot universal entwickle JavaScript-Anwendung zu Raspberry Pi 2.Gibt es eine Möglichkeit Uhr zu verwenden, unterbricht auf Raspberry Pi 2 mit Windows iot

I MCP4921 DAC durch SPI mit ihm verbunden.

Was ich versuche zu tun ist, Sinus mit gegebener Frequenz, Amplitude und Offset zu erzeugen. Ich habe bereits Gerät funktioniert, aber wenn ich versuche, genaue Welle zu erzeugen, ist Anwendung zu verlangsamen sogar 10 Hz genaue Sinuswelle.

Derzeit wird so eine Welle generiert.

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

Ich versuchte setInterval zu verwenden, ich weiß, dass es keine gute Praxis ist, es ist atleast 10 ms, bevor läuft wieder warten.

Gibt es Möglichkeiten, Raspberry Timer, Uhr oder was auch immer zu ändern, um benutzerdefinierte Interrupt ISR-Funktion alle 0,1 ms auszuführen?

Ich schaute bereits dma Register bei BCM2835 Datasheet und BCM2836 Datasheet Datenblatt. Ich kann keine Lösungen finden, wie man Raspberry Pi-Taktunterbrechungen nur auf Nadelunterbrechungen handhaben kann.

Ich weiß auch, wie es in Arduino Uno zu tun, aber es wird mir nicht helfen, wie ich Himbeerregister nicht manipulieren kann.

Hier ist ein Bild der generierten Sinuswelle.

Sine Wave

Vielen Dank im Voraus.

Antwort

1
  • Wenn möglich, können Sie versuchen, LUT zu verwenden für Sinus Generation, weil diese Linien:

     var value = offset + amplitude * Math.sin(2 * Math.PI * frequency * time); 
         var dacValue = parseInt(resolution/voltage * value); 
    

    sind sehr zeitaufwendig. Im Wesentlichen benötigen Sie für die LUT vorgenerierte Samples der Sinuswelle und speichern diese im RAM.

  • Wenn Ihre Absicht ist es, den Sinuswert calcualte durch die verstrichene Zeit zu zählen, ich glaube nicht, sollten Sie

      `time += updateFreq;` 
    

    in erster Linie verwendet werden. Auf diese Weise zählen Sie auf das Timing der Software, sodass Sie möglicherweise stark verzerrte Wellenformen erhalten. Ich würde vorschlagen, einen Timer zu verwenden.

  • Windows IoT ist kein Echtzeitbetriebssystem. Selbst wenn der hochauflösende Timer verwendet wird, kann er aufgrund von Software-Timing-Unsicherheiten keine Operationen in extrem genauen Intervallen (< 1ms) wiederholen.

    Ich glaube nicht, Interrupt ISR kann Ihr Problem lösen, weil es auch basierend auf OS-Schicht implementiert ist.

    Wie Sie bereits erwähnt haben, können Sie versuchen, den DMA-Modus des SPI zu verwenden. Aber, leider scheint es keinen gültigen Treiber zu manipulieren SPI DMA beziehen Register von Raspberry sowohl in Arduino und Windows IoT-Core.Also, Sie müssen möglicherweise den Treiber selbst schreiben. Dies ist ungefähr development of device drivers for the Microsoft Windows platform. Pwm ist ein BCM2836-Treiber, der DMA auf Windows IoT-Core verwendet, auf die Sie verweisen können.

Verwandte Themen