EPS32 PWM操作 LED控制器呼吸灯实验 - MilkeZhang 的网络笔记

通过硬件改变PWM的形式使得LED由亮到暗,再由暗到亮,依次循环LED PWM控制器硬件可逐渐改变占空比的数值。开启此功能,需要用函数ledc_fade_func_install()使能渐变在PWM初始化函数中,我们配置好LEDC定时器的频率、占空比、定时器模式以及定时器通道,并在pwm_set_duty()函数中,调用函数 ledc_set_fade_with_time ()用以设置占空比和渐变

MilkeZhang

EPS32 PWM操作 LED控制器呼吸灯实验

阅读:77  点赞:0   留言:0


通过硬件改变PWM的形式使得LED由亮到暗,再由暗到亮,依次循环

LED PWM控制器硬件可逐渐改变占空比的数值。开启此功能,需要用函数ledc_fade_func_install()使能渐变

PWM初始化函数中,我们配置好LEDC定时器的频率、占空比、定时器模式以及定时器通道,并在pwm_set_duty()函数中,调用函数 ledc_set_fade_with_time ()用以设置占空比和渐变时长。

此时,我们需要再次调用该函数,将占空比配置为 0,最后调用函数 ledc_fade_start ()开启渐变。

为了方便使用,笔者将这两个函数进行了“封装”,通过传参的形式来配置PWM占空比。


在主函数中,我们首先对PWM进行初始化,设置了PWM占空比分辨率为13PWM信号频率为5000,最后在while(1)循环中配置了占空比。通过与上一个实验的对比,硬件改变占空比的方式与软件改变占空比的方式虽有不同,但一样可以实现呼吸灯的效果。


pwm.h

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/semphr.h"
#include "driver/ledc.h"
#include "driver/gpio.h"


/* 引脚以及重要参数定义 */
#define LEDC_PWM_TIMER          LEDC_TIMER_1        /* 使用定时器0 */
#define LEDC_PWM_CH0_GPIO       GPIO_NUM_1          /* LED控制器通道对应GPIO */
#define LEDC_PWM_CH0_CHANNEL    LEDC_CHANNEL_1      /* LED控制器通道号 */

/* 函数声明 */
void pwm_init(uint8_t resolution, uint16_t freq);   /* 初始化PWM */
void pwm_set_duty(uint16_t duty);                   /* PWM占空比设置 */

pwm.c

#include "pwm.h"


/**
 * @brief       初始化PWM
 * @param       resolution: PWM占空比分辨率
 *              freq: PWM信号频率
 * @retval      无
 */
void pwm_init(uint8_t resolution, uint16_t freq)
{
    ledc_timer_config_t ledc_timer;                 /* LEDC定时器句柄 */
    ledc_channel_config_t ledc_channel;             /* LEDC通道配置句柄 */

    /* 配置LEDC定时器 */
    ledc_timer.duty_resolution = resolution;        /* PWM占空比分辨率 */
    ledc_timer.freq_hz = freq;                      /* PWM信号频率 */
    ledc_timer.speed_mode = LEDC_LOW_SPEED_MODE;    /* 定时器模式 */
    ledc_timer.timer_num = LEDC_PWM_TIMER;          /* 定时器序号 */
    ledc_timer.clk_cfg = LEDC_AUTO_CLK;             /* LEDC时钟源 */
    ledc_timer_config(&ledc_timer);                 /* 配置定时器 */

    /* 配置LEDC通道 */
    ledc_channel.gpio_num = LEDC_PWM_CH0_GPIO;      /* LED控制器通道对应引脚 */
    ledc_channel.speed_mode = LEDC_LOW_SPEED_MODE;  /* LEDC高速模式 */
    ledc_channel.channel = LEDC_PWM_CH0_CHANNEL;    /* LEDC控制器通道号 */
    ledc_channel.intr_type = LEDC_INTR_DISABLE;     /* LEDC失能中断 */
    ledc_channel.timer_sel = LEDC_PWM_TIMER;        /* 定时器序号 */
    ledc_channel.duty = 0;                          /* 占空比值 */
    ledc_channel_config(&ledc_channel);             /* 配置LEDC通道 */
}

/**
 * @brief       PWM占空比设置
 * @param       duty:PWM占空比
 * @retval      无
 */
void pwm_set_duty(uint16_t duty)
{
    ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_PWM_CH0_CHANNEL, duty); /* 设置占空比 */
    ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_PWM_CH0_CHANNEL);    /* 更新占空比 */
}


main.c


/**
 * @brief       程序入口
 * @param       无
 * @retval      无
 */
