在 ESP32 上使用 PWM 制作呼吸灯

PWM(脉冲调制)人为地产生 0 至 3.3V 之间的可变电压。ESP32 上的 PWM 比 Arduino 上的更完整。

PWM工作原理提醒

esp32单片机的数字引脚,其实只能输出高电平和低电平,也就是要不就是3.3伏要不就是输出0伏,而PWM 是一种在数字引脚上获取模拟信号的方法。pwm简单的说就是快速再高低电平之间,有规律的切换,由于切换的速度特别的快,从而创造出一种中间电平的假象。

通过 Arduino 代码在 ESP32 上使用 PWM

在 ESP32 上使用 PWM 与使用 Arduino 不同。可以将 16 个独立的 PWM 通道分配给 GPIO 引脚(GPIO36、GPIO39、GPIO34 和 GPIO35 引脚除外),每一个管脚只能分配一个通道。ESP32 上的 PWM 配置稍微复杂一些,但功能更强大。该 ledc  模块负责 PWM,并且允许使用它的三个主要功能:  ledcSetup()、  ledcAttachPin()、  ledcWrite()

例如,要在引脚 GPIO23 上生成 PWM 信号,您必须:

  • 选择 PWM 通道 (0 - 15)

  • 选择脉宽调制频率

  • 选择 1 到 16 位之间的脉冲宽度分辨率

  • 选择将生成 PWM 信号的 GPIO 引脚

  • 向输出端输出指定所需的电压值

int pwmChannel = 0; // 选择通道
int frequence = 1000; // pwm的频率1000赫兹
int resolution = 8; // 8为分辨率,也就是将0到3.3伏分成256份
int pwmPin = 23;

void setup(){
    
    ledcSetup(pwmChannel, frequence, resolution);

    // pwm关联23号管脚
    ledcAttachPin(pwmPin, pwmChannel);

    // 输出pwm信号,也就是向23号管脚设定127*3.3/256=1.637V电压。
    ledcWrite(pwmChannel, 127); 
}

void loop(){
}

一旦完成ledcSetup() 和函数的配置,我们仅使用该 函数来设置电压。

ledcAttachPin()

ledcWrite()

警告

analogWrite() 功能不适用于 ESP32。你应该改用ledcWrite() 。

迷你项目:通过 PWM 调光 LED

我们将使用 PWM 信号调暗三个 LED。

电气原理图

选择您想要的 LED 颜色。

ESP32 led pwm接线图

电路

ESP32 led pwm接线图

电路(面包板版)

警告

3.3伏的输出对于led来说还是太大了,蓝色led的耐压值是3伏,红白led是2-2.2伏。不要忘记将电阻器与 LED 串联,以免将其烧坏。220Ω 到 330Ω 之间的值就可以很好地完成这项工作。

控制 LED 亮度的代码

解决方案

const int ledPin = 23;
const int ledPin2 = 22;
const int ledPin3 = 21;

// PWM channel 0 parameter
const int freq = 5000; // 5000 Hz
const int ledChannel = 0;
const int resolution = 8; // 8-bit resolution

void setup(){
    // Configure the channel 0
    ledcSetup(ledChannel, freq, resolution);

    // Attach the channel 0 on the 3 pins
    ledcAttachPin(ledPin, ledChannel);
    ledcAttachPin(ledPin2, ledChannel);
    ledcAttachPin(ledPin3, ledChannel);
}

void loop(){
    // 调整led亮度在0-255之间
    for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
        ledcWrite(ledChannel, dutyCycle);
        delay(15);
    }
}

同时控制3个led,不用为每个引脚指定三个不同的 PWM 通道,而是仅使用一个并将其分配给三个引脚。也就是说可以将一路pwm信号发送给多个引脚,从而控制多个led,但是结果就是他们是同步变化的。否则你就需要给每一个led指定不同的PWM通道了。

结果

LED 原型板上的接线

以上理论同样可以驱动智能小车中的马达控制马达的速度方向等,下次将介绍如何使用eps32的pwm功能驱动智能小车马达和调速。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用ESP32输出精确的PWM脉冲数,可以通过设置ESP32的GPIO输出模式和初始化PWM参数来实现。 首先,选择一个GPIO引脚作为输出引脚,并将其设置为输出模式。可以使用ESP32的GPIO库函数来完成这一步骤。例如,使用gpio_set_direction函数将GPIO引脚设置为输出模式: ```c gpio_set_direction(GPIO_NUM_XX, GPIO_MODE_OUTPUT); ``` 接下来,需要初始化PWM参数,包括PWM频率和占空比。可以使用ESP32的ledc库函数来初始化PWM参数。例如,使用ledc_timer_config和ledc_channel_config函数来初始化PWM参数: ```c ledc_timer_config_t timer_conf; timer_conf.speed_mode = LEDC_HIGH_SPEED_MODE; timer_conf.timer_num = LEDC_TIMER_0; timer_conf.timer_bit_num = LEDC_TIMER_13_BIT; timer_conf.freq_hz = PWM_FREQUENCY; ledc_timer_config(&timer_conf); ledc_channel_config_t channel_conf; channel_conf.gpio_num = GPIO_NUM_XX; channel_conf.speed_mode = LEDC_HIGH_SPEED_MODE; channel_conf.channel = LEDC_CHANNEL_0; channel_conf.timer_sel = LEDC_TIMER_0; channel_conf.duty = PWM_DUTY_CYCLE; channel_conf.hpoint = 0; ledc_channel_config(&channel_conf); ``` 其中,PWM_FREQUENCY是要设置的PWM频率,PWM_DUTY_CYCLE是要设置的占空比。 最后,可以使用ledc_set_duty和ledc_update_duty函数来输出PWM脉冲。例如,使用ledc_set_duty设置PWM脉冲的具体脉冲数: ```c ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, PWM_PULSE_NUM); ``` 然后,使用ledc_update_duty函数更新PWM输出: ```c ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0); ``` 其中,PWM_PULSE_NUM是要设置的精确脉冲数。 通过以上步骤,就可以使用ESP32输出精确的PWM脉冲数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值