Arduino - 脉宽调制


脉宽调制或 PWM 是用于改变脉冲串中脉冲宽度的常用技术。PWM 有许多应用,例如控制伺服系统和速度控制器、限制电机和 LED 的有效功率。

PWM基本原理

脉宽调制基本上是具有不同高低时间的方波。基本的 PWM 信号如下图所示。

脉宽调制

有多种与 PWM 相关的术语 -

  • 准时- 时间信号的持续时间为高。

  • 关闭时间- 时间信号的持续时间较低。

  • 周期- 表示为 PWM 信号的开启时间和关闭时间之和。

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

时期

如图所示,T on表示信号的导通时间,T off表示信号的关断时间。周期是开启和关闭时间的总和,计算公式如下 -

$$T_{总计} = T_{开}+T_{关}$$

占空比

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

$$D = \frac{T_{开}}{T_{开}+T_{关}} = \frac{T_{开}}{T_{总计}}$$

AnalogWrite() 函数

AnalogWrite ()函数将模拟值(PWM 波)写入引脚。它可用于以不同的亮度点亮 LED 或以不同的速度驱动电机。调用analogWrite()函数后,引脚将生成指定占空比的稳定方波,直到下一次调用analogWrite()或在同一引脚上调用digitalRead()或digitalWrite()。大多数引脚上的 PWM 信号频率约为 490 Hz。在 Uno 和类似板上,引脚 5 和 6 的频率约为 980 Hz。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 以及引脚 DAC0 和 DAC1 上的AnalogWrite() 。与 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
}