我接到一个需求,需要调节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赫兹的频率,超过或低于这个区间都会出错。