Я хотел бы получить частоту и рабочий цикл двух сигналов ШИМ (например, входов ШИМ) и установить их для другого (например, выхода ШИМ) в зависимости от входов. Эти ШИМ-сигналы имеют рабочий цикл 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);
}
Всего наилучшего, Лоренцо