PWM

更新时间:2022-11-24 09:20:21下载pdf

API 列表

函数名称 功能描述
tuya_pwm_init 初始化PWM
tuya_pwm_start 启动PWM
tuya_pwm_stop 停止PWM
tuya_pwm_set 设置PWM频率和占空比
tuya_pwm_frequency_set 设置PWM频率
tuya_pwm_duty_set 设置PWM占空比
tuya_pwm_polarity_set 设置PWM初始极性
tuya_pwm_deinit 关闭PWM

API 说明

tuya_pwm_init

函数原型

  int tuya_pwm_init(tuya_pwm_t *pwm);

参数说明

参数名称 参数类型 说明
pwm tuya_pwm_t PWM句柄,需要初始化PWM参数

返回值

返回值 说明
OPRT_OK 初始化成功
其他错误码 初始化失败

tuya_pwm_start

函数原型

  int tuya_pwm_start(tuya_pwm_t *pwm);

参数说明

参数名称 参数类型 说明
pwm tuya_pwm_t PWM句柄,需要初始化PWM参数

返回值

返回值 说明
OPRT_OK 初始化成功
其他错误码 初始化失败

tuya_pwm_stop

函数原型

  int tuya_pwm_stop(tuya_pwm_t *pwm);

参数说明

参数名称 参数类型 说明
pwm tuya_pwm_t PWM句柄,需要初始化PWM参数

返回值

返回值 说明
OPRT_OK 初始化成功
其他错误码 初始化失败

tuya_pwm_set

函数原型

  int tuya_pwm_set(tuya_pwm_t *pwm, float frequency, float percent);

参数说明

参数名称 参数类型 说明
pwm tuya_pwm_t PWM句柄,需要初始化PWM参数
pwm float PWM频率
pwm float PWM占空比,0-100%

返回值

返回值 说明
OPRT_OK 初始化成功
其他错误码 初始化失败

tuya_pwm_frequency_set

函数原型

  int tuya_pwm_frequency_set(tuya_pwm_t *pwm, float frequency);

参数说明

参数名称 参数类型 说明
pwm tuya_pwm_t PWM句柄,需要初始化PWM参数
pwm float PWM频率

返回值

返回值 说明
OPRT_OK 初始化成功
其他错误码 初始化失败

tuya_pwm_duty_set

函数原型

  int tuya_pwm_duty_set(tuya_pwm_t *pwm, float percent);

参数说明

参数名称 参数类型 说明
pwm tuya_pwm_t PWM句柄,需要初始化PWM参数
pwm float PWM占空比,0-100%

返回值

返回值 说明
OPRT_OK 初始化成功
其他错误码 初始化失败

tuya_pwm_polarity_set

函数原型

  int tuya_pwm_polarity_set(tuya_pwm_t *pwm, tuya_pwm_polarity_t polarity);

参数说明

参数名称 参数类型 说明
pwm tuya_pwm_t PWM句柄,需要初始化PWM参数
pwm tuya_pwm_polarity_t PWM初始极性,@tuya_pwm_polarity_t中的枚举值

返回值

返回值 说明
OPRT_OK 初始化成功
其他错误码 初始化失败

tuya_pwm_deinit

函数原型

  INT_T tuya_pwm_deinit(TY_PWM_DEV_S *pwm);

参数说明

参数名称 参数类型 说明
pwm tuya_pwm_t PWM句柄,需要初始化PWM参数

返回值

返回值 说明
OPRT_OK 初始化成功
其他错误码 初始化失败

结构体说明

tuya_pwm_port_t

结构体原型

typedef enum {
    TUYA_PWM0 = 0x00,
    TUYA_PWM1,
    TUYA_PWM2,
    TUYA_PWM3,
    TUYA_PWM4,
    TUYA_PWM5,
    TUYA_PWM6,
    TUYA_PWM7,
    TUYA_PWM8,
} tuya_pwm_port_t;

tuya_pwm_cfg_t

结构体原型

typedef struct {
    uint8_t         pin;                //! PWM输出的引脚号
    uint8_t         polarity;           //! PWM输出极性
    uint32_t        period_ns;          //! PWM输出的周期
    uint32_t        pulse_ns;           //! PWM输出的脉宽
    float           percent;            //! PWM输出占空比
} tuya_pwm_cfg_t;

tuya_pwm_polarity_t

结构体原型

typedef enum {		
    TUYA_PWM_POSITIVE = 0,			//! 初始高电平
    TUYA_PWM_NEGATIVE,				//! 初始低电平
} tuya_pwm_polarity_t;

