标签:
杂谈 |


什么是PWM
PWM在拼音输入法里是“抛物面”的缩写,英文全称为“Pulse-Width Modulation”,当然,也有一些外行人士将其译为“脉冲宽度调制”。
至此,今天的主角已经粉墨登场。就像所有的剧情一样,这里还要请出来一位配角“占空比(Duty)”。占空比是指脉冲信号的通电时间与通电周期之比。在一串理想的脉冲周期序列中(如方波),正脉冲的持续时间与脉冲总周期的比值。
从上面的可以看出,PWM波有两个重要变量,Duty与周期(T)。对于应用设计来说,我们是预先设定周期,仅通过调节Duty的大小来实现我们的应用设计,也正是如此,用数字电路的方式实现了模块电路的功能。接下来,我们再来仔细讨论一下“为什么要有PWM波”
为什么要有PWM波
我们知道,模拟信号的值可以连续变化,其时间和幅度的分辨率都没有限制。模拟电压和电流可直接用来进行控制,如收音机的音量控制,拧动旋钮时,电阻值变大或变化,从而改变了驱动扬声器的电流值,使音量相应变大或变小。
尽管模拟控制看似直观而简单,但它并不总是非常经济或可行的。其中重要一点就是,模拟电路容易随时间漂移,因而难以调节。精密模拟电路可以解决这个问题,但难免非常庞大、笨重和昂贵。模拟电路还可能严重发热,其功耗于工作元件两端电压与电流的乘积成正比。模拟电路还对噪声很敏感,任何扰动或噪声都会改变电流值的大小。
而通过以数字方式控制模拟电路,可以大幅度降低系统的成本和功耗。具体的原理就是“对冲量(脉冲)作用于时间函数器件(典型的电感电容)而言。即冲量作用于时间函数器件时,如果冲量幅值对时间的积分相等(冲量时间曲线下的面积相等)则可以认为这些冲量等效。”毕竟这里不是学堂,上面这段话是本篇最具有学术的文字了,其实,数字电路只会输出0和1,那么想输出0.5肿么办啊?便高速输出01010101…,取平均之后就是0.5了,是不是早这么说就可以了。以下将进入我们实践与应用之中。
如何产生PWM
对我们英特尔伽利略开发板而言,开发板上内置了6路PWM输出IO,分别为IO3,IO5, IO6, IO9, IO10, IO11六路,虽然,伽利略使用了专用芯片来实现PWM输出,并且有8路,但是我们目前只能使用这六路。
其实,伽利略有三种方式来实现PWM波的输出,分别为使用PWM寄存器方式,手动控制输出方式与用analogWrite(pin, val)命。第一个实现方式较为复杂,不是本文的重点,在此忽略。第二方式呢,实现也比较简单,例如下面的代码:
}
void loop(){
digitalWrite(PWMpin, HIGH);
delayMicroseconds(200);
digitalWrite(PWMpin, LOW);
delayMicroseconds(500 - 200);
}
简简几行代码过后,英特尔伽利略就会产生一个占空比为40%,周期为2ms的PWM波(500Hz),可以看出所有引脚均可输出PWM波,但是,MCU也只能干这一个活了……
对于当今复杂系统与多种应用来说,上面的方式无疑是不可取的。那么第三种方式analogWrite(pin, val)函数便是我们所希望的,正如其命名一样——模拟写入。
Int duty = 64;
void setup(){
pinMode(pin, OUTPUT);
}
void loop(){
analogWrite(pin, duty);
}
上面这段代码同样可以产生20%的占空比,只是频率为Arduino的固定值约490Hz。我们可以通过修改duty值来改变占空比,并实现我们自己的应用设计。
PWM主要用来做什么
通过上面的理论知识,再联系我们的实际应用。PWM波调制主要用于以下几个方面的控制:
1、PWM波调节LED灯亮度;
2、PWM波控制直流电机;
3、PWM波控制舵机;
4、还有很多很多应用……
调节LED灯亮度
控制直流电机
控制舵机
还有更多…
文章写到这里,并没有贴出典型应用的源代码,一方面是篇幅的原因,另一方面,我想Maker们也想去设计并实现自己的应用了。
加入我们的粉丝群,就有机会和这些老师一起切磋讨论哟,不要犹豫速速动手。
作者简介
EEPW论坛版主,硕士研究生学历,中级工程师职称,研发项目经理。从事公司主要产品的硬件与软件设计,项目管理等。
长按下方二维码,关注英特尔物联网微信平台,了解更多物联网精彩资讯!