ESP8266 PMW介绍

    xiaoxiao2026-03-18  12

    前言

    呼吸灯是常见的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 ) { // struct pwm_param pwm_config; 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_config.duty[ 0 ] = 0; // pwm_config.freq = 0; // pwm_config.period = 1000; 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
    最新回复(0)