[开发工具]

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

[复制链接]
706|15
手机看帖
扫描二维码
随时随地手机跟帖
courage001|  楼主 | 2023-2-26 22:46 | 显示全部楼层 |阅读模式
各位大神,本人在使用HC32L130过程中,遇到一个Timer4 PWM输出异常的问题,请求大神指点。

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

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

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

后面又用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 | 显示全部楼层

以图片为证,例程跑的一点问题都没有
3.jpeg
2.jpg
1.jpg

使用特权

评论回复
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

主题

9

帖子

0

粉丝