courage001 发表于 2023-2-26 22:46

求技术支持——HC32L130 Timer4 PWM在比较值较小时输出异常

各位大神,本人在使用HC32L130过程中,遇到一个Timer4 PWM输出异常的问题,请求大神指点。

程序使用华大单片机SDK hc32l13x_ddl_Rev1.9.2 Lite里面的例程CompareOutput。

发现当PWM的比较值较大时,输出还算正常(占空比其实是有一点点误差的)。
App_AdvTimerInit(0xC000, 0x4000, 0x8000);//AdvTimer4初始化


但是当把比较值设小时,输出异常,CHA直接没输出了(可以确定非硬件连接问题)。
App_AdvTimerInit(200, 20, 40);//AdvTimer4初始化


后面又用ddl例程HC32L136_DDL_Rev1.2.0,还有在网站上找了下其他人跑Timer4 PWM的例程,发现异常现象也是一样的。
当PWM周期值和比较值设置的比较大的时候,比如0xEEEE等,PWM输出都是正常。
一旦将PWM周期值和比较值设置的比较小的时候,PWM占空比就偏差的特别大,可以偏差2%到5%。
感觉像是PWM基准值没清零,从某个值(正常从0)开始跑到比较值那里去。

int32_t main(void)
{
    App_ClockInit();   //时钟初始化

//    App_AdvTimerInit(0xC000, 0x4000, 0x8000);//AdvTimer4初始化
                App_AdvTimerInit(200, 20, 40);//AdvTimer4初始化
    //配置为锯齿波模式: 周期0xC000, CHA占空比设置0x4000,CHB占空比设置0x8000

    App_AdvTimerPortInit();    //AdvTimer端口初始化

    Adt_StartCount(M0P_ADTIM4); //AdvTimer4运行

    while(1);
}


///< AdvTimer初始化
void App_AdvTimerInit(uint16_t u16Period, uint16_t u16CHA_PWMDuty, uint16_t u16CHB_PWMDuty)
{
    en_adt_compare_t          enAdtCompareA;
    en_adt_compare_t          enAdtCompareB;

    stc_adt_basecnt_cfg_t   stcAdtBaseCntCfg;
    stc_adt_CHxX_port_cfg_t   stcAdtTIM4ACfg;
    stc_adt_CHxX_port_cfg_t   stcAdtTIM4BCfg;

    DDL_ZERO_STRUCT(stcAdtBaseCntCfg);
    DDL_ZERO_STRUCT(stcAdtTIM4ACfg);
    DDL_ZERO_STRUCT(stcAdtTIM4BCfg);

    Sysctrl_SetPeripheralGate(SysctrlPeripheralAdvTim, TRUE);    //ADT外设时钟使能

    stcAdtBaseCntCfg.enCntMode = AdtSawtoothMode;               //锯齿波模式
    stcAdtBaseCntCfg.enCntDir = AdtCntUp;
    stcAdtBaseCntCfg.enCntClkDiv = AdtClkPClk0;

    Adt_Init(M0P_ADTIM4, &stcAdtBaseCntCfg);                      //ADT载波、计数模式、时钟配置

    Adt_SetPeriod(M0P_ADTIM4, u16Period);                         //周期设置

    enAdtCompareA = AdtCompareA;
    Adt_SetCompareValue(M0P_ADTIM4, enAdtCompareA, u16CHA_PWMDuty);//通用比较基准值寄存器A设置

    enAdtCompareB = AdtCompareB;
    Adt_SetCompareValue(M0P_ADTIM4, enAdtCompareB, u16CHB_PWMDuty);//通用比较基准值寄存器B设置

    stcAdtTIM4ACfg.enCap = AdtCHxCompareOutput;            //比较输出
    stcAdtTIM4ACfg.bOutEn = TRUE;                        //CHA输出使能
    stcAdtTIM4ACfg.enPerc = AdtCHxPeriodLow;               //计数值与周期匹配时CHA电平保持不变
    stcAdtTIM4ACfg.enCmpc = AdtCHxCompareHigh;             //计数值与比较值A匹配时,CHA电平翻转
    stcAdtTIM4ACfg.enStaStp = AdtCHxStateSelSS;            //CHA起始结束电平由STACA与STPCA控制
    stcAdtTIM4ACfg.enStaOut = AdtCHxPortOutLow;            //CHA起始电平为低
    stcAdtTIM4ACfg.enStpOut = AdtCHxPortOutLow;            //CHA结束电平为低
    Adt_CHxXPortCfg(M0P_ADTIM4, AdtCHxA, &stcAdtTIM4ACfg);   //端口CHA配置

    stcAdtTIM4BCfg.enCap = AdtCHxCompareOutput;
    stcAdtTIM4BCfg.bOutEn = TRUE;
    stcAdtTIM4BCfg.enPerc = AdtCHxPeriodInv;
    stcAdtTIM4BCfg.enCmpc = AdtCHxCompareInv;
    stcAdtTIM4BCfg.enStaStp = AdtCHxStateSelSS;
    stcAdtTIM4BCfg.enStaOut = AdtCHxPortOutLow;
    stcAdtTIM4BCfg.enStpOut = AdtCHxPortOutLow;
    Adt_CHxXPortCfg(M0P_ADTIM4, AdtCHxB, &stcAdtTIM4BCfg);    //端口CHB配置
}


