更新时间:2024-11-20 08:51:14下载pdf
函数名称 | 功能描述 |
---|---|
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 |
函数原型
int tuya_pwm_init(tuya_pwm_t *pwm);
参数说明
参数名称 | 参数类型 | 说明 |
---|---|---|
pwm | tuya_pwm_t | PWM句柄,需要初始化PWM参数 |
返回值
返回值 | 说明 |
---|---|
OPRT_OK | 初始化成功 |
其他错误码 | 初始化失败 |
函数原型
int tuya_pwm_start(tuya_pwm_t *pwm);
参数说明
参数名称 | 参数类型 | 说明 |
---|---|---|
pwm | tuya_pwm_t | PWM句柄,需要初始化PWM参数 |
返回值
返回值 | 说明 |
---|---|
OPRT_OK | 初始化成功 |
其他错误码 | 初始化失败 |
函数原型
int tuya_pwm_stop(tuya_pwm_t *pwm);
参数说明
参数名称 | 参数类型 | 说明 |
---|---|---|
pwm | tuya_pwm_t | PWM句柄,需要初始化PWM参数 |
返回值
返回值 | 说明 |
---|---|
OPRT_OK | 初始化成功 |
其他错误码 | 初始化失败 |
函数原型
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 | 初始化成功 |
其他错误码 | 初始化失败 |
函数原型
int tuya_pwm_frequency_set(tuya_pwm_t *pwm, float frequency);
参数说明
参数名称 | 参数类型 | 说明 |
---|---|---|
pwm | tuya_pwm_t | PWM句柄,需要初始化PWM参数 |
pwm | float | PWM频率 |
返回值
返回值 | 说明 |
---|---|
OPRT_OK | 初始化成功 |
其他错误码 | 初始化失败 |
函数原型
int tuya_pwm_duty_set(tuya_pwm_t *pwm, float percent);
参数说明
参数名称 | 参数类型 | 说明 |
---|---|---|
pwm | tuya_pwm_t | PWM句柄,需要初始化PWM参数 |
pwm | float | PWM占空比,0-100% |
返回值
返回值 | 说明 |
---|---|
OPRT_OK | 初始化成功 |
其他错误码 | 初始化失败 |
函数原型
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 | 初始化成功 |
其他错误码 | 初始化失败 |
函数原型
INT_T tuya_pwm_deinit(TY_PWM_DEV_S *pwm);
参数说明
参数名称 | 参数类型 | 说明 |
---|---|---|
pwm | tuya_pwm_t | PWM句柄,需要初始化PWM参数 |
返回值
返回值 | 说明 |
---|---|
OPRT_OK | 初始化成功 |
其他错误码 | 初始化失败 |
结构体原型
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;
结构体原型
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;
结构体原型
typedef enum {
TUYA_PWM_POSITIVE = 0, //! 初始高电平
TUYA_PWM_NEGATIVE, //! 初始低电平
} tuya_pwm_polarity_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: 句柄
//! __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
#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);
}
}
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