Arduino - 脉冲宽度调制
脉冲宽度调制或 PWM 是一种常用技术,用于改变脉冲序列中的脉冲宽度。PWM 有许多应用,例如控制伺服和速度控制器,限制电机和 LED 的有效功率。
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 的频率约为 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()。
Arduino Due 支持引脚 2 至 13 以及引脚 DAC0 和 DAC1 上的 analogWrite()。与 PWM 引脚不同,DAC0 和 DAC1 是数模转换器,可充当真正的模拟输出。
在调用 analogWrite() 之前,您无需调用 pinMode() 将引脚设置为输出。
analogWrite() 函数语法
analogWrite ( pin , value ) ;
value − 占空比:介于 0(始终关闭)和 255(始终打开)之间。
示例
int ledPin = 9; // LED 连接到数字引脚 9 int analogPin = 3; // 电位器连接到模拟引脚 3 int val = 0; // 用于存储读取值的变量 void setup() { pinMode(ledPin, OUTPUT); // 将引脚设置为输出 } void loop() { val = analogRead(analogPin); // 读取输入引脚 analogWrite(ledPin, (val / 4)); // analogRead 值从 0 到 1023, // analogWrite 值从 0 到 255 }