HaaS EDU K1设备资源 之 PWM

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详情

请参考include/aos/hal/pwm.h

 

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/

猜你喜欢

转载自blog.csdn.net/HaaSTech/article/details/114648078