Page 1 of 2

[已解决]SDK版本升级后,PWM功能失效

Posted: 2023年 Dec 21日 10:58
by linshc

描述:我在使用TLSR8258_3.7.1版本的SDK时,控制引脚的PWM没有问题。升级到3.8.0后,代码没有做改变,但pwm不受控制了。
1.请问有3.8.0版本一些改动的说明吗?
2.新版SDK中,PWM相关功能是否进行了改动?


Re: [求助]SDK版本升级后,PWM功能失效

Posted: 2023年 Dec 21日 11:38
by huanghuan

1.你好,改动日志我们在 CHANGELOG.md 有介绍
2.在3.8.0的改动中,pwm 为了解决有开发者提出的要求多路pwm波输出严格同步 https://www.tuyaos.com/viewtopic.php?t=1413,我们将 tal_pwm_info_set 函数定义为设置pwm信息,需要在调用 tal_pwm_info_set 后再次调用 tal_pwm_start(0xFF); 0xFF表示配置的每一路按照配置信息统一进行输出

3.你可以参考配套的tuyaos_demo_zg_light2 demo
4.pwm部分是开源的驱动代码,你可对比 tkl_pwm.c 代码改动


Re: [求助]SDK版本升级后,PWM功能失效

Posted: 2023年 Dec 21日 14:57
by linshc

你好,修改完后,pwm是可以控制了。但我还遇到了个问题。我的pwm频率固定为2KHZ,极性固定为TUYA_PWM_POSITIVE。所以我只需要修改占空比即可。
问题:通过示波器发现,我的占空比只能设置到50%,大于50%后,就不会发生变化,一直显示为50%。这是为什么?是否哪里需要设置,而我漏设置了?


Re: [求助]SDK版本升级后,PWM功能失效

Posted: 2023年 Dec 21日 15:06
by linshc

看示例工程,是使用了互补功能。不知道上述问题,是不是由于互补功能引起的?我的需求不要互补功能,但又没看到哪里需要设置。


Re: [求助]SDK版本升级后,PWM功能失效

Posted: 2023年 Dec 21日 15:07
by huanghuan

1.这个50%我们没有特殊的限制,根据你的描述我没法直接定位问题
2.我建议可以先使用 tuyaos_demo_zg_light2 demo 进行配网测试,在这个demo中我们是测试过可以进行PWM拉到50%以上的,你可以先比对排查下应用程序是否有限制


Re: [求助]SDK版本升级后,PWM功能失效

Posted: 2023年 Dec 21日 15:09
by huanghuan
linshc 2023年 Dec 21日 15:06

看示例工程,是使用了互补功能。不知道上述问题,是不是由于互补功能引起的?我的需求不要互补功能,但又没看到哪里需要设置。

互补的意思是,一个正向一个反向pwm,是通过 v_cfg.polarity 不同来实现的;如果你 v_cfg.polarity 都是一样的,那就没用互补


Re: [求助]SDK版本升级后,PWM功能失效

Posted: 2023年 Dec 21日 15:16
by linshc

但我的配置流程,完全是按照示例工程来的。使用的模组是ZTU。而且上一个版本的SDK是可以变更占空比超过50%的


Re: [求助]SDK版本升级后,PWM功能失效

Posted: 2023年 Dec 21日 16:54
by linshc
huanghuan 2023年 Dec 21日 15:07

1.这个50%我们没有特殊的限制,根据你的描述我没法直接定位问题
2.我建议可以先使用 tuyaos_demo_zg_light2 demo 进行配网测试,在这个demo中我们是测试过可以进行PWM拉到50%以上的,你可以先比对排查下应用程序是否有限制

我尝试了一下,应该和频率有关。v_cfg.polarity相同,当v_cfg.duty = 500为时, 配置v_cfg.frequency = 1000时,通过示波器看是对的,50%的占空比。配置v_cfg.frequency = 2000时,通过示波器看是错的。
1.v_cfg.duty配置的值不是脉冲输出占空比,而是相对于frequency的百分比吧?例如v_cfg.frequency = 2000,要输出50%的占空比,需要配置v_cfg.duty=1000?
2.看这个TUYA_PWM_BASE_CFG_T的描述,这里的脉冲占空比和cycle有关,例程中没配置cycle是否在内部已经帮你配置了?也就是说外部配置脉冲占空比,只需要管duty和frequency之间的关系即可?

Code: Select all

/**
 * @brief pwm config
 */
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;

3.在3.7.1版本中,我就把duty当成了脉冲输出百分比,是正常的。可能3.8.0这一版内部逻辑改了吧?


Re: [求助]SDK版本升级后,PWM功能失效

Posted: 2023年 Dec 21日 17:48
by huanghuan

Code: Select all

OPERATE_RET tkl_pwm_duty_set(TUYA_PWM_NUM_E ch_id, UINT32_T duty)
{
    UINT8_T i=0;

if(ch_id >= TKL_PWM_MAX_CHANNEL) {
    return OPRT_COM_ERROR;
}

if(!g_pwm_precision[ch_id]){
    return OPRT_COM_ERROR;
}

i = g_pwm_table_index[ch_id];

if(i==0xFF){
    return OPRT_COM_ERROR;
}

tkl_pwm_cfg[ch_id].duty = duty;

set_pwm_duty(ch_id, tkl_pwm_cfg[ch_id].duty, g_pwm_precision[ch_id]);


return OPRT_OK;
}

Code: Select all

OPERATE_RET set_pwm_duty(UINT8_T ch_id, UINT16_T duty, UINT16_T precision)
{
    UINT32_T value = 0;
    UINT8_T ret = 0;
    UINT8_T i = 0;
    UINT32_T pwm_max_tick = 0;

tkl_pwm_debug("set_pwm_duty:%d,%d,%d\n",ch_id, duty, precision);
if((ch_id >= TKL_PWM_MAX_CHANNEL) || (!precision)){
    return OPRT_COM_ERROR;
}

i = g_pwm_table_index[ch_id];

if(i==0xFF){
    return OPRT_COM_ERROR;
}

tkl_pwm_cfg[ch_id].duty = duty;
g_pwm_precision[ch_id] = precision;
pwm_max_tick = get_pwm_max_tick(tkl_pwm_cfg[ch_id].frequency);
value = (duty * pwm_max_tick) / precision;
ret = set_pwm_value(ch_id, value);
return ret;
}

Re: [求助]SDK版本升级后,PWM功能失效

Posted: 2023年 Dec 21日 17:54
by huanghuan
  1. frq 和 duty是两个相互不影响的元素
  2. Code: Select all

    OPERATE_RET tkl_pwm_precision_set(TUYA_PWM_NUM_E ch_id, UINT32_T precision)
    这个函数可以修改pwm的精度, 默认精度是 1000,比如默认情况下需要输出 30%的占空比pwm,则 duty是300;60% 则duty是 600
  3. frq 是 1k,精度是 1000时,30%的占空比pwm duty应该设置为 300;frq 是 2k,精度是 1000时,30%的占空比pwm duty也应该设置为 300
  4. 下图为我们设置frequency 2k时,pwm输出超过50%的截图