Arduino - 脉冲宽度调制( Pulse Width Modulation)
脉冲宽度调制或PWM是用于改变脉冲序列中脉冲宽度的常用技术。 PWM具有许多应用,例如控制伺服和速度控制器,限制电机和LED的有效功率。
PWM的基本原理
脉冲宽度调制基本上是具有变化的高和低时间的方波。 基本PWM信号如下图所示。
有各种与PWM相关的术语 -
On-Time - 时间信号持续时间很长。
Off-Time - 时间信号持续时间很短。
Period - 表示为PWM信号的导通时间和关断时间之和。
Duty Cycle - 表示为PWM信号周期内保持的时间信号百分比。
Period
如图所示,T on表示导通时间,T off表示信号的关断时间。 期间是开启和关闭时间的总和,计算方法如下式所示 -
$$ T_ {total} = T_ {on} + T_ {off} $$占空比
占空比计算为该时间段的接通时间。 使用上面计算的时间,工作周期计算如下 -
$$ D =\frac {T_ {on}} {T_ {on} + T_ {off}} =\frac {T_ {on}} {T_ {total}} $$analogWrite() Function
analogWrite()函数将模拟值(PWM波)写入引脚。 它可用于点亮不同亮度的LED或以各种速度驱动电机。 在调用analogWrite()函数之后,该引脚将产生指定占空比的稳定方波,直到下一次调用analogWrite()或在同一引脚上调用digitalRead()或digitalWrite()。 大多数引脚上的PWM信号频率约为490 Hz。 在Uno和类似的板上,引脚5和6的频率约为980Hz。 莱昂纳多的第3和第11针也以980赫兹的速度运行。
在大多数Arduino板(带有ATmega168或ATmega328的板)上,此功能适用于引脚3,5,6,9,10和11.在Arduino Mega上,它适用于引脚2 - 13和44 - 46.较旧的Arduino具有ATmega8的电路板仅支持引脚9,10和11上的analogWrite() 。
Arduino Due支持引脚2至13上的analogWrite() ,以及引脚DAC0和DAC1。 与PWM引脚不同,DAC0和DAC1是数模转换器,可用作真正的模拟输出。
在调用analogWrite()之前,您无需调用pinMode()将引脚设置为输出。
analogWrite() Function Syntax
analogWrite ( pin , value ) ;
value - 占空比:介于0(始终关闭)和255(始终打开)之间。
Example
int ledPin = 9; // LED connected to digital pin 9
int analogPin = 3; // potentiometer connected to analog pin 3
int val = 0; // variable to store the read value
void setup() {
pinMode(ledPin, OUTPUT); // sets the pin as output
}
void loop() {
val = analogRead(analogPin); // read the input pin
analogWrite(ledPin, (val/4)); // analogRead values go from 0 to 1023,
// analogWrite values from 0 to 255
}