夸克之书

  • 首页
  • 科普
  • 笔记
  • C#
  • 物联网
  • 算法
  • Linux
  • 树莓派
夸克之内,别有洞天
  1. 首页
  2. 树莓派
  3. 正文

树莓派.Net Core Iot入门系列篇(6):PWM

2019-10-09 1431点热度 0人点赞 0条评论

前言

脉宽调制(PWM)是指用微处理器的数字输出来对模拟电路进行控制,是一种对模拟信号电平进行数字编码的方法。在树莓派上,可以通过C#对GPIO的编程来实现PWM。

PWM通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%.

树莓派.Net Core Iot入门系列篇(6):PWM插图
PWM波形

目前.Net Core PWM仅支持软件PWM,但是高精度软件PWM占用大量资源,并使用高优先级线程。如果使用多个高精度软件PWM,则可能会遇到资源问题。所以建议优先选择硬件PWM,只有对PWM要求不高的情况下,才使用软件PWM。C#操作硬件PWM可以参考 https://github.com/unosquare/wiringpi-dotnet 。

硬件连接

在本篇中,将会实现一个呼吸灯,因此采用一个LED灯珠即可。将LED灯珠正极连接到GPIO17,负极连接到GND。

树莓派.Net Core Iot入门系列篇(6):PWM插图1
连线
树莓派.Net Core Iot入门系列篇(6):PWM插图2
树莓派GPIO

编写程序

首先创建一个控制台应用程序,然后通过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!");
};
本作品采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可
标签: 暂无
最后更新:2020-12-13

Afirefish

夸克之内,别有洞天

打赏 点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

Afirefish

夸克之内,别有洞天

搜索文章
分类目录
  • C# (28)
  • Linux (3)
  • 树莓派 (13)
  • 物联网 (19)
  • 科普 (4)
  • 笔记 (30)
  • 默认 (44)
最新 热点 随机
最新 热点 随机
树莓派PWM风扇控制 PVE重启后LVM Thin数据丢失,错误:Volume group "****" has insufficient free space (128 extents): 4048 required. OpenWrt配置SmartDNS OpenWrt x86安装Frpc Intel网卡开机显示Initializing Intel(R) Boot Agent GE v1.5.50 IdentityServer4证书创建 免费本地解析域名(locallocal.cn),支持HTTPS 使用淘宝npm以及安装cnpm
你见过哪些有趣的代码?修改PostgreSQL数据库默认用户postgres密码在VS Code开发Arduino项目Error response from daemon: cannot stop container: ******: Cannot kill container *******:.....单机Docker搭建FastDFSC# Json序列化时将长整型(long)属性序列化为Json字符串使用淘宝npm以及安装cnpm免费本地解析域名(locallocal.cn),支持HTTPS
简单开始异步编程(1) 树莓派.Net Core Iot入门系列篇(3):I2C 计算函数“System.Data.Entity.Insfrastructure.DbQuery.ToString()”超时 ESP8266 SmartConfig配置连网 树莓派PWM风扇控制 树莓派4更新EEPROM Steam饥荒专用服务器搭建 JQuery中arrt()和prop()的区别
最近评论
发布于 2 周前(02月21日) 好的谢谢,那我只能通过kill杀死推流指令进程来实现了。
发布于 2 周前(02月21日) 要用这个项目的话,你得自己拉代码来改了。做这玩意儿主要是考虑全天候的,没考虑过关[笑哭]
发布于 2 周前(02月21日) 就是想问有没有能通过代码控制的关闭推流的指令,而不需要手动控制。我想设置一个按钮来控制开始推流和结束...
发布于 2 周前(02月20日) 唔,没懂你意思,直接拔电源不就行了。不拔电源关闭推流服务也行撒。
发布于 2 周前(02月20日) 你好,我想问一下,如果不想推流了,该用什么方法停止树莓派推流呢?
书签
  • 打赏
  • 毒鸡汤(有点意思)
  • 米店
  • 金鱼直播间
放松一下
https://www.quarkbook.com/wp-content/uploads/2020/09/Yanni-Nightingale.flac
用户您好!请先登录!
登录 注册

COPYRIGHT © 2020 夸克之书. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

蜀ICP备15036129号-9

登录
注册|忘记密码?