欢迎加入交流群:ESP8266 AliOS Things 群 号: 107723112
所有教程请看 AliOS Things 入门教程系列
此教程在SimonLiu的CSDN博客同步更新。
很遗憾的告诉你,目前
AliOS Things对ESP8266的PWMHAL适配尚未完成(参考AliOS Things Issue #626 和 AliOS Things Issue #681),但是已经有了一个库libpwm.a, 链接编译这个库就可以实现pwm。
关于ESP8266的PWM设定,详细内容请阅读 ESP8266 Technical Reference__CN。我们知道,默认ESP8266 non_os SDK只能支持100Hz-1000Hz的PWM频率,当频率为1KHz的时候,pwm duty 范围是0-22222,而且因为官方算法问题,即使duty为22222,也无法达到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;
}
一图胜千言:
