2016-11-28 20 views
1

IOT 2 개 실행 창을 중단합니다.시계를 사용하는 방법이 있나요 라즈베리 파이에 내가 SPI를 통해 그것을 MCP4921 DAC를 연결 라즈베리 파이 2.</p> <p>에 자바 스크립트 응용 프로그램 신호 발생기 윈도우 여잔 보편적를 개발하고

내가하려는 것은 주어진 주파수, 진폭 및 오프셋으로 사인파를 생성하는 것입니다. 이미 장치가 작동하고 있지만 정확한 파형을 만들려고하면 응용 프로그램이 10Hz의 정확한 sin 파형을 느리게 만듭니다.

현재 이와 같은 웨이브가 생성됩니다.

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

나는, 다시의를 실행하기 전에이어야 10 밀리 기다릴 나는 그것이 좋은 방법이 아니라는 것을 알고, setInterval을 사용하려고.

0.1 밀리 초마다 사용자 정의 인터럽트 ISR 기능을 실행하기 위해 나무 딸기 타이머, 시계 또는 기타를 수정할 수있는 방법이 있습니까?

나는 이미 BCM2835 DatasheetBCM2836 Datasheet 데이터 시트에 dma 레지스터를 보았습니다. 나는 라즈베리 파이 클럭 중단을 관리하는 방법을 찾을 수 없다.

나는 또한 Arduino Uno에서이를 수행하는 방법을 알고 있지만, 나무 딸기 레지스터를 조작하는 방법을 알지 못해서 도움이되지 않습니다.

다음은 생성 된 사인파의 이미지입니다. 사전에

Sine Wave

감사합니다.

답변

1
  • 가능하다면, 당신은 사인 세대 때문에 이러한 라인을 LUT를 사용하려고 할 수 있습니다

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

    가 매우 시간이 소모됩니다. 본질적으로 LUT의 경우 사전 생성 된 사인파 샘플 인 을 RAM에 저장해야합니다. 당신의 의도가 경과 시간을 계산하여 사인파 값을 calcualte하는 경우

  • , 난 당신이 처음에

      `time += updateFreq;` 
    

    를 사용한다고 생각하지 않습니다. 이렇게하면 소프트웨어 타이밍에 의존하고 있습니다. 심하게 왜곡 된 파형으로 끝날 수 있습니다. 타이머 사용을 제안합니다.

  • Windows IoT는 실시간 운영체제가 아닙니다. 고해상도 타이머를 사용하더라도 소프트웨어 타이밍 불확실성 때문에 매우 정확하게 간격 (< 1ms)으로 작업을 반복 할 수 없습니다.

    OS 계층을 기반으로 구현 된 이기 때문에 인터럽트 ISR이 문제를 해결할 수 있다고 생각하지 않습니다.

    언급 한대로 SPI의 DMA 모드를 사용해 볼 수 있습니다. 그러나 불행히도 SPI DMA를 조작하는 유효한 드라이버는 Arduino와 Windows IoT 코어에 모두 라즈베리 등록과 관련이 있습니다.따라서 은 혼자서 드라이버를 작성해야 할 수도 있습니다. 약 development of device drivers for the Microsoft Windows platform입니다. Pwm은 참조 할 수있는 Windows IoT 코어에서 DMA를 사용하는 BCM2836 드라이버입니다.