Page 1 of 2

【已解决】关于使用TuyaOS 3.8.1开发,PWM异常问题

Posted: 2023年 Oct 14日 14:30
by Jaoki

有个项目使用TuyaOS-3.8.1开发的,发现PWM 频率设置为4K的时候正常,设置为1KHz的时候,会出现异常,附录出现问题的部分代码片段,模块Log输出详情见附件。

Code: Select all

if(channel == 3) {      /* channel is C */
                uiCold = (UINT_T)(fPercent * uiPeriod);
                TAL_PR_DEBUG("uiCold = %d, fPercent = %f, duty = %d", uiCold, fPercent, duty);
            } else if(channel == 4) {   /* channel is W */
                if((uiCold == 0) && ((UINT_T)(fPercent * uiPeriod) == 0)) {
                    // tuya_pwm_stop(pChannelList[3],pChannelList[4]);
                    TUYA_CALL_ERR_LOG(tkl_pwm_multichannel_stop(&pChannelList[3], 2));
                } else {
                    // tuya_pwm_reset_duty_cycle(pChannelList[3], pChannelList[4], uiCold, (UINT_T)(fPercent * uiPeriod), uiPeriod, 0);
                    TUYA_CALL_ERR_LOG(tkl_pwm_duty_set(pChannelList[3], uiCold));
                    TUYA_CALL_ERR_LOG(tkl_pwm_duty_set(pChannelList[4], (UINT_T)(fPercent * uiPeriod)));
                    TUYA_CALL_ERR_LOG(tkl_pwm_multichannel_start(&pChannelList[3], 2));
                    TAL_PR_DEBUG("uiCWarm = %d, fPercent = %f, duty = %d", (UINT_T)(fPercent * uiPeriod), fPercent, duty);
                }
            } else {

Re: 【求助】关于使用TuyaOS 3.8.1开发,PWM异常问题

Posted: 2023年 Oct 16日 09:48
by yingtao_33

模块日志中已经有报错具体的报错信息,可根据信息进行排查问题


Re: 【求助】关于使用TuyaOS 3.8.1开发,PWM异常问题

Posted: 2023年 Oct 16日 09:54
by chaser

这个报错是因为应用传入的占空比 > 1导致的。 占空比范围 0-1 .


Re: 【求助】关于使用TuyaOS 3.8.1开发,PWM异常问题

Posted: 2023年 Oct 16日 10:03
by Jaoki

根据模块输出的Log 来看, 这时候传入的占空比不是才0.39左右吗?
[01-01 00:00:01 ty D][soc_pwm.c:242] uiCold = 10010, fPercent = 0.385000, duty = 385
cold_duty(26026) + warm_duty(0) > count(26000)
[01-01 00:00:01 ty E][soc_pwm.c:251] ret:-1
[01-01 00:00:01 ty D][soc_pwm.c:252] uiCWarm = 0, fPercent = 0.000000, duty = 0
[01-01 00:00:01 ty D][soc_pwm.c:242] uiCold = 10192, fPercent = 0.392000, duty = 392
cold_duty(26499) + warm_duty(0) > count(26000)
[01-01 00:00:01 ty E][soc_pwm.c:251] ret:-1
[01-01 00:00:01 ty D][soc_pwm.c:252] uiCWarm = 0, fPercent = 0.000000, duty = 0
[01-01 00:00:01 ty D][soc_pwm.c:242] uiCold = 10374, fPercent = 0.399000, duty = 399


Re: 【求助】关于使用TuyaOS 3.8.1开发,PWM异常问题

Posted: 2023年 Oct 16日 10:15
by chaser

建议把传入的所有参数打印看看, 从日志上看就是占空比输入异常导致的报错


Re: 【求助】关于使用TuyaOS 3.8.1开发,PWM异常问题

Posted: 2023年 Oct 16日 10:28
by yingtao_33

请问你是用pwm来驱动灯珠吗


Re: 【求助】关于使用TuyaOS 3.8.1开发,PWM异常问题

Posted: 2023年 Oct 16日 10:47
by yingtao_33

3.8.1框架里的example中有pwm 的驱动基础示例,example 使用示例请参考帖子:https://www.tuyaos.com/viewtopic.php?t=357


Re: 【求助】关于使用TuyaOS 3.8.1开发,PWM异常问题

Posted: 2023年 Oct 16日 11:43
by Jaoki

你们的例子看了,很简单例子,只是更改频率的测试。

Code: Select all

STATIC VOID __example_pwm_task(VOID* param)
{
    OPERATE_RET rt = OPRT_OK;
    UINT32_T frequency = PWM_FREQUENCY;
    UINT32_T count = 0;

/*pwm init*/
TUYA_PWM_BASE_CFG_T pwm_cfg = {
    .duty = PWM_DUTY, /* 1-10000 */
    .frequency = PWM_FREQUENCY,
    .polarity  = TUYA_PWM_NEGATIVE,
};
TUYA_CALL_ERR_GOTO(tkl_pwm_init(PWM_ID, &pwm_cfg), __EXIT);

/*start PWM3*/
TUYA_CALL_ERR_GOTO(tkl_pwm_start(PWM_ID), __EXIT);
TAL_PR_NOTICE("PWM%d start", PWM_ID);

while (1) {
    /*Frequency, duty cycle settings*/
    TUYA_CALL_ERR_LOG(tkl_pwm_frequency_set(PWM_ID, frequency));
    TUYA_CALL_ERR_LOG(tkl_pwm_start(PWM_ID));
    TAL_PR_NOTICE("PWM%d , frequency: %d", PWM_ID,  frequency);

    /*close pwm*/
    if(count >= 3) {
        break;
    }
    count++;
    frequency = frequency+10000;

    tal_system_sleep(2000);
}

TUYA_CALL_ERR_LOG(tkl_pwm_stop(PWM_ID));

__EXIT:
    TAL_PR_NOTICE("PWM task is finished, will delete");
    tal_thread_delete(sg_pwm_handle);
    return;
}

根据实测模块输出的Log来看, 传入的参数(占空比)应该是没超过1才对,见附件图片:1.png。


Re: 【求助】关于使用TuyaOS 3.8.1开发,PWM异常问题

Posted: 2023年 Oct 16日 11:46
by Jaoki

附件里面的图片怎么上传不了了呢


Re: 【求助】关于使用TuyaOS 3.8.1开发,PWM异常问题

Posted: 2023年 Oct 16日 11:49
by yingtao_33

需要点击 “置于文中“