脉冲宽度调制或PWM是用于改变脉冲串中的脉冲的宽度的常用技术。 PWM有许多应用,如控制伺服和速度控制器,限制电机和LED的有效功率。
PWM的基本原理
脉宽调制基本上是一种方波,具有变化的高低时间。 基本PWM信号如下图所示。
有很多术语与PWM相关 -
On-Time - 时间信号持续时间较长。
Off-Time - 时间信号的持续时间低。
Period 周期 - 它表示为PWM信号的导通时间和关断时间的总和。
Duty Cycle 占空比 - 它表示为在PWM信号周期内保持开启的时间信号的百分比。
周期
如图所示,T sub表示导通时间,T suboff表示信号的截止时间。 期间是开和关时间的和,并且如下式所示计算:
占空比
占空比被计算为该时间段的接通时间。 使用上面计算的周期,占空比计算为 -
analogWrite()函数
analogWrite()函数将模拟值(PWM波)写入引脚。 它可用于以不同的亮度点亮LED或以各种速度驱动电机。 在调用analogWrite()函数之后,引脚将生成指定占空比的稳定方波,直到下一次调用analogWrite()或调用相同引脚上的digitalRead()或digitalWrite()。 大多数引脚上的PWM信号频率约为490 Hz。 在Uno和类似的板上,引脚5和6的频率约为980Hz。 Leonardo上的针脚3和11也以980Hz运行。
在大多数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以及引脚DAC0和DAC1上支持 analogWrite()。 与PWM引脚不同,DAC0和DAC1是数模转换器,用作真正的模拟输出。
在调用analogWrite()之前,不需要调用pinMode()将引脚设置为输出。
analogWrite()函数语法
analogWrite ( pin , value ) ; value − the duty cycle: between 0 (always off) and 255 (always on).
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 }