Как использовать MS-IoT Lightning для установки / получения ШИМ с Raspberry Pi2?

Я хотел бы получить частоту и рабочий цикл двух сигналов ШИМ (например, входов ШИМ) и установить их для другого (например, выхода ШИМ) в зависимости от входов. Эти ШИМ-сигналы имеют рабочий цикл 50%, а их частотный диапазон составляет от 1 кГц до 20 кГц.

Я немного проверил Интернет и обнаружил библиотеку Microsoft IoT Lightning (то есть поставщиков автобусов) из Windows 10 IoT Core. Кажется, эта библиотека - то, что мне нужно, даже с примером PWM Consumer!
Однако пока я тестировал свой первый пример на основе PWM Consumer one, я заметил, что диапазон частот контроллера PWM ограничен от 40 Гц до 1 кГц. Следовательно, первая проблема: диапазон частот кажется не поддерживаемым.
Более того, в то время как свойство контроллера PWM «ActualFrequency» возвращает частоту, установленную с помощью «SetDesiredFrequencyMethod», объекты PWMPin предоставляют только информацию о текущем рабочем цикле.

Поэтому я искал ответ в Google и нашел этот вопрос, который смущает меня даже больше, чем два предыдущих вопроса.

Знаете ли вы, возможно ли и как использовать библиотеку MS-IoT Lightning для установки / получения сигналов ШИМ от 1 кГц до 20 кГц на Raspberry Pi2?

Вот несколько строк кода из примера:

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

Всего наилучшего, Лоренцо


person Lorenzo R.    schedule 12.10.2016    source источник


Ответы (2)


Структура IoT Lightning, похоже, имеет программное ограничение на выходную частоту ШИМ-контроллера, см. файл.

Не уверен, что это сработает, но стоит попробовать создать клон репозитория. измените константы Max / MinFrequency, создайте проект и укажите на него ссылку непосредственно в исходном проекте вместо ссылки на пакет nuget.

Я с нетерпением жду, когда этот подход будет протестирован с помощью прицела.

В качестве альтернативы, вместо использования драйвера Lightning, используйте драйвер почтового ящика по умолчанию, драйвер устройства pwm для которого можно найти в здесь, попробуйте использовать более высокую частоту выше 1 кГц.

person Jackie    schedule 02.11.2016
comment
спасибо за ссылку на драйвер BCM! На данный момент я решил свою проблему, перейдя на Linux и использовав библиотеку PiGPIO, демон , и интерфейс Python. Таким образом, я смог читать и генерировать ШИМ из внешнего источника и из него. - person Lorenzo R.; 03.11.2016

Raspberry PI не является системой реального времени (у него есть кеш и предсказание ветвлений), поэтому он не может обрабатывать сигналы PWM просто так. Он просто не может точно измерить микросекундные тайминги, когда инструкция вызывает обновление кеша или слишком много, если инструкции не соответствуют их прогнозу. Microsoft IoT Lightning приводит в качестве примера arduino, который работает в режиме реального времени.

person Serve Laurijssen    schedule 12.10.2016
comment
Хорошо, @ Servé, меня устраивает, что RPi (то есть Raspberry Pi) не является системой реального времени. Тогда как бы вы использовали MS-IoT (то есть Microsoft IoT Lightning) Lightning? Какова его цель? - person Lorenzo R.; 12.10.2016
comment
Я не знаю об этой библиотеке. Судя по источнику, кажется, что он сделан для Arduino. может кто-нибудь еще может помочь - person Serve Laurijssen; 13.10.2016
comment
посмотрим, может ли кто-нибудь помочь;) - person Lorenzo R.; 21.10.2016