PWM

更新时间:2025-04-29 08:08:04下载pdf

概述

脉冲宽度调制(Pulse Width Modulation,PWM)是利用微处理器的数字输出对模拟电路进行控制的一种有效的技术。

PWM

如上图所示,是一个周期频率为 100Hz 的 PWM 波形,高电平占空比为 40%,低电平占空比为 60%,通过调节高电平占空比的值,即可以改变模拟输出值的大小。

API 描述

tkl_pwm_init

OPERATE_RET tkl_pwm_init(TUYA_PWM_NUM_E ch_id, CONST TUYA_PWM_BASE_CFG_T *cfg);
  • 功能描述:

    • 通过端口号和基础配置初始化对应的 PWM 实例,返回初始化结果
  • 参数:

    • 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_UPTUYA_PWM_CNT_UP_AND_DOWN 两种

      • duty:占空比,和 cycle 搭配使用,输出 = duty/cycle

      • cycle:周期或颗粒度,输出 = duty/cycle

      • frequency:输出频率,单位 Hz

  • 返回值:

    • OPRT_OK:成功
    • 其他请参考文件 tuya_error_code.h

tkl_pwm_deinit

OPERATE_RET tkl_pwm_deinit(TUYA_PWM_NUM_E ch_id);
  • 功能描述:
    • PWM 实例反初始化
    • 该接口会停止 PWM 实例正在进行的传输(如果有),并且释放相关的软硬件资源
  • 参数:
    • ch_id:通道号
  • 返回值:
    • OPRT_OK:成功
    • 其他请参考文件 tuya_error_code.h

tkl_pwm_start

OPERATE_RET tkl_pwm_start(TUYA_PWM_NUM_E ch_id);
  • 功能描述:
    • 启动 PWM
  • 参数:
    • ch_id:通道号
  • 返回值:
    • OPRT_OK:成功
    • 其他请参考文件 tuya_error_code.h

tkl_pwm_stop

OPERATE_RET tkl_pwm_stop(TUYA_PWM_NUM_E ch_id);
  • 功能描述:
    • 停止 PWM
  • 参数:
    • port:端口号
  • 返回值:
    • OPRT_OK:成功
    • 其他请参考文件 tuya_error_code.h

tkl_pwm_multichannel_start

OPERATE_RET tkl_pwm_multichannel_start(TUYA_PWM_NUM_E *ch_id, UINT8_T num);
  • 功能描述:
    • 同时启动多通道 PWM,用于多路组合输出,用于对时序要求比较严格的场景
  • 参数:
    • ch_id:通道号列表,数组
    • num:启动的通道号数目
  • 返回值:
    • OPRT_OK:成功
    • 其他请参考文件 tuya_error_code.h

tkl_pwm_multichannel_stop

OPERATE_RET tkl_pwm_multichannel_stop(TUYA_PWM_NUM_E *ch_id, UINT8_T num);
  • 功能描述:

    • 同时停止多通道 PWM,用于多路组合输出,对时序要求比较严格的场景
  • 参数:

    • ch_id:通道号列表,数组
    • num:需要关闭的通道号数目
  • 返回值:

    • OPRT_OK:成功
    • 其他请参考文件 tuya_error_code.h

tkl_pwm_info_set

OPERATE_RET tkl_pwm_info_set(TUYA_PWM_NUM_E ch_id, CONST TUYA_PWM_BASE_CFG_T *info);
  • 功能描述:
    • 设置 PWM 配置参数,PWM start 之后可动态修改配置,并重新 Start
  • 参数:
    • ch_id:通道号
    • info:PWM 基础配置,包含输出极性、占空比、频率。其结构体参数见上文描述
  • 返回值:
    • 错误码,OPRT_OK 表示成功
    • 其他请参考文件 tuya_error_code.h

tkl_pwm_info_get

OPERATE_RET tkl_pwm_info_get(TUYA_PWM_NUM_E ch_id, TUYA_PWM_BASE_CFG_T *info);
  • 功能描述:
    • 获取 PWM 配置信息
  • 参数:
    • ch_id:通道号
    • info:PWM 基础配置,包含输出极性、占空比、频率。其结构体参数见上文描述
  • 返回值:
    • 错误码,OPRT_OK 表示成功
    • 其他请参考文件 tuya_error_code.h

tkl_pwm_cap_start

OPERATE_RET tkl_pwm_cap_start(TUYA_PWM_NUM_E ch_id, CONST TUYA_PWM_CAP_IRQ_T *cfg);
  • 功能描述:

    • 开启 PWM 输入捕获模式
  • 参数:

    • 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

tkl_pwm_cap_stop

OPERATE_RET tkl_pwm_cap_stop(TUYA_PWM_NUM_E ch_id);
  • 功能描述:

    • 关闭 PWM 输入捕获模式
  • 参数:

    • 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;
    }
}