zl程序教程

您现在的位置是:首页 >  其他

当前栏目

SimonLiu的ESP8266与AliOS Things 学习教程系列之五:PWM库(全网第一篇)

教程学习 系列 全网 第一篇 Esp8266 PWM 之五
2023-09-11 14:21:24 时间

欢迎加入交流群:ESP8266 AliOS Things 群 号: 107723112
系列文章目录:
SimonLiu的ESP8266与AliOS Things 学习教程系列目录

很遗憾的告诉你,目前AliOS ThingsESP8266PWM HAL适配尚未完成(参考AliOS Things Issue #626AliOS Things Issue #681),但是已经有了一个库libpwm.a, 链接编译这个库就可以实现pwm

关于ESP8266PWM设定,详细内容请阅读 ESP8266 Technical Reference__CN。我们知道,默认ESP8266 non_os SDK只能支持100Hz-1000HzPWM频率,当频率为1KHz的时候,pwm duty 范围是0-22222,而且因为官方算法问题,即使duty22222,也无法达到100% duty cycle。但是这个AliOS的库还是和官方库有些差别,根据我的测试,当频率为1KHz的时候,duty cycle的值0-1023对应0%-100%,但是应该同样无法达到真正的100% duty cycle

使用AliOS ESP8266 PWM库的步骤如下:

1. 修改一些文件:
  • 在文件platform\mcu\esp8266\bsp\include\driver\gpio.h
    添加
    #include "../espressif/esp8266/pin_mux_register.h" (aos 2.1.0中不需要添加)

  • 在项目文件夹下的aos.mk 文件的$(NAME)_COMPONENTS += esptimer这一行后面添加一行:
    $(NAME)_PREBUILT_LIBRARY += ../../platform/mcu/esp8266/bsp/lib/libpwm.a(在aos 2.1.0中需要使用相对路径)

2. 代码来了,我在代码中每隔2s更改一次pwm duty cycle,并且输出到uart1。

占空比值范围是0-1023 @1KHz(此时period=1000ms)

#include <aos/aos.h>
#include <hal/soc/uart.h>
#include "driver/uart.h"
#include <hal/soc/soc.h>
#include "../../../platform/mcu/esp8266/bsp/include/driver/gpio.h"


#define PWM_CHANNEL 1 
#define PWM_0_OUT_IO_MUX  PERIPHS_IO_MUX_GPIO5_U
#define PWM_0_OUT_IO_NUM 5
#define PWM_0_OUT_IO_FUNC FUNC_GPIO5


static void pwmInit(void);
static void dimming(void);
static void pwmrun(void);

static void pwmInit(void)
{
    const uint32_t period = 1000;
    uint32 pwm_duty_init[PWM_CHANNEL] = {1000};
    uint32_t io_info[PWM_CHANNEL][3] =
        {
            {PWM_0_OUT_IO_MUX, PWM_0_OUT_IO_FUNC, PWM_0_OUT_IO_NUM},
        };
    pwm_init(period, pwm_duty_init, PWM_CHANNEL, io_info);
}

static void dimming(void)
{
    static uint32_t duty = 0;
    static bool dimFlag = true;
    if ( dimFlag )
    {
        duty +=64;

        if (duty>=1000)
            dimFlag = false;
    }
    else
    {
            duty -= 64;
        if (duty<=0)        
            dimFlag = true;
    }
    printf("Duty = %d  \r\n",duty);
    pwm_set_duty(duty,0);
    pwm_start();
}

static void pwmrun(void)
{
    dimming();
    aos_post_delayed_action(2000, pwmrun, NULL);

}

int application_start(int argc, char *argv[])
{

    uart_config_t uartConfig;
    uartConfig.baud_rate = 9600; 
    uart_dev_t uart;
    uart.port = 1; 
    uart.config = uartConfig;
    hal_uart_init(&uart);

    pwmInit();

    aos_post_delayed_action(1000, pwmrun, NULL);
    aos_loop_run();
    return 0;
}

一图胜千言:
在这里插入图片描述