void app_main(void)
{
    esp_err_t ret;
    uint8_t dir = 1;
    uint16_t ledpwmval = 0;

    ret = nvs_flash_init(); /* 初始化NVS */

    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
    {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret = nvs_flash_init();
    }

    pwm_init(10, 1000);     /* 初始化PWM */

    while(1) 
    {
        vTaskDelay(10);

        if (dir == 1)
        {
            ledpwmval += 5; /* dir==1 ledpwmval递增 */
        }
        else
        {
            ledpwmval -= 5; /* dir==0 ledpwmval递减 */
        }

        if (ledpwmval > 1005)
        {
            dir = 0;        /* ledpwmval到达1005后,方向为递减 */
        }

        if (ledpwmval < 5)
        {
            dir = 1;        /* ledpwmval递减到5后,方向改为递增 */
        }

        /* 设置占空比 */
        pwm_set_duty(ledpwmval);
    }
}



编写于:2024/11/13 17:05:51
发布 IP 属地:广东省深圳市

版权声明

本站内容均来自网络转载或网友提供,如有侵权请及时联系我们删除!本站不承担任何争议和法律责任!


艾金森

每一个童年的梦想都值得用青春去捍卫!




用户地图 心情地图 日记地图 笔记地图 时间轴地图 投票地图 习题地图 24.8.5回到我的世界里:我不要再这么颓废了颈肩腰腿痛独特秘方绝招11月23日简赤jc 的日记 2024/06/25 12:53:37risk 的日记 2024/11/25 15:21:44为什么这种东西还存在于中国的书店啊2007年星洲日报讲解自杀。10-910-232024年的第一场秋雨Jun Peng Cui 的日记 2024/08/23 15:25:05简赤jc 的日记 2024/08/30 20:19:30我找到oc文了2024.10.25 我要我记得,记得今天一场满足的拥抱risk 的日记 2024/11/25 15:21:44渣男的婚外情故事2007年星洲日报讲解通宵读书。#空气一少,医生的手术刀就在你的身体乱乱开刀8月1日恢复中第二天咯24.4.11夜:麻木、我想成为更丰富的人oc相关Food2024-06-17 Web开发记录【心情新增配图功能】24.7.21栀子味蓝色小狗会害怕鱼头汤吗07/07/2024时代变了,课外读物变了没有啊?清浅 的日记 2024/12/08 11:16:17ZLL 的日记 2024/08/29 16:36:31看了一个非常好看的国耽美,戒断反应严重!!简赤jc 的日记 2024/06/22 21:45:33关于自知力思考22/11/20242024年4月15日戒烟的启示性时刻高考志愿填报讲解大学专业之医学类20集自助餐。。。8年后的。。。简赤jc 的日记 2024/06/25 19:26:19只是放淡了些许茶文化博览 中国茶韵24.9.3 “一家三口”的放学羁绊!回归!平淡家庭急救100招木瓜的故事1510.28复盘灵感堆积,回来再写24.11.17 写完作业好幸福。团聚好幸福。小猫要快快好起来呀…恐惧对我们的影响过大了安 的日记 2024/10/18 08:56:022007年的星洲日报是很有意义的。UL4200A检测报告GCC证书20240728如何更改Element UI的this.$confirm按钮样式心学随笔一视频清晰度分级规则:SD、HD、FHD、UHD常用网络端口html input 上传图片的方法视频编解码协议 【MPEG-4】【H.264】【H.265】【VP9】【AV1】【AVS】【VP8】【Datasheet】AX3071UA DC-DC电源系统架构设计师论文《论单元测试方法及应用》知识点铂鹿 的笔记 2024/06/10 11:48:09浅浅记录一下js 函数过多?满山的猴子我腚最红 的笔记 2024/10/23 20:59:16挨打也能成为一项超能力刮痧疗法彩色图谱软考架构-架构风格系统架构设计师论文《论信息系统的安全体系》EPS32 基础GPIO操作 LED实验赫兹伯格的卫生理论系统架构设计师论文《论中间件在SIM卡应用开发中的作用》引子文章练习420240722ESP32 【ESP_ERROR_CHECK】说明小说中让人突然下头的行为(01)高考志愿填报讲解大学专业之师范教育类EPS32 外部中断EXIT操作 KEY实验【Datasheet】FD6288T 三个独立的半桥栅极驱动集成电路芯片系统架构设计师论文《论信息系统架构的设计》现在才有闲情看得下书,但我却在迷茫。10.10系统架构设计师-22年-论文题目ZXF高考志愿填报全攻略54项【Datasheet】SCT2A10STER DC-DC电源芯片关于游戏——Part2HTML input type="number" 不显箭头英语老教授又想圈钱了老年人营养保健手册(专业版)不想学外语的思考瑞芯微RK3568对比RK3399性能解析Visual Studio和Visual Studio Code有什么区别系统架构设计师论文《论基于UML的需求分析》爱别太迟。高考志愿填报讲解大学专业之电子信息及计算机类视频编解码协议 MPEG-4 和 H.264之间的区别系统架构设计师论文《论面向服务架构设计及其应用》NoSQL 非关系型数据库书单成瘾丨240726 基层公务员读物C语言根据日期判断星期几(使用基姆拉尔森计算公式)