通过硬件改变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占空比分辨率为13,PWM信号频率为5000,最后在while(1)循环中配置了占空比。通过与上一个实验的对比,硬件改变占空比的方式与软件改变占空比的方式虽有不同,但一样可以实现呼吸灯的效果。
pwm.h
#include
#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 属地:广东省深圳市
版权声明
阅读: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占空比分辨率为13,PWM信号频率为5000,最后在while(1)循环中配置了占空比。通过与上一个实验的对比,硬件改变占空比的方式与软件改变占空比的方式虽有不同,但一样可以实现呼吸灯的效果。
pwm.h
#include
#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 属地:广东省深圳市
版权声明
本站内容均来自网络转载或网友提供,如有侵权请及时联系我们删除!本站不承担任何争议和法律责任!
每一个童年的梦想都值得用青春去捍卫!