ESP8266 PMW介绍

前言

呼吸灯是常见的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参考

  • 5
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
pmw3901是一款光流传感器,适用于机器人、无人机等应用中的姿态估计和导航。它能够通过感知周围环境中的光流变化来计算出自身的运动状态。 在使用stm32进行pmw3901的开发过程中,一般需要进行以下几个步骤: 1. 硬件连接: 首先,将pmw3901与stm32芯片进行连接。pmw3901一般通过SPI接口与stm32进行通信,因此需要将其MISO、MOSI、SCK、CS等引脚与stm32相连。此外,还需要为pmw3901提供适当的电源供电。 2. 驱动程序: 接下来,需要编写相应的驱动程序来实现与pmw3901的通信。可以使用stm32提供的SPI库函数来进行SPI通信,通过读写寄存器来配置pmw3901的参数和获取传感器数据。根据pmw3901的数据手册和官方提供的驱动代码,可以实现对pmw3901的基本控制和数据读取。 3. 数据处理: 获取到pmw3901传感器的数据后,需要对其进行处理和解析。根据pmw3901的数据格式和数据手册中的说明,可以计算出光流的位移和速度等信息。可以使用滤波算法对数据进行平滑处理,以提高精度和稳定性。 4. 应用开发: 最后,根据具体的应用需求,可以将pmw3901的数据应用到相应的算法或控制中。比如,在机器人导航中,可以使用pmw3901的数据来实现姿态估计和位置控制,从而实现自主导航。 以上是使用stm32进行pmw3901开发的基本步骤。在实际开发过程中,还需要根据具体情况进行调试和优化。同时,也可以参考其他开源项目或社区中的相关资源来加快开发进度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值