Arduino - 脉冲宽度调制

脉冲宽度调制或 PWM 是用于改变脉冲序列中脉冲宽度的常用技术。PWM 具有许多应用场景,例如控制伺服和速度控制器,限制电机和 LED 的有效功率等。

PWM 的基本原理

脉冲宽度调制基本上是具有变化的高和低时间的方波。基本 PWM 信号如下图所示。

PWM

有各种与 PWM 相关的术语 -

  • 开启时间 - 时间信号持续时间很长。

  • 关闭时间 - 时间信号持续时间很短。

  • 周期 - 表示为 PWM 信号的导通时间和关断时间之和。

  • 占空比 - 表示为 PWM 信号周期内保持的时间信号百分比。

周期

如图所示,Ton 表示导通时间,Toff 表示信号的关断时间。周期是开启和关闭时间的总和,计算方法如下式所示 - $$ T_ {total} = T_ {on} + T_ {off} $$

占空比

占空比计算为该时间段的接通时间。使用上面计算的时间,工作周期计算如下 -

$$ D = \frac{T_ {on}} {T_ {on} + T_ {off}} = \frac {T_ {on}} {T_ {total}} $$

analogWrite() 函数

analogWrite() 函数将模拟值(PWM 波)输出到一个管脚。它可用于点亮不同亮度的 LED 或以各种速度驱动电机。在调用 analogWrite() 函数之后,该引脚将产生指定占空比的稳定方波,直到下一次调用 analogWrite() 或在同一引脚上调用 digitalRead()digitalWrite()。大多数引脚上的 PWM 信号频率约为 490 Hz。在 Uno 和类似的板上,引脚 5 和 6 的频率约为 980Hz。Leonardo 的第 3 和第 11 针也以 980 Hz 的速度运行。

在大多数 Arduino 板(带有 ATmega168 或 ATmega328 的板)上,此功能适用于引脚 3,5,6,9,10 和 11.在 Arduino Mega 上,它适用于引脚 2 - 13 和 44 - 46.较旧的 Arduino 具有 ATmega8 的电路板仅支持引脚 9,10 和 11 上的 analogWrite()

UNO PWM 引脚

Arduino Due 支持引脚 2 至 13 上的 analogWrite() ,以及引脚 DAC0 和 DAC1。与 PWM 引脚不同,DAC0 和 DAC1 是数模转换器,可用作真正的模拟输出。

在调用 analogWrite() 之前,你无需调用 pinMode() 将引脚设置为输出。

analogWrite() 函数语法

analogWrite ( pin , value ) ;

value - 占空比:介于 0(始终关闭)和 255(始终打开)之间。

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
}