实验简介
本设计主要是学习如何使用ESP32S3的PWM外设。
本实验中,开发板选用的是图灵哥TRGESP32S3探索板,通过PWM控制LED灯的状态。
PWM简介
PWM(脉冲宽度调制,Pulse Width Modulation)是一种在微控制器单元(MCU)中广泛使用的技术,用于控制电路的功率输出。以下是对PWM在MCU中应用的简介:
PWM是一种数字信号控制技术,通过调节脉冲的宽度(即高电平持续时间与总周期时间的比例)来模拟模拟信号的控制效果。在微控制器单元(MCU)中,PWM广泛应用于各种领域,如电机控制、电源管理、音频信号处理等。
PWM主要特点:
- 高效率:PWM技术可以实现高效率的功率控制,减少能量损耗,提高系统性能:
- 精确控制:通过调整脉冲宽度,可以实现精确的功率输出控制,满足不同应用场景的需求;
- 灵活性强:PWM信号可以方便地通过软件编程进行调节,适应不同的控制策略;
- 抗干扰能力强:由于PWM信号是一种数字信号,相较于模拟信号,具有更好的抗干扰性能。
PWM程序设计思路:
在MCU中,PWM的实现通常涉及以下步骤:
- 设置PWM频率:根据应用需求,设置PWM信号的工作频率;
- 设置占空比:通过调整高电平持续时间和总周期时间的比例,即占空比,来控制功率输出;
- 启动PWM输出:使能PWM模块,开始输出PWM信号;
- 实时调节:在运行过程中,根据实际需求动态调整PWM参数,以实现最佳控制效果;
Summary:PWM技术在MCU中的应用为嵌入式系统设计提供了强大的控制手段,使得系统在节能、精度和灵活性方面表现出色。学习好PWM的驱动很重要。
程序源码
led_pwm.ino
/**
******************************************************************************
* @file led_pwm.ino
* @author Turinger Software
* @version V1.0
* @date 2024-09-20
* @brief LED PWM实验
******************************************************************************
*
* 实验平台 图灵哥 TRGESP32S3探索板
* 实验目的:学习LED PWM外设的使用
*
* 硬件资源及引脚分配:
* 1, LED --> ESP32S3 IO
* LED --> IO1
*
* 实验现象:
* 1, LED指示灯实现呼吸灯效果,由暗变亮,再由亮变暗
*
* 注意事项:
* 无
*
******************************************************************************
*/
#include "pwm.h"
uint16_t g_ledpwmval = 0; /* 占空比值 */
uint8_t g_dir = 1; /* 变化方向(1增大 0减小) */
/**
* @brief 当程序开始执行时,将调用setup()函数,通常用来初始化变量、函数等
* @param 无
* @retval 无
*/
void setup()
{
led_pwm_init(1000, 10); /* LED PWM初始化,PWM输出频率为1000HZ,占空比分辨率为10 */
}
/**
* @brief 循环函数,通常放程序的主体或者需要不断刷新的语句
* @param 无
* @retval 无
*/
void loop()
{
if (g_dir)
{
g_ledpwmval += 5;
}
else
{
g_ledpwmval -= 5;
}
if (g_ledpwmval > 1005)
{
g_dir = 0;
}
if (g_ledpwmval < 5)
{
g_dir = 1;
}
pwm_set_duty(g_ledpwmval);
delay(5);
}
pwm.cpp
/**
****************************************************************************************************
* @file pwm.cpp
* @author Turinger Software
* @version V1.0
* @date 2024-09-20
* @brief LEDPWM驱动代码
* 实验平台 图灵哥 TRGESP32S3探索板
*
****************************************************************************************************
*/
#include "pwm.h"
/**
* @brief LEDPWM初始化函数
* @param frequency: PWM输出频率,单位HZ
* @param resolution: PWM占空比的分辨率1-16,比如设置8,分辨率范围0~255
* @retval 无
*/
void led_pwm_init(uint16_t frequency, uint8_t resolution)
{
//ledcSetup(LED_PWM_CHANNEL, frequency, resolution); /* PWM初始化,引脚和通道由pwm.h的LED_PWM_PIN和LED_PWM_CHANNEL宏修改 */
//ledcAttachPin(LED_PWM_PIN, LED_PWM_CHANNEL); /* 绑定PWM通道到LED_PWM_PIN上 */
//ledcAttachChannel(LED_PWM_PIN,frequency,resolution);
ledcAttachChannel(LED_PWM_PIN,frequency,resolution,LED_PWM_CHANNEL);
}
/**
* @brief PWM占空比设置
* @param duty: PWM占空比
* @retval 无
*/
void pwm_set_duty(uint16_t duty)
{
ledcWrite(LED_PWM_PIN, duty); /* 改变PWM的占空比,通道由pwm.h的LED_PWM_CHANNEL宏修改 */
}
pwm.h
/**
****************************************************************************************************
* @file pwm.h
* @author Turinger Software
* @version V1.0
* @date 2024-09-20
* @brief LEDPWM驱动代码
* 实验平台 图灵哥 TRGESP32S3探索板
*
****************************************************************************************************
*/
#ifndef __PWM_H
#define __PWM_H
#include "Arduino.h"
/* LED PWM定义 */
#define LED_PWM_PIN 1 /* PWM信号输出的引脚 */
#define LED_PWM_CHANNEL 0 /* LED PWM通道号 */
/* 函数声明 */
void led_pwm_init(uint16_t frequency, uint8_t resolution); /* LED PWM初始化函数 */
void pwm_set_duty(uint16_t duty); /* PWM占空比设置 */
#endif
实验结果:可观察到LED指示灯(右下)实现呼吸灯效果,由暗变亮,再由亮变暗
实验到此结束,感谢观看。