欢迎加入交流群:ESP8266 AliOS Things 群 号: 107723112
所有教程请看 AliOS Things 入门教程系列
此教程在SimonLiu的CSDN博客同步更新。
很遗憾的告诉你,目前
AliOS Things
对ESP8266
的PWM
HAL
适配尚未完成(参考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;
}
一图胜千言:
在这里插入图片描述
网友评论