前言
呼吸灯是常见的LED应用。LED呼吸灯的流程是缓缓点亮LED灯,再缓缓熄灭LED灯。在夜色下,缓慢闪烁的LED显得格外迷人。
一、PWM单元介绍
ESP8266有四个PWM输出接口,分别是:PWM0(GPIO12)、PWM1(GPIO15)、PWM2(GPIO14)、PWM3(GPIO4)。由于PWM接口是由软件来实现的,因此用户可自行拓展(最大可拓展8个,详细请参考ESP8266 SDK的pwm.h文件)。
PWM可调节的周期在1000us~10000us,即100HZ~1KHZ之间。
有关PWM的介绍请自行上网查阅资料。
二、PWM配置流程介绍
1.首先对PWM的占空比、周期以及PWM通道进行配置。
2.配置系统定时器,将呼吸灯运行程序配置成每30ms运行一次,以刷新PWM的占空比。
三、相关API介绍
1、pwm_init
API 介绍--
功能介绍初始化PWM配置-函数原型void pwm_init(uint32 period, uint32 *duty, uint32 pwm_channel_num, uint32 (*pin_info_list)[3]);-参数介绍periodPWM周期-*duty各PWM通道的占空比-pwm_channel_num需要使用的PWM通道数量-(*pin_info_list)[3]使用的PWM通道的GPIO参数
示例:
uint32_t io_info[ ][
3 ] =
{
/** 该参数在ESP8266 SDK的user_light.h中 */
{ PWM_1_OUT_IO_MUX, PWM_1_OUT_IO_FUNC, PWM_1_OUT_IO_NUM },
};
uint32_t duty[] = {
0};
/** 配置PWM的周期为1000us,占空比为0,PWM通道数量为1 */
pwm_init(
1000, duty,
1, io_info );
2、pwm_start
API 介绍--
功能介绍更新PWM配置函数原型void pwm_start(void)注释在PWM参数配置完成后需要调用该函数
3、pwm_set_duty
API 介绍--
功能介绍设置某PWM通道的占空比-函数原型void pwm_set_duty(uint32 duty, uint8 channel)-参数介绍duty新的PWM通道占空比-channel需要设置的PWM通道(从零开始算)
示例:
/** 设置PWM通道1的占空比为100 */
pwm_set_duty(
100,
0 );
/** 使PWM配置生效 */
pwm_start();
4、pwm_get_duty
API 介绍--
功能介绍获取某通道的占空比的数值-函数原型uint32 pwm_get_duty(uint8 channel)-参数介绍channel需要设置的PWM通道(从零开始算)返回值该通道的占空比-
5、pwm_set_period
API 介绍--
功能介绍设置某PWM通道的周期-函数原型void pwm_set_period(uint32 period, uint8 channe)-参数介绍period新的PWM通道周期-channel需要设置的PWM通道(从零开始算)
示例:
/** 设置PWM通道1的周期为100us */
pwm_set_period(
100,
0 );
/** 使PWM配置生效 */
pwm_start();
6、pwm_get_period
API 介绍--
功能介绍获取某通道的周期-函数原型uint32 pwm_get_period(uint8 channel)-参数介绍channel需要设置的PWM通道(从零开始算)返回值某通道的周期-
注:详细的介绍详见ESP8266 SDK说明文档。
四、例程
#include
"ets_sys.h"
#include
"osapi.h"
#include
"user_light.h"
#include
"gpio.h"
#include
"user_interface.h"
static os_timer_t os_timer;
/** 呼吸灯运行程序 */
void ESP8266_PWM_RUN(
void )
{
/** PWM占空比变量 */
static u8 set_duty =
0;
/** 占空比加减标志 */
static bool f =
true;
if ( f ==
true )
{
if ( ++set_duty >=
100 )
{
f =
false;
}
}
else
{
if ( --set_duty <=
0 )
{
f =
true;
}
}
/** 更新PWM通道0的占空比 */
pwm_set_duty( set_duty,
0 );
pwm_start();
}
/** 初始化PWM配置、系统定时器配置 */
void ESP8266_PWM_Init(
void )
{
uint32_t io_info[ ][
3 ] =
{
{ PWM_1_OUT_IO_MUX, PWM_1_OUT_IO_FUNC, PWM_1_OUT_IO_NUM },
};
uint32_t duty[ ] = {
0 };
pwm_init(
1000, duty,
1, io_info );
/** 配置定时器每30ms执行一次ESP8266_PWM_RUN()函数 */
os_timer_disarm( &os_timer );
os_timer_setfn( &os_timer, (ETSTimerFunc *) ( ESP8266_PWM_RUN ), NULL );
os_timer_arm( &os_timer,
30,
true );
}
/** 用户初始化程序,根据测试该程序只运行一次 */
void user_init(
void)
{
ESP8266_PWM_Init();
}
参考资料
[1]. ESP8266技术参考 [2]. ESP8266Non-OS SDK API参考
转载请注明原文地址: https://ju.6miu.com/read-1308091.html