前言
脉宽调制(PWM)是指用微处理器的数字输出来对模拟电路进行控制,是一种对模拟信号电平进行数字编码的方法。在树莓派上,可以通过C#对GPIO的编程来实现PWM。
PWM通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%.

目前.Net Core PWM仅支持软件PWM,但是高精度软件PWM占用大量资源,并使用高优先级线程。如果使用多个高精度软件PWM,则可能会遇到资源问题。所以建议优先选择硬件PWM,只有对PWM要求不高的情况下,才使用软件PWM。C#操作硬件PWM可以参考 https://github.com/unosquare/wiringpi-dotnet 。
硬件连接
在本篇中,将会实现一个呼吸灯,因此采用一个LED灯珠即可。将LED灯珠正极连接到GPIO17,负极连接到GND。


编写程序
首先创建一个控制台应用程序,然后通过Nuget引入“System.Device.Gpio”和“Iot.Device.Bindings”两个包。
将在Main方法中写入以下代码:
static void Main(string[] args)
{
SoftwarePwmChannel pwmChannel = null;
Console.WriteLine("Hello PWM!");
//注册退出事件
Console.CancelKeyPress += (object sender, ConsoleCancelEventArgs eventArgs) =>
{
Console.WriteLine("nPWM Exit!");
};
try
{
using (pwmChannel = new SoftwarePwmChannel(17))
{
pwmChannel.Start();
for (double fill = 0.0; fill <= 1.0; fill += 0.01)
{
pwmChannel.DutyCycle = fill;
Thread.Sleep(300);
}
for (double fill = 1.0; fill >= 0.0; fill -= 0.01)
{
pwmChannel.DutyCycle = fill;
Thread.Sleep(300);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
发布,然后上传树莓派运行就可以看到呼吸灯效果。
SoftPwm使用步骤
首先创建一个Softpwm对象。
var softwarePwmChannel = new SoftwarePwmChannel(17); //默认频率400,占空比0.5
默认情况下,SoftwarePwmChannel使用低优先级时钟来模拟PWM,用于点亮一个LED是没问题的。如果使用了时间敏感元件的话,可以添加参数usePrecisionTimer: true使用更高精度的SoftPwm。
var softwarePwmChannel = new SoftwarePwmChannel(17, usePrecisionTimer: true); //默认频率400,占空比0.5
然后启动PWM
pwmChannel.Start();
要让LED呈现呼吸灯效果,就要修改占空比,来控制输出电压。
for (double fill = 0.0; fill <= 1.0; fill += 0.01)
{
pwmChannel.DutyCyclePercentage = fill;
Thread.Sleep(300);
}
停止PWM
在控制台程序运行过程中,可以通过注册Ctrl+C事假,来停止PWM并退出程序。
//注册退出事件
Console.CancelKeyPress += (object sender, ConsoleCancelEventArgs eventArgs) =>
{
if(pwmChannel != null)
{
pwmChannel.Stop();
}
Console.WriteLine("nPWM Exit!");
};
文章评论