4、ESP32 PWM(模拟输出)

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 信号。

配置过程:
  1. 选择PWM通道,从 0 到 15 有 16 个通道;
  2. 设置PWM信号频率,对于 LED,5000 Hz 的频率就可以使用了;
  3. 设置信号的占空比分辨率:从 1 位到 16 位,例如使用 8 位分辨率,就可以使用 0 到 255 之间的值来控制 LED 亮度;
  4. 指定信号将出现在哪个或哪个 GPIO 上,使用函数:ledcAttachPin(GPIO, channel);第一个参数是输出信号的GPIO,第二个参数是产生信号的通道;
  5. 使用 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);

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无敌暴龙战士朵拉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值