【esp32】 PWM控制LED亮度原理及代码详解

这篇具有很好参考价值的文章主要介绍了【esp32】 PWM控制LED亮度原理及代码详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

通俗的解释PWM的原理

PWM:脉冲宽度调制器

比如你有5V电源,要控制一台灯的亮度。你可以用传统的方式,串联一个可调电阻,改变电阻,灯的亮度就会改变。

使用PWM调节的原理:保持一定的电压或者电流不变,改变一定周期内的导通和关断的时间。等效于,保持导通,改变电压或者电流的大小。

【频率控制灯的闪烁:】

相当于串联了一个开关,假设在1s时间内,0.5s打开,0.5s关闭,那么灯亮0.5s,熄灭0.5s,人看到就是灯在闪烁。如果把频率调高,1s改为1ms,0.5ms打开,0.5ms关闭,那么看起来灯的闪烁频率就很高。

【占空比控制灯的亮度:】

当闪烁频率超过一直的阈值时,人眼就感受不到了。比如,在1ms内,0.9ms是关闭的,0.1ms是打开的,那么灯的亮度就只有原来的十分之一了。即通过改变LED的通电时间长短来调节亮度,通电时间长则亮度高。

ESP32-ledc源码分析

参考:ESP32 — LEDC_PWM

占空比:高电平接通时间与周期的比

分辨率:就是占空比的最小值

如代码中设置分辨率为 2**13 次方,则占空比为50%时的数字就是 ,(2**13 - 1)* 50% = 4095

以esp32为例,设置pwm的相关参数:参考库中的 esp-idf-master\examples\peripherals\ledc\ledc_basic\main
【esp32】 PWM控制LED亮度原理及代码详解
注意:占空比的设置,LEDC_DUTY 和分辨率有关

设置占空比为50%#define LEDC_DUTY (4095) // Set duty to 50%. ((2 ** 13) - 1) * 50% = 4095

#define LEDC_TIMER              LEDC_TIMER_0
#define LEDC_MODE               LEDC_LOW_SPEED_MODE
#define LEDC_OUTPUT_IO          (5) 					// Define the output GPIO
#define LEDC_CHANNEL            LEDC_CHANNEL_0
#define LEDC_DUTY_RES           LEDC_TIMER_13_BIT // Set duty resolution to 13 bits
#define LEDC_DUTY               (4095) // Set duty to 50%. ((2 ** 13) - 1) * 50% = 4095
#define LEDC_FREQUENCY          (5000) // Frequency in Hertz. Set frequency at 5 kHz

static void example_ledc_init(void)
{
    // Prepare and then apply the LEDC PWM timer configuration
    ledc_timer_config_t ledc_timer = {
        .speed_mode       = LEDC_MODE,
        .timer_num        = LEDC_TIMER,
        .duty_resolution  = LEDC_DUTY_RES,
        .freq_hz          = LEDC_FREQUENCY,  // Set output frequency at 5 kHz
        .clk_cfg          = LEDC_AUTO_CLK
    };
    ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer));

    // Prepare and then apply the LEDC PWM channel configuration
    ledc_channel_config_t ledc_channel = {
        .speed_mode     = LEDC_MODE,
        .channel        = LEDC_CHANNEL,
        .timer_sel      = LEDC_TIMER,
        .intr_type      = LEDC_INTR_DISABLE,
        .gpio_num       = LEDC_OUTPUT_IO,
        .duty           = 0, // Set duty to 0%
        .hpoint         = 0
    };
    ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel));
}

两路LED以不同频的方式闪烁

拓展:
两路LED以不同频的方式闪烁;代码中不同的GPIO配置不同的定时器和channel,然后设置不同的频率。

现象:
【esp32】 PWM控制LED亮度原理及代码详解


拓展:可以和按键检测结合起来:
短按,实现灯开,再短按一次,实现灯关
长按2s,实现双灯不同频闪烁
长按4s,实现双灯同频闪烁

中断:设置上升沿和下降沿触发,按下按键和抬起按键之间,发消息给消息队列。

中断方式:采用中断的方式, 坏处是必须等按键松开才可以计算按键时间长短,用户体验稍差。 好处是相比定时器的方式,会大大减小CPU的资源。

定时器扫描:开一个线程或者定时器,不断的扫描GPIO的输入状态, 好处是随时扫描到gpio的状态用户体验好。 坏处是浪费cpu资源。

若开一个定时器,本代码未实现,参考资料:[【ESP32—GPIO输入,按键的长按和短按】]
通过添加printf信息打印消息,测试原代码发现,存在时间偏差较大的情况,分析代码发现代码存在以下下问题:
目的是:当按键按下时,开始记录按下的时刻A,按键松开时,记录松开的时刻B,通过 B-A 计算按下的时间。但是源代码中按下按键时,可能多次重新计算了时刻A的值,造成测试不准的现象。
【esp32】 PWM控制LED亮度原理及代码详解文章来源地址https://www.toymoban.com/news/detail-456273.html

到了这里,关于【esp32】 PWM控制LED亮度原理及代码详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包