美文网首页
SimonLiu的ESP8266与AliOS Things 学习

SimonLiu的ESP8266与AliOS Things 学习

作者: 刘知海SimonLiu | 来源:发表于2019-03-23 13:39 被阅读0次

    欢迎加入交流群:ESP8266 AliOS Things 群 号: 107723112
    所有教程请看 AliOS Things 入门教程系列
    此教程在SimonLiu的CSDN博客同步更新。

    很遗憾的告诉你,目前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中不需要添加)

    • platform\mcu\esp8266\esp8266.mk 文件的$(NAME)_PREBUILT_LIBRARY += bsp/lib/liblwip.a这一行后面添加一行:
      $(NAME)_PREBUILT_LIBRARY += 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;
    }
    

    一图胜千言:


    在这里插入图片描述

    相关文章

      网友评论

          本文标题:SimonLiu的ESP8266与AliOS Things 学习

          本文链接:https://www.haomeiwen.com/subject/xvcsvqtx.html