更新时间: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.h
OPERATE_RET tkl_pwm_deinit(TUYA_PWM_NUM_E ch_id);
ch_id
:通道号OPRT_OK
:成功tuya_error_code.h
OPERATE_RET tkl_pwm_start(TUYA_PWM_NUM_E ch_id);
ch_id
:通道号OPRT_OK
:成功tuya_error_code.h
OPERATE_RET tkl_pwm_stop(TUYA_PWM_NUM_E ch_id);
port
:端口号OPRT_OK
:成功tuya_error_code.h
OPERATE_RET tkl_pwm_multichannel_start(TUYA_PWM_NUM_E *ch_id, UINT8_T num);
ch_id
:通道号列表,数组num
:启动的通道号数目OPRT_OK
:成功tuya_error_code.h
OPERATE_RET tkl_pwm_multichannel_stop(TUYA_PWM_NUM_E *ch_id, UINT8_T num);
功能描述:
参数:
ch_id
:通道号列表,数组num
:需要关闭的通道号数目返回值:
OPRT_OK
:成功tuya_error_code.h
OPERATE_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.h
OPERATE_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.h
OPERATE_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.h
OPERATE_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;
}
}
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