打印
[开发工具]

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

[复制链接]
865|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
各位大神,本人在使用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引脚就直接没输出了。

使用特权

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

使用特权

评论回复
6
courage001|  楼主 | 2023-2-27 11:39 | 只看该作者
PLL已经是48M了。

使用特权

评论回复
7
courage001|  楼主 | 2023-2-27 11:39 | 只看该作者
wubangmi 发表于 2023-2-27 11:38
测试的时候,把主频跑到48M上去

PLL已经是48M了。

使用特权

评论回复
8
wubangmi| | 2023-2-27 12:02 | 只看该作者

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

3.jpeg (495.1 KB )

3.jpeg

2.jpg (410.37 KB )

2.jpg

1.jpg (429.34 KB )

1.jpg

使用特权

评论回复
9
courage001|  楼主 | 2023-2-27 13:32 | 只看该作者
谢谢。可能是我手上的例程库版本太老了,能不能麻烦帮忙分享下最新的ddl和lite库给我,258004593@qq.com

使用特权

评论回复
10
courage001|  楼主 | 2023-2-27 13:32 | 只看该作者
wubangmi 发表于 2023-2-27 12:02
以图片为证,例程跑的一点问题都没有

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

使用特权

评论回复
11
courage001|  楼主 | 2023-2-27 14:11 | 只看该作者
wubangmi 发表于 2023-2-27 12:02
以图片为证,例程跑的一点问题都没有

官网上找到了,谢谢。

使用特权

评论回复
12
wubangmi| | 2023-2-27 14:11 | 只看该作者
courage001 发表于 2023-2-27 13:32
谢谢。可能是我手上的例程库版本太老了,能不能麻烦帮忙分享下最新的ddl和lite库给我,。 ...

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

使用特权

评论回复
13
martinhu| | 2023-2-27 16:51 | 只看该作者
动态调整PWM,得使用缓存功能,不然PWM会出错

使用特权

评论回复
14
xch| | 2023-2-28 16:50 | 只看该作者
是不是设置了死区? 把PWM占空比吃掉部分

使用特权

评论回复
15
courage001|  楼主 | 2023-2-28 21:05 | 只看该作者
martinhu 发表于 2023-2-27 16:51
动态调整PWM,得使用缓存功能,不然PWM会出错

谢谢

使用特权

评论回复
16
courage001|  楼主 | 2023-2-28 21:07 | 只看该作者
xch 发表于 2023-2-28 16:50
是不是设置了死区? 把PWM占空比吃掉部分

不是

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

9

帖子

0

粉丝