1、PWM
常规:analogWrite(pin, dutyCycle); 引脚输出指定占空比 PWM
pin 代表引脚
dutyCycle 的值在0~255之间,0为占空比0%,255为占空比100%
(遇到过在一些 IO 上突然不好用的情况,可能与某些库冲突?)
#include <Arduino.h>
#define led 2
void setup()
{
pinMode(led, OUTPUT);
}
void loop()
{
analogWrite(led, 100); // 输出 PWM,占空比 100/255
}
数字 IO 轮转法:高低电平和延时实现,模拟PWM
优点:所有 Pin 都可以输出
缺点:CPU 不能干其他事情
#include <Arduino.h>
#define led 2
void setup()
{
pinMode(led, OUTPUT);
}
void loop()
{
digitalWrite(led, HIGH);
delayMicroseconds(100); // 输出PWM,占空比为100/1000 = 10%
digitalWrite(led, LOW);
delayMicroseconds(1000 - 100); // 修改这里的1000可以调整频率,总周期为1000us,所以频率为1000Hz.
}
2、PWM-LED
ESP32 有一个 LED PWM 控制器,具有 16 个独立通道,可以配置为生成具有不同属性的 PWM 信号。
配置过程:
- 选择PWM通道,从 0 到 15 有 16 个通道;
- 设置PWM信号频率,对于 LED,5000 Hz 的频率就可以使用了;
- 设置信号的占空比分辨率:从 1 位到 16 位,例如使用 8 位分辨率,就可以使用 0 到 255 之间的值来控制 LED 亮度;
- 指定信号将出现在哪个或哪个 GPIO 上,使用函数:ledcAttachPin(GPIO, channel);第一个参数是输出信号的GPIO,第二个参数是产生信号的通道;
- 使用 PWM 控制 LED 亮度,使用函数:ledcWrite(channel, dutycycle);第一个参数是生成PWM信号的通道,第二个参数是占空比;
PWM 点亮一个LED Code:
const int ledPin = 2; // LED 引脚
// 设置PWM属性
const int freq = 5000; // 频率
const int ledChannel = 0; // 通道
const int resolution = 8; // 分辨率
void setup()
{
// 配置 LED PWM 功能
ledcSetup(ledChannel, freq, resolution);
// 将通道连接到要控制的 GPIO 上
ledcAttachPin(ledPin, ledChannel);
}
void loop()
{
// 增加亮度
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++)
{
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
// 减小亮度
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--)
{
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
}
PWM 点亮多个LED Code:
代码相同,只需要 PWM 多定义几个连接 IO
const int ledPin0 = 5; // LED 引脚
const int ledPin1 = 16;
const int ledPin2 = 17;
// 设置PWM属性
const int freq = 5000; // 频率
const int ledChannel = 0; // 通道
const int resolution = 8; // 分辨率
void setup()
{
// 配置 LED PWM 功能
ledcSetup(ledChannel, freq, resolution);
// 将通道连接到要控制的 GPIO 上
ledcAttachPin(ledPin0, ledChannel);
ledcAttachPin(ledPin1, ledChannel);
ledcAttachPin(ledPin2, ledChannel);
}
void loop()
{
// 增加亮度
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++)
{
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
// 减小亮度
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--)
{
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
}
3、PWM-BUZZ
(1)tone(pin, frequency, duration); 用于蜂鸣器或扬声器发声,可以让指定引脚产生一个占空比为50%的指定频率的方波
pin: 需要输出方波的引脚
frequency: 输出的频率,unsigned int型
duration: 方波持续的时间,单位毫秒,如果没有该参数,将持续发出设定的音调
例:tone(5, 1000);
(2)noTone(pin) 停止发声
pin:需要停止方波输出的引脚
例:noTone(5);