各位大神,本人在使用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配置
}
查了很久没啥思路,请求指点,谢谢。
|