18908| 5
|
[入门] Arduino系列教程之一——PWM的秘密(上) |
PWM是啥玩意儿? PWM是“怕玩命”的缩写,英文写法是“Pulse-width modulation”,也有些外行人士把它翻译成“脉冲宽度调制”。Arduino有很多种版本,这篇文章里是以ATmega168为例,有用过其他型号的兄弟请补充。 PWM是用占空比不同的方波,来模拟“模拟输出”的一种方式。靠,这个太拗口了,简而言之就是电脑只会输出0和1,那么想输出0.5怎么办呢?于是输出01010101….,平均之后的效果就是0.5了。早这么说就了然了嘛。 PWM有神马作用? 举几个例子说明: 如何产生PWM? Arduino有三种方式可以产生PWM。第一种: 用analogWrite(pin, val)命令 其中pin是腿的编号,传说中只能用3,5,6,9,10,11这几条;val是0~255的整数值,对应电压从0到+5V。注意,那几个脚的编号,指的是ATmega168的pin编号,Arduino的板子会用这几个管脚支持更多路的PWM输出,例如我的Arduino Mega168就支持0~13共14个PWM输出。 [mw_shl_code=applescript,true]<font size="3" face="微软雅黑">void setup() 这种方式产生的方波周期大概是20ms左右(50Hz),不需要占用额外的cpu命令时间。据说99%的同学看到这里就可以下课了,技术宅请继续看第二种方式: 手动用代码实现PWM [mw_shl_code=applescript,true]<font size="3" face="微软雅黑"> 上面这段代码会产生一个PWM=0.1的,周期为1ms的方波(1000Hz),这种方式的优缺点很明显: 那么能不能既调节PWM的频率和周期,又不要占用额外的CPU时间呢?请看第三种方式: 使用PWM寄存器 ATmega168有三个时钟,名字分别叫Timer0, Timer1和Timer2。每个时钟都使用了两个寄存器,其中一个是设定值例如128,另一个则从0开始不断递增,到1024之后溢出回到0。那么当两个值相同的时候,Timer就会把某个管脚反相。不同的Timer之间频率是相同的,占空比则根据设置值不同。 Arduino官方教程:http://arduino.cc/en/Tutorial/SecretsOfArduinoPWM |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed