更新时间:2025-04-29 08:08:04下载pdf
脉冲宽度调制(Pulse Width Modulation,PWM)是利用微处理器的数字输出对模拟电路进行控制的一种有效的技术。

如上图所示,是一个周期频率为 100Hz 的 PWM 波形,高电平占空比为 40%,低电平占空比为 60%,通过调节高电平占空比的值,即可以改变模拟输出值的大小。
OPERATE_RET tkl_pwm_init(TUYA_PWM_NUM_E ch_id, CONST TUYA_PWM_BASE_CFG_T *cfg);
功能描述:
参数:
ch_id:通道号
cfg:PWM 基础配置,包含输出极性、占空比、频率
typedef struct {
TUYA_PWM_POLARITY_E polarity;
TUYA_PWM_COUNT_E count_mode;
//pulse duty cycle = duty / cycle; exp duty = 5000,cycle = 10000; pulse duty cycle = 50%
UINT_T duty;
UINT_T cycle;
UINT_T frequency; // (bet: Hz)
} TUYA_PWM_BASE_CFG_T;
polarity:
| 名字 | 定义 |
|---|---|
| TUYA_PWM_NEGATIVE | PWM 低有效输出 |
| TUYA_PWM_POSITIVE | PWM 高有效输出 |
count_mode:计数模式,有 TUYA_PWM_CNT_UP 和 TUYA_PWM_CNT_UP_AND_DOWN 两种
duty:占空比,和 cycle 搭配使用,输出 = duty/cycle
cycle:周期或颗粒度,输出 = duty/cycle
frequency:输出频率,单位 Hz
返回值:
OPRT_OK:成功tuya_error_code.hOPERATE_RET tkl_pwm_deinit(TUYA_PWM_NUM_E ch_id);
ch_id:通道号OPRT_OK:成功tuya_error_code.hOPERATE_RET tkl_pwm_start(TUYA_PWM_NUM_E ch_id);
ch_id:通道号OPRT_OK:成功tuya_error_code.hOPERATE_RET tkl_pwm_stop(TUYA_PWM_NUM_E ch_id);
port:端口号OPRT_OK:成功tuya_error_code.hOPERATE_RET tkl_pwm_multichannel_start(TUYA_PWM_NUM_E *ch_id, UINT8_T num);
ch_id:通道号列表,数组num:启动的通道号数目OPRT_OK:成功tuya_error_code.hOPERATE_RET tkl_pwm_multichannel_stop(TUYA_PWM_NUM_E *ch_id, UINT8_T num);
功能描述:
参数:
ch_id:通道号列表,数组num:需要关闭的通道号数目返回值:
OPRT_OK:成功tuya_error_code.hOPERATE_RET tkl_pwm_info_set(TUYA_PWM_NUM_E ch_id, CONST TUYA_PWM_BASE_CFG_T *info);
ch_id:通道号info:PWM 基础配置,包含输出极性、占空比、频率。其结构体参数见上文描述OPRT_OK 表示成功tuya_error_code.hOPERATE_RET tkl_pwm_info_get(TUYA_PWM_NUM_E ch_id, TUYA_PWM_BASE_CFG_T *info);
ch_id:通道号info:PWM 基础配置,包含输出极性、占空比、频率。其结构体参数见上文描述OPRT_OK 表示成功tuya_error_code.hOPERATE_RET tkl_pwm_cap_start(TUYA_PWM_NUM_E ch_id, CONST TUYA_PWM_CAP_IRQ_T *cfg);
功能描述:
参数:
ch_id:通道号
cfg:PWM 输入捕获配置,如下详述
cap_mode:
| 名字 | 定义 |
|---|---|
| TUYA_PWM_CAPTURE_MODE_ONCE | 单次触发模式 |
| TUYA_PWM_CAPTURE_MODE_PERIOD | 多次触发模式 |
trigger_level:
| 名字 | 定义 |
|---|---|
| TUYA_PWM_NEGATIVE | 触发信号为下降沿 |
| TUYA_PWM_POSITIVE | 触发信号为上升沿 |
clk:抓取信号的采样时钟
cb:抓取信号的回调函数,如下:
typedef VOID_T (*TUYA_PWM_IRQ_CB)(TUYA_PWM_NUM_E port, TUYA_PWM_CAPTURE_DATA_T data, VOID_T *arg);
typedef struct {
UINT_T cap_value; /* Captured data */
TUYA_PWM_POLARITY_E cap_edge; /* Capture edge, TUYA_PWM_NEGATIVE:falling edge, TUYA_PWM_POSITIVE:rising edge */
} TUYA_PWM_CAPTURE_DATA_T;
arg:回调函数参数
返回值:
OPRT_OK 表示成功tuya_error_code.hOPERATE_RET tkl_pwm_cap_stop(TUYA_PWM_NUM_E ch_id);
功能描述:
参数:
ch_id: 通道号返回值:
OPRT_OK 表示成功tuya_error_code.h
void tuya_pwm_test(void)
{
OPERATE_RET ret;
TUYA_PWM_BASE_CFG_T cfg = {.polarity = TUYA_PWM_POSITIVE,\
.duty = 1000,
.cycle = 10000,
.frequency = 1000};
ret = tkl_pwm_init(TUYA_PWM_NUM_0, &cfg);
if (ret != OPRT_OK) {
//fail
return;
}
ret = tkl_pwm_start(TUYA_PWM_NUM_0);
if (ret != OPRT_OK) {
//fail
return;
}
tkl_system_delay(5000);
ret = tkl_pwm_info_get(TUYA_PWM_NUM_0, &cfg);
if (ret != OPRT_OK) {
//fail
return;
}
if(cfg.duty !=5000){
cfg.duty =5000;
}
ret = tkl_pwm_info_set(TUYA_PWM_NUM_0, &cfg);
//delay
tkl_system_delay(5000);
ret = tkl_pwm_stop(TUYA_PWM_NUM_0);
if (ret != OPRT_OK) {
//fail
return;
}
ret = tkl_pwm_deinit(TKL_PWM1_CH);
if (ret != OPRT_OK) {
//fail
return;
}
}
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