1、概述
PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。
本文将向开发者介绍PWM的使用。HaaS1000芯片内内置了4个PWM管脚,分别是:
引脚名 |
复用GPIO |
描述 |
PWM0 |
P2_6 |
PWM0管脚 |
PWM1 |
P2_7 |
PWM1管脚 |
PWM2 |
P2_4 |
PWM2管脚 |
PWM3 |
P2_5 |
PWM3管脚 |
2、HAL层接口介绍
AliOS Things对于不同底层驱动的pwm操作实现,统一封装成本文所述hal pwm接口。 hal相关头文件位于目录:include/aos/hal。hal相关实现位于具体的mcu目录下,如:platform/mcu/haas1000/hal/。
2.1、API列表
hal_pwm_init |
初始化指定PWM |
hal_pwm_start |
开始输出指定PWM |
hal_pwm_stop |
停止输出指定PWM |
hal_pwm_para_chg |
修改指定PWM参数 |
hal_pwm_finalize |
关闭指定PWM |
2.2、API详情
2.2.1、相关结数据结构
pwm_dev_t
typedef struct {
uint8_t port; /* pwm port */
pwm_config_t config; /* pwm config */
void *priv; /* priv data */
} pwm_dev_t;
pwm_config_t
typedef struct {
float duty_cycle; /* the pwm duty_cycle */
uint32_t freq; /* the pwm freq */
} pwm_config_t;
2.2.2、hal_pwm_init
初始化指定PWM
函数原型
int32_t hal_pwm_init(pwm_dev_t *pwm);
参数
pwm_dev_t *pwm |
入参 |
PWM设备描述,定义需要初始化的PWM参数 |
用户自定义一个pwm_dev_t结构体 |
返回值
返回成功或失败, 返回0表示PWM初始化成功,非0表示失败
调用示例
#define PWM1_PORT_NUM 1
/* define dev */
pwm_dev_t pwm1;
/* pwm port set */
pwm1.port = PWM1_PORT_NUM;
/* pwm attr config */
pwm1.config.duty_cycle = 0.5f; /* 1s */
pwm1.config.freq = 300000; /* 1s */
/* init pwm1 with the given settings */
ret = hal_pwm_init(&pwm1);
2.2.3、hal_pwm_start
开始输出指定PWM
函数原型
int32_t hal_pwm_start(pwm_dev_t *pwm);
参数
pwm_dev_t *pwm |
入参 |
PWM设备描述 |
使用hal_pwm_init时传入pwm_dev_t结构体 |
返回值
返回成功或失败, 返回0表示PWM开始输出成功,非0表示失败
调用示例
ret = hal_pwm_start(&pwm1);
2.2.4、hal_pwm_stop
停止输出指定PWM
函数原型
int32_t hal_pwm_stop(pwm_dev_t *pwm);
参数
pwm_dev_t *pwm |
入参 |
PWM设备描述 |
使用hal_pwm_init时传入pwm_dev_t结构体 |
返回值
返回成功或失败, 返回0表示PWM停止输出成功,非0表示失败
调用示例
ret = hal_pwm_stop(&pwm1);
2.2.5、hal_pwm_para_chg
修改指定PWM参数
函数原型
int32_t hal_pwm_para_chg(pwm_dev_t *pwm, pwm_config_t para);
参数
pwm_dev_t *pwm |
入参 |
PWM设备描述 |
使用hal_pwm_init时传入pwm_dev_t结构体 |
pwm_config_t para |
入参 |
新配置参数 |
{0.25f,300000} |
返回值
返回成功或失败, 返回0表示PWM参数修改成功,非0表示失败
调用示例
pwm_config_t para = {0.25f,300000};
ret = hal_pwm_para_chg(&pwm1,para);
2.2.6、hal_pwm_finalize
关闭指定PWM
函数原型
int32_t hal_pwm_finalize(pwm_dev_t *pwm);
参数
pwm_dev_t *pwm |
入参 |
PWM设备描述 |
使用hal_pwm_init时传入pwm_dev_t结构体 |
返回值
返回成功或失败, 返回0表示PWM关闭成功,非0表示失败
调用示例
ret = hal_pwm_finalize(&pwm1);
3、示例介绍
HaaS EDU K1已经将PWM0连接到了蜂鸣器上,在此来简单介绍一下。
3.1、硬件实现
原理图如下:
图1 蜂鸣器原理图
3.2、软件设计
pwm部分测试代码位于
application/example/edu_demo/mfg_test/pwm_test.c
int32_t ret = 0;
pwm_dev_t pwm = {0, {0.0, 25}, NULL};
for (int k=0; k<1; k++)
{
pwm.port = k;
printf("\r\n=====pwm test : testing...===\r\n");
ret = hal_pwm_init(&pwm);
if(ret)
{
printf("\r\n=====pwm test : pwm init failed===\r\n");
return -1;
}
ret = hal_pwm_start(&pwm);
if(ret)
{
printf("\r\n=====pwm test : pwm start failed===\r\n");
return -1;
}
pwm_config_t para = {0.0, 25};
for (int j=0; j<2; j++) {
for (int i=0; i<10; i++) {
para.duty_cycle = 0.1*i;
hal_pwm_para_chg(&pwm, para);
osDelay(100);
}
for (int i=10; i>0; i--) {
para.duty_cycle = 0.01*i;
hal_pwm_para_chg(&pwm, para);
osDelay(100);
}
}
hal_pwm_stop(&pwm);
hal_pwm_finalize(&pwm);
}
printf("=====pwm test : Done=====\r\n");
3.3、编译与下载
3.3.1、代码准备
打开edu_demo的产测开关
application/example/edu_demo/Config.in
在该文件中修改编译选项,打开EDK_DEMO_FACTORY_TEST_ENABLIE开关。
config EDK_DEMO_FACTORY_TEST_ENABLIE
bool "enable factory test function"
default y
加入Demo到启动代码
application/example/edu_demo/app_entry.c
函数application_start中注释掉menu_init();,添加pwm_test();
//menu_init();
pwm_test();
3.3.2、编译
命令行方式进行编译
aos make distclean
aos make edu_demo@haaseduk1 -c config
aos make
3.3.3、烧录
- 命令行方式
aos upload
- 图形界面方式
详见HaaS EDU K1 快速开始 第4.3.3章节-使用GUI工具烧录部分。
开发者技术支持
如需更多技术支持,可加入钉钉开发者群,或者关注微信公众号
更多技术与解决方案介绍,请访问阿里云AIoT首页https://iot.aliyun.com/