Arduino 简明教程

Arduino - Pulse Width Modulation

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

Basic Principle of PWM

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

pwm

PWM 涉及到各种术语 −

  1. On-Time − 信号高电平持续时间。

  2. Off-Time − 信号低电平持续时间。

  3. Period − 表示为 PWM 信号的导通时间和关断时间的总和。

  4. Duty Cycle − 表示为 PWM 信号周期内信号保持导通时间的百分比。

Period

如下图所示,Ton 表示信号的导通时间,Toff 表示信号的关断时间。周期是导通时间和关断时间的总和,计算方法如下所示 −

Duty Cycle

占空比计算为周期中导通时间的比例。使用上述计算的周期,占空比的计算方法如下 −

analogWrite() Function

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 上运行。具有 ATmega8 的较旧 Arduino 电路板仅支持引脚 9、10 和 11 上的 analogWrite()

uno pwm pins

Arduino Due 支持引脚 2 至 13 以及引脚 DAC0 和 DAC1 上的 analogWrite() 。与 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
}