没有停止定时器呢,基本是按照华大案例库给的代码来做的,太邪门了,都不敢用他的所谓的高级定时器了,用其他厂家芯片从来没遇到过这种问题。相关代码如下。
/******************************************************************************
Function Name : ISR_Timer5ForInvCfg
--------------------------------------------------------------------------------
Function Descriptions : Timer5端口初始化,用于驱动信号
Parameter Name list :
ReturnType :
Refer documents :
******************************************************************************/
void ISR_Timer5ForInvCfg(uint16_t u16Period, uint16_t u16CHA_PWMDuty, uint16_t u16CHB_PWMDuty)
{
en_adt_compare_t enAdtCompare;
stc_adt_basecnt_cfg_t stcAdtBaseCntCfg;
stc_adt_irq_trig_cfg_t stcAdtIrqTrigCfg;
// stc_adt_CHxX_port_cfg_t stcAdtTIM5ACfg;
// stc_adt_CHxX_port_cfg_t stcAdtTIM5BCfg;
DDL_ZERO_STRUCT(stcAdtBaseCntCfg);
DDL_ZERO_STRUCT(stcAdtIrqTrigCfg);
DDL_ZERO_STRUCT(stcAdtTimer5ACfg);
DDL_ZERO_STRUCT(stcAdtTimer5BCfg);
Sysctrl_SetPeripheralGate(SysctrlPeripheralAdvTim, TRUE); //ADT外设时钟使能
stcAdtBaseCntCfg.enCntMode = AdtTriangleModeA; //三角波A
stcAdtBaseCntCfg.enCntDir = AdtCntUp;
stcAdtBaseCntCfg.enCntClkDiv = AdtClkPClk0; // AdtClkPClk0Div2
Adt_Init(M0P_ADTIM5, &stcAdtBaseCntCfg); //ADT载波、计数模式、时钟配置
Adt_SetPeriod(M0P_ADTIM5, u16Period); //周期值
enAdtCompare = AdtCompareA;
Adt_SetCompareValue(M0P_ADTIM5, enAdtCompare, u16CHA_PWMDuty); //通用比较基准值寄存器A设置
enAdtCompare = AdtCompareB;
Adt_SetCompareValue(M0P_ADTIM5, enAdtCompare, u16CHB_PWMDuty); //通用比较基准值寄存器B设置
enAdtCompare = AdtCompareC;
Adt_SetCompareValue(M0P_ADTIM5, enAdtCompare, u16CHA_PWMDuty); //通用比较基准值寄存器C设置
Adt_EnableValueBuf(M0P_ADTIM5, AdtCHxA, TRUE); //缓存传送A使能 GCMCR--->GCMAR,三角波A模式在下溢点传送
//Adt_EnableValueBuf(M0P_ADTIM5, AdtCHxB, TRUE); //缓存传送B不需要设置,因为GCMBR由GCMAR和死区时间计算得到
stcAdtTimer5ACfg.enCap = AdtCHxCompareOutput; //比较输出模式
stcAdtTimer5ACfg.bOutEn = FALSE; //CHA输出使能
stcAdtTimer5ACfg.enPerc = AdtCHxPeriodKeep; //计数值与周期匹配时CHA电平保持不变
stcAdtTimer5ACfg.enCmpc = AdtCHxCompareInv; //计数值与比较值A匹配时,CHA电平翻转
stcAdtTimer5ACfg.enStaStp = AdtCHxStateSelSS; //CHA起始结束电平由STACA与STPCA控制
stcAdtTimer5ACfg.enStaOut = AdtCHxPortOutLow; //CHA起始电平为低
stcAdtTimer5ACfg.enStpOut = AdtCHxPortOutLow; //CHA结束电平为低
Adt_CHxXPortCfg(M0P_ADTIM5, AdtCHxA, &stcAdtTimer5ACfg); //端口CHA配置
stcAdtTimer5BCfg.enCap = AdtCHxCompareOutput;
stcAdtTimer5BCfg.bOutEn = FALSE;
stcAdtTimer5BCfg.enPerc = AdtCHxPeriodKeep;
stcAdtTimer5BCfg.enCmpc = AdtCHxCompareInv;
stcAdtTimer5BCfg.enStaStp = AdtCHxStateSelSS;
stcAdtTimer5BCfg.enStaOut = AdtCHxPortOutHigh; //CHB起始电平为高(为了上下桥互补)
stcAdtTimer5BCfg.enStpOut = AdtCHxPortOutLow; //CHB结束电平为低
Adt_CHxXPortCfg(M0P_ADTIM5, AdtCHxB, &stcAdtTimer5BCfg); //端口CHB配置
Adt_SetDTUA(M0P_ADTIM5, INV_PWM_DB); //CNT向上计数时的死区时间,GCMBR = GCMAR - DTUAR
Adt_SetDTDA(M0P_ADTIM5, INV_PWM_DB); //CNT向下计数时的死区时间,GCMBR = GCMAR - DTDAR
Adt_CfgDT(M0P_ADTIM5, TRUE, TRUE); //中断使能,并且DTUAR和DTDAR自动相等
// Adt_ClearAllIrqFlag(M0P_ADTIM5); //清标志位
// Adt_CfgIrq(M0P_ADTIM5, AdtUDFIrq, TRUE); //下溢中断配置
// EnableNvic(ADTIM5_IRQn, IrqLevel3, TRUE); //使能AdvTimer4 中断
stcAdtIrqTrigCfg.bAdtOverFlowTrigEn = TRUE;
Adt_IrqTrigCfg(M0P_ADTIM5, &stcAdtIrqTrigCfg); // 上溢中断触发ADC
}
void PPINV_InvEnable()
{
stcAdtTimer5ACfg.bOutEn = TRUE; //CHAÊä³öʹÄÜ FALSE;
stcAdtTimer5BCfg.bOutEn = TRUE;
stcAdtTimer6ACfg.bOutEn = TRUE; //CHAÊä³öʹÄÜ FALSE;
stcAdtTimer6BCfg.bOutEn = TRUE;
Gpio_ClrIO(GpioPortA,GpioPin9);
Gpio_ClrIO(GpioPortB,GpioPin0);
Gpio_ClrIO(GpioPortA,GpioPin10);
Gpio_ClrIO(GpioPortB,GpioPin1);
Adt_CHxXPortCfg(M0P_ADTIM5, AdtCHxA, &stcAdtTimer5ACfg); //¶Ë¿ÚCHAÅäÖÃ
Adt_CHxXPortCfg(M0P_ADTIM5, AdtCHxB, &stcAdtTimer5BCfg); //¶Ë¿ÚCHBÅäÖÃ
Adt_CHxXPortCfg(M0P_ADTIM6, AdtCHxA, &stcAdtTimer6ACfg); //¶Ë¿ÚCHAÅäÖÃ
Adt_CHxXPortCfg(M0P_ADTIM6, AdtCHxB, &stcAdtTimer6BCfg); //¶Ë¿ÚCHBÅäÖÃ
}
void PPINV_InvDisable(void)
{
stcAdtTimer5ACfg.bOutEn = FALSE; //CHAÊä³öʹÄÜ FALSE;
stcAdtTimer5BCfg.bOutEn = FALSE;
stcAdtTimer6ACfg.bOutEn = FALSE; //CHAÊä³öʹÄÜ FALSE;
stcAdtTimer6BCfg.bOutEn = FALSE;
Adt_CHxXPortCfg(M0P_ADTIM5, AdtCHxA, &stcAdtTimer5ACfg); //¶Ë¿ÚCHAÅäÖÃ
Adt_CHxXPortCfg(M0P_ADTIM5, AdtCHxB, &stcAdtTimer5BCfg); //¶Ë¿ÚCHBÅäÖÃ
Adt_CHxXPortCfg(M0P_ADTIM6, AdtCHxA, &stcAdtTimer6ACfg); //¶Ë¿ÚCHAÅäÖÃ
Adt_CHxXPortCfg(M0P_ADTIM6, AdtCHxB, &stcAdtTimer6BCfg); //¶Ë¿ÚCHBÅäÖÃ
Gpio_ClrIO(GpioPortA,GpioPin9);
Gpio_ClrIO(GpioPortB,GpioPin0);
Gpio_ClrIO(GpioPortA,GpioPin10);
Gpio_ClrIO(GpioPortB,GpioPin1);
}
更新PWM信号是下面这一段
Adt_SetCompareValue(M0P_ADTIM5, AdtCompareC, INV_PWM_PEROND - g_sInvPwmDuty);
Adt_SetCompareValue(M0P_ADTIM6, AdtCompareC, g_sInvPwmDuty); |