pwm原理及arduino使用pwm教程详解(超详细超基础)


前言

此篇文章以一个通俗的方式带你了解PWM信号,写得非常详细和基础,但是在实际arduino编程中也够用了。如果有瑕疵的地方欢迎大家在评论区留言,我将及时改正,如果觉得写的不错的话也不要忘了点赞吖~


一、PWM到底是什么

    PWM的专业解释叫做脉冲宽度调制,是不是感觉很抽象,其实我刚开始学的时候也感觉比较抽象,所以我们就先不纠结这个啦,来我们换一种方法来认识PWM信号。(大佬可以略过了,因为下面讲的很基础繁琐)

    我们来先提出一个问题,假设你有一块开发板,开发板的一个引脚连接了一个LED小灯,我们想控制LED小灯的亮度(控制电机转速也行,反正哪样方便就哪样),你作为一个开发者,你会怎么来实现呢?

    要控制LED小灯的亮度,那么只需要控制输入电压就行了,当输入电压比较高的时候,LED就较亮,当输入电压比较低的时候LED亮度较弱。

    所以此刻你想到的可能是通过设置LED引脚的电压大小来控制LED小灯的亮度。嗯,好像也对。。但是如果只有这样简单那我们还说什么PWM。问题出在哪儿呢?

    实际上要想控制引脚的电压高低并不是那么容易的事情,很多开发板都没有能直接控制引脚电压的功能。这种情况下,引脚的电压只能是高电平或者低电平这两个值,所以LED小灯要么只能亮,要么只能不亮。

    既然我们不能控制引脚的电压,有想控制LED小灯的亮度,那只能寻找其他办法啦。好了好了,再不说PWM的话,想必你们也要不耐烦啦。下面就有请PWM登场。

    下图是三个信号,信号1一直保持高电平,信号2一直保持低电平,如果这两个信号接到LED小灯上,那可以很容易的想到:信号1的情况下LED保持亮,信号2的情况下LED熄灭。信号3其实就是一个典型的PWM信号啦。可以看到信号3是不停的在高电平和低电平之间跳动,那么在这种情况下LED小灯会怎么样呢?

图1

    聪明的你应该已经想到啦,在信号3的情况下,LED小灯是不断闪烁的,可以在实际生活中PWM信号的频率都很高,当频率很高的时候,我们肉眼就察觉不到LED小灯在闪烁了,此时看到的就是LED小灯常亮,不同的是LED小灯虽然是常亮,但是亮度有信号1情况下那么强吗?当然没有啦。

    总结一下,信号1情况下LED小灯一直亮,信号2情况下LED小灯熄灭,信号3也就是PWM信号下,LED小灯也处于亮的状态,只是亮度稍弱。

    坚持一下,下面是PWM信号的重中之重。我们来看另外3个PWM信号:
图2
    发现这三个信号的不同点和相同点了吗?先来看相同点吧,是不是周期是一样的,换句话说这三个信号的频率是一样的,那不同点呢,就是在一个周期T里面,高电平和低电平所占的百分比是不一样的。如果用这三个信号来驱动LED小灯,LED亮度一样吗,不一样的话,哪个亮度最强?

    相信你已经知道了,同样频率的信号4、信号5、信号6,它们驱动LED小灯的亮度是不一样的。亮度依次是:信号6 > 信号5 信号4,为什么会出现这种情况呢,因为高电平占的百分比不一样

    高电平的百分比其实有个专业术语叫做占空比,即是指在一个脉冲循环内,通电时间相对于总时间所占的比例。举个例子,上面的三个信号假设周期为1ms,信号4的占空比为20%,那么也就是说在1ms内,高电平占了0.2ms。懂了吧,这个就是占空比。占空比不一样,LED小灯的亮度就不一样,占空比越高,LED小灯就越亮。下面是不同占空比的信号对比。
图3

来总结一下吧,PWM信号其实就是一种占空比可以调节的信号,其实就是用占空比的调节来达到类似于模拟信号的效果。占空比越高,其效果就越强。

二、arduino使用PWM

如果你只是想知道PWM信号是什么,那么就不用往下看啦

  • 语法

    arduino里面可以使用函数analogWrite()来实现PWM输出。具体用法为:

analogWrite(pin, value)`

//pin: 设置引脚编号
//value: 设置PWM信号强度,value介于0和255之间,当value为255时占空比最大,当value为0时占空比最小
  • 示例

    将LED小灯的正极串联一个电阻接到arduino开发板的9引脚,负极连接到arduino开发板的GND引脚,上传下面代码:

int ledPin = 9;      //LED小灯连接的引脚
int val = 0;         // LED小灯亮度

void setup() {
  pinMode(ledPin, OUTPUT);  // sets the pin as output
}

void loop() {
  for(val=0;val<255;val++){
    analogWrite(ledPin, val); // 设置PWM输出,val越大,PWM占空比越大,led越亮
    delay(10);//延迟
  }
  for(val=255;val>=0;val--){
    analogWrite(ledPin, val); // 设置PWM输出,val越大,PWM占空比越大,led越亮
    delay(10);//延迟
  }
  delay(1000);
}

上传代码后就可以看到LED小灯由暗变亮,再由亮变暗啦。

总结

    此文首先演示了PWM信号的原理,再从实际角度出发演示了arduino中如何使用PWM信号。真心希望能帮到大家,不足的地方望大家指正呀。

  • 18
    点赞
  • 77
    收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
评论 1

打赏作者

m0_46336441

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值