查了很久没啥思路,请求指点,谢谢。


wubangmi 发表于 2023-2-27 08:57

请使用原厂例程的CompareOutputBuf这个工程例程

skg65874200 发表于 2023-2-27 09:49

3492151634加Q技术

courage001 发表于 2023-2-27 09:57

wubangmi 发表于 2023-2-27 08:57
请使用原厂例程的CompareOutputBuf这个工程例程

有试过,HC32L136_DDL_Rev1.2.0\example\adt\CompareOutputBuf 和 hc32l13x_ddl_Rev1.9.2 Lite\example\adt\CompareOutputBuf两个例程,原配置0xC000/0x4000/0x8000,占空比就有偏差。改成120/40/80,两PWM引脚就直接没输出了。

wubangmi 发表于 2023-2-27 11:38

courage001 发表于 2023-2-27 09:57
有试过,HC32L136_DDL_Rev1.2.0\example\adt\CompareOutputBuf 和 hc32l13x_ddl_Rev1.9.2 Lite\example\a ...

测试的时候,把主频跑到48M上去

courage001 发表于 2023-2-27 11:39

PLL已经是48M了。

courage001 发表于 2023-2-27 11:39

wubangmi 发表于 2023-2-27 11:38
测试的时候,把主频跑到48M上去

PLL已经是48M了。

wubangmi 发表于 2023-2-27 12:02

courage001 发表于 2023-2-27 11:39
PLL已经是48M了。

以图片为证,例程跑的一点问题都没有

courage001 发表于 2023-2-27 13:32

谢谢。可能是我手上的例程库版本太老了,能不能麻烦帮忙分享下最新的ddl和lite库给我,258004593@qq.com。

courage001 发表于 2023-2-27 13:32

wubangmi 发表于 2023-2-27 12:02
以图片为证,例程跑的一点问题都没有

谢谢。可能是我手上的例程库版本太老了,能不能麻烦帮忙分享下最新的ddl和lite库给我,258004593@qq.com。

courage001 发表于 2023-2-27 14:11

wubangmi 发表于 2023-2-27 12:02
以图片为证,例程跑的一点问题都没有

官网上找到了,谢谢。

wubangmi 发表于 2023-2-27 14:11

courage001 发表于 2023-2-27 13:32
谢谢。可能是我手上的例程库版本太老了,能不能麻烦帮忙分享下最新的ddl和lite库给我,。 ...

http://www.xhsc.com.cn/Productlist/info.aspx?itemid=1765

martinhu 发表于 2023-2-27 16:51

动态调整PWM,得使用缓存功能,不然PWM会出错

xch 发表于 2023-2-28 16:50

是不是设置了死区? 把PWM占空比吃掉部分

courage001 发表于 2023-2-28 21:05

martinhu 发表于 2023-2-27 16:51
动态调整PWM,得使用缓存功能,不然PWM会出错

谢谢

courage001 发表于 2023-2-28 21:07

xch 发表于 2023-2-28 16:50
是不是设置了死区? 把PWM占空比吃掉部分

不是
页: [1]
查看完整版本: 求技术支持——HC32L130 Timer4 PWM在比较值较小时输出异常