我接到一个需求,需要调节LED灯的亮度,且是从上位机进行控制,我了解到树莓派也有PWM,就准备通过PWM来控制灯的亮度。
PWM又叫脉宽调制,是用微处理器的数字输出来对模拟电路进行控制,对模拟信号电平进行数字编码。
微软也提供了PWM的类库
https://docs.microsoft.com/en-us/uwp/api/windows.devices.pwm?view=winrt-19041
于是我根据msdn写了一段实现PWM控制的代码
private async void InitPWM() { try { _pwmController = await PwmController.GetDefaultAsync();//获取系统上的默认PWM控制器. _pwmController.SetDesiredFrequency(40);//设置PWM频率 _redLed = controller.OpenPin(__redLed);//打开22引脚 _redLed.SetActiveDutyCyclePercentage(20);//设置占空比 _redLed.Start(); } catch(Exception ex) { } }
定义:
private int __redLed = 22; private PwmPin _redLed; private PwmController _pwmController;
但控制失败了。我查了一下,树莓派是通过GPIO编程来实现PWM,于是改成了下面这样
private async void SetupGPIO() { try { var gpioController = GpioController.GetDefault(); var pwmManager = new PwmProviderManager(); pwmManager.Providers.Add(new SoftPwm()); var pwmControllers = await pwmManager.GetControllersAsync(); _pwmController = pwmControllers[0]; _pwmController.SetDesiredFrequency(1000);//频率只支持40-1000赫兹 _redLed = _pwmController.OpenPin(__redLed); _redLed.Start(); } catch (Exception ex) { } }
就可以通过改变引脚的占空比来改变灯的亮度了
_redLed.SetActiveDutyCyclePercentage(0.5);//设置引脚的占空比百分比
需要注意的是,这个PWM控制器只支持40-1000赫兹的频率,超过或低于这个区间都会出错。