ESP8266 PMW介绍
2016-08-16 10:54
246 查看
前言
呼吸灯是常见的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]); | - |
参数介绍 | period | PWM周期 |
- | *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通道(从零开始算) |
返回值 | 某通道的周期 | - |
四、例程
#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参考
相关文章推荐
- ESP8266 按键检测处理程序介绍
- ESP8266 Mesh发包流程介绍
- ESP8266 RTOS 下 openssl 证书及使用和 fragment 介绍
- XBRL介绍- -
- AJAX 框架介绍
- level set介绍2(基本原理,基本思想)
- WPF布局控件AvalonDock介绍以及应用中遇到的一个问题
- Linux 下的图形库介绍
- 最土团购系统全局核心文件app.php介绍
- Delphi的ORM框架:InstantObjects类图与介绍
- Listview介绍与使用
- DRAM 内存介绍(一)
- asp数组的使用介绍
- 【不积跬步,无以致千里】AMQP协议介绍
- Imageview 控件的 ScacleType 属性介绍
- 网页中常用字体介绍
- std::vector介绍
- 迅为三星四核 cortex a9 + Linux开发板特点介绍
- iOS开发多线程篇—GCD介绍
- Face Time 介绍以及收费问题