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

 

版权声明:本文为ssvip原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/ssvip/p/12888523.html