2016-10-12 9 views
4

두 개의 PWM 신호 (예 : PWM 입력)의 주파수 및 듀티 사이클을 얻고 입력에 따라 다른 PWM 신호 (즉 PWM 출력)를 설정하려고합니다. 이 PWM 신호의 듀티 사이클은 50 %이며 주파수 범위는 1kHz ~ 20kHz입니다.MS-IoT Lightning을 사용하여 Raspberry Pi2로 PWM을 설정/가져 오는 방법?

웹을 조금 확인했는데 Windows 10 IoT Core에서 Microsoft IoT Lightning 라이브러리 (예 : 버스 제공 업체)를 찾았습니다. 이 라이브러리는 PWM 소비자 예제에서도 필자가 필요로하는 것 같다.
그러나 PWM Consumer에 기초한 첫 번째 예제를 테스트하는 동안 PWM 컨트롤러 주파수 범위가 40Hz에서 1kHz로 제한된다는 것을 알았습니다. 따라서 첫 번째 문제는 주파수 범위가 지원되지 않는 것 같습니다.
또한 PWM 컨트롤러 속성 "ActualFrequency"는 "SetDesiredFrequencyMethod"를 통해 설정된 주파수를 반환하지만 PWMPin 개체는 현재 듀티 사이클에 대한 정보 만 제공합니다.

따라서 나는 몇 가지 대답을 찾기 위해 인터넷 검색을했고, 나는 이전의 두 가지 문제보다 훨씬 혼란 스럽다 this question을 발견했습니다.

가능하면 MS-IoT Lightning Library를 사용하여 Raspberry Pi2에서 1kHz ~ 20kHz의 PWM 신호를 설정/가져 오는 방법을 알고 있습니까? 여기

, 예제에서 코드의 몇 행 :

public async void Run(IBackgroundTaskInstance taskInstance) 
    { 
     if (!LightningProvider.IsLightningEnabled) 
     { 
      // Lightning provider is required for this sample 
      return; 
     } 

     var deferral = taskInstance.GetDeferral(); 

     // Use the PAC9685 PWM provider, LightningPCA9685PwmControllerProvider 
     pwmController = (await PwmController.GetControllersAsync(LightningPwmProvider.GetPwmProvider()))[0]; 
     motorPin = pwmController.OpenPin(0); 
     secondMotorPin = pwmController.OpenPin(1); 

     //// To use the software PWM provider, LightningSoftwarePwmControllerProvider, with GPIO pins 5 and 6, 
     //// uncomment the following lines and comment the ones above 
     //pwmController = (await PwmController.GetControllersAsync(LightningPwmProvider.GetPwmProvider()))[1]; 
     //motorPin = pwmController.OpenPin(5); 
     //secondMotorPin = pwmController.OpenPin(6); 

     pwmController.SetDesiredFrequency(50); 
     motorPin.SetActiveDutyCyclePercentage(RestingPulseLegnth); 
     motorPin.Start(); 
     secondMotorPin.SetActiveDutyCyclePercentage(RestingPulseLegnth); 
     secondMotorPin.Start(); 

     timer = ThreadPoolTimer.CreatePeriodicTimer(Timer_Tick, TimeSpan.FromMilliseconds(500)); 
    } 

    private void Timer_Tick(ThreadPoolTimer timer) 
    { 
     iteration++; 
     if (iteration % 3 == 0) 
     { 
      currentPulseLength = ClockwisePulseLength; 
      secondPulseLength = CounterClockwisePulseLegnth; 
     } 
     else if (iteration % 3 == 1) 
     { 
      currentPulseLength = CounterClockwisePulseLegnth; 
      secondPulseLength = ClockwisePulseLength; 
     } 
     else 
     { 
      currentPulseLength = 0; 
      secondPulseLength = 0; 
     } 

     double desiredPercentage = currentPulseLength/(1000.0/pwmController.ActualFrequency); 
     motorPin.SetActiveDutyCyclePercentage(desiredPercentage); 

     double secondDesiredPercentage = secondPulseLength/(1000.0/pwmController.ActualFrequency); 
     secondMotorPin.SetActiveDutyCyclePercentage(secondDesiredPercentage); 
    } 

모든 최고의, 로렌조

답변

0

라즈베리 PI (이것은 캐시와 분기 예측이있다) 실시간 시스템이 아닙니다 그래서 할 수 없습니다 프로세스 PWM 신호. 명령이 캐시 새로 고침을 초래할 때 정확히 마이크로 초 타이밍을 정확하게 측정 할 수 없거나 너무 많은 if 문이 예측에 실패하는 경우를 측정 할 수 없습니다. Microsoft IoT Lightning은 실시간으로 예제로 arduino를 제공합니다.

+0

Ok @ Servé, RPi (즉, Raspberry Pi)는 실시간 시스템이 아닙니다. 그런 다음 MS-IoT (Microsoft IoT Lightning) 번개를 어떻게 사용합니까? 그 목적은 무엇입니까? –

+0

나는 그 도서관에 대해 잘 모른다. 소스를 보면 Arduino를 위해 제작 된 것 같습니다. 어쩌면 다른 사람이 도울 수 있습니다 – Laurijssen

+0

누군가가 도울 수 있는지 보자;) –

1

IoT 번개 프레임 워크는 PWM 컨트롤러 출력 주파수에 소프트웨어 제한이있는 것 같습니다 (file 참조).

번개 복제본을 만드는 것이 좋을지 모르겠지만 최대/최소 주파수 상수를 수정하고 프로젝트를 빌드 한 다음 누젠트를 참조하는 대신 소스 프로젝트에서 직접 참조하십시오 꾸러미.

범위로 테스트 한이 접근 방식을 기대합니다.

번개 드라이버를 사용하는 대신에 pwm 장치 드라이버가있는 기본 인 박스 드라이버를 사용하여 1kHz 이상의 높은 주파수를 사용할 수 있는지 확인하십시오.

+0

BCM 드라이버 링크에 감사드립니다! 지금은 리눅스로 옮겨서 [PiGPIO 라이브러리] (http://abyz.co.uk/rpi/pigpio/), 데몬 및 파이썬 인터페이스를 사용하여 문제를 해결했습니다. 따라서 외부 소스에서 PWM을 읽고 생성 할 수있었습니다. –