tuya_pwm_t

结构体原型

struct tuya_pwm {
    tuya_drv_node_t     node;		//! PWM节点
    tuya_pwm_cfg_t      cfg;		//! PWM配置,参见tuya_pwm_cfg_t
    tuya_pwm_ops_t     *ops;		//! 无需关心
};
typedef struct tuya_pwm tuya_pwm_t;

PWM简化配置宏

//! __PWM: 			句柄
//! __PIN: 			引脚号	
//! __FREQUENCY:  	频率
//! __PERCENT:   	占空比
#define TUYA_PWM_CFG(__PWM, __PIN, __FREQUENCY, __PERCENT)                      \
    (__PWM)->cfg.pin       = __PIN;                                             \
    (__PWM)->cfg.period_ns = (uint32_t)1000000000 / (__FREQUENCY);              \
    (__PWM)->cfg.percent   = __PERCENT;                                         \
    (__PWM)->cfg.pulse_ns  = (uint32_t)((__PWM)->cfg.period_ns * (__PERCENT));  \
    (__PWM)->cfg.polarity  = TUYA_PWM_POSITIVE

PWM 调用示例

#include "tuya_pin.h"
#include "tuya_pwm.h"
#include "tuya_hal_system.h"

static tuya_pwm_t *pwm[5];

void tuya_pwm_test(void)
{
    UINT8_T pwm_pin[] = {
        TUYA_PA14, TUYA_PA15, TUYA_PA0, TUYA_PA5, TUYA_PA12
    };

#if 1	//! 循环初始化
    int i;
    for (i = 0; i < 5; i++) {
        pwm[i] = (tuya_pwm_t *)tuya_driver_find(TUYA_DRV_PWM, (tuya_pwm_port_t)i);
        TUYA_PWM_CFG(pwm[i], pwm_pin[i], 10 * 1000, 0.1);
        tuya_pwm_init(pwm[i]);  
        tuya_pwm_start(pwm[i]);
    }
#else  //! 单个初始化
    pwm[0] = tuya_driver_find(TUYA_DRV_PWM, TUYA_PWM0);
    TUYA_PWM_CFG(pwm[0], TUYA_PA14, 10 * 1000, 0.1);
    tuya_pwm_init(pwm[0]);
    tuya_pwm_start(pwm[0]);

    pwm[1] = tuya_driver_find(TUYA_DRV_PWM, TUYA_PWM1);
    TUYA_PWM_CFG(pwm[1], TUYA_PA15, 10 * 1000, 0.1);
    tuya_pwm_init(pwm[1]);
    tuya_pwm_start(pwm[1]);

    pwm[2] = tuya_driver_find(TUYA_DRV_PWM, TUYA_PWM2);
    TUYA_PWM_CFG(pwm[2], TUYA_PA0, 10 * 1000, 0.1);
    tuya_pwm_init(pwm[2]);
    tuya_pwm_start(pwm[2]);

    pwm[3] = tuya_driver_find(TUYA_DRV_PWM, TUYA_PWM3);
    TUYA_PWM_CFG(pwm[3], TUYA_PA5, 10 * 1000, 0.1);
    tuya_pwm_init(pwm[3]);
    tuya_pwm_start(pwm[3]);

    pwm[4] = tuya_driver_find(TUYA_DRV_PWM, TUYA_PWM4);
    TUYA_PWM_CFG(pwm[4], TUYA_PA12, 10 * 1000, 0.1);
    tuya_pwm_init(pwm[4]);
    tuya_pwm_start(pwm[4]);
#endif

    PR_DEBUG("ns %d us  %d", pwm[0]->cfg.period_ns,  pwm[0]->cfg.period_ns / 1000);

    uint8_t  flag  = 1;
    float    percent = TUYA_PWM_PERCENT(pwm[0]);

	//! PWM呼吸灯
    while (1) {
        if (flag) {
            if (percent < 1.0) {
                percent += 0.005; 
            } else {
                flag = 0;
                continue;
            }
        } else {
            if (percent > 0.005) {
                percent -= 0.005;
            } else {
                flag = 1;
                continue;
            }
        }
        PR_NOTICE("percent = %d", (int)(percent * 1000));
        for (UINT8_T i = 0; i < 5; i ++) {
            tuya_pwm_duty_set(pwm[i], percent);
        }
        tuya_hal_system_sleep(3);
    }
}