本帖最后由 自己和自己玩 于 2020-5-13 09:19 编辑
大家帮我看一下,我是互补带死区全桥波形,我要实现以下波形
输出先是一个周期的7HZ然后切换到100HZ,我使用的方法手册介绍的中断
,默认输出是7HZ,,然后在中断里面写上更改100HZ频率,,,都试了一遍,发现切换点总是不对,要么是不到一个周期要么是超过一个周期,试了好几天也没找到方法,希望大家帮我看看能不能解决,谢谢了,我用的TIM4实现的。
(还有个问题我发现进入中断后就无法退出来了,程序死掉了)
/*********************************************************
函数名: void App_full_bridge(void)
描 述: 100HZ全桥方波输出配置(11,13脚输出)
输入值: 无
输出值: 无
返回值: 无
**********************************************************/
void App_full_bridge(uint16_t u16Period, uint16_t u16CHA_PWMDuty)
{
en_adt_compare_t enAdtCompare;
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);
stcAdtBaseCntCfg.enCntMode = AdtTriangleModeA; //三角波A
stcAdtBaseCntCfg.enCntClkDiv = AdtClkPClk0Div16; //分频/16
Adt_Init(M0P_ADTIM4, &stcAdtBaseCntCfg); //ADT载波、计数模式、时钟配置
Adt_SetPeriod(M0P_ADTIM4, u16Period); //周期值
enAdtCompare = AdtCompareA; //通用比较基准A
Adt_SetCompareValue(M0P_ADTIM4, enAdtCompare, u16CHA_PWMDuty); //通用比较基准值寄存器A设置
enAdtCompare = AdtCompareB;
Adt_SetCompareValue(M0P_ADTIM4, enAdtCompare, 0); //通用比较基准值寄存器B设置
enAdtCompare = AdtCompareC;
Adt_SetCompareValue(M0P_ADTIM4, enAdtCompare, u16CHA_PWMDuty); //通用比较基准值寄存器C设置
Adt_EnableValueBuf(M0P_ADTIM4, AdtCHxA, TRUE); //缓存传送A使能 GCMCR--->GCMAR,三角波A模式在下溢点传送
stcAdtTIM4ACfg.enCap = AdtCHxCompareOutput; //比较输出模式
stcAdtTIM4ACfg.bOutEn = TRUE; //CHA输出使能
stcAdtTIM4ACfg.enPerc = AdtCHxPeriodKeep; //计数值与周期匹配时CHA电平保持不变
stcAdtTIM4ACfg.enCmpc = AdtCHxCompareInv; //计数值与比较值A匹配时,CHA电平翻转
stcAdtTIM4ACfg.enStaStp = AdtCHxStateSelSS; //CHA起始结束电平由STACA与STPCA控制
stcAdtTIM4ACfg.enStaOut = AdtCHxPortOutHigh; //CHA起始电平为高
stcAdtTIM4ACfg.enStpOut = AdtCHxPortOutHigh; //CHA结束电平为高
Adt_CHxXPortCfg(M0P_ADTIM4, AdtCHxA, &stcAdtTIM4ACfg); //端口CHA配置
stcAdtTIM4BCfg.enCap = AdtCHxCompareOutput;
stcAdtTIM4BCfg.bOutEn = TRUE;
stcAdtTIM4BCfg.enPerc = AdtCHxPeriodKeep;
stcAdtTIM4BCfg.enCmpc = AdtCHxCompareInv;
stcAdtTIM4BCfg.enStaStp = AdtCHxStateSelSS;
stcAdtTIM4BCfg.enStaOut = AdtCHxPortOutLow; //CHB起始电平为低(为了上下桥互补)
stcAdtTIM4BCfg.enStpOut = AdtCHxPortOutHigh; //CHB结束电平为高(注意起始和结束电平是调节死区高低)
Adt_CHxXPortCfg(M0P_ADTIM4, AdtCHxB, &stcAdtTIM4BCfg); //端口CHB配置
Adt_SetDTUA(M0P_ADTIM4, 6); //CNT向上计数时的死区时间,GCMBR = GCMAR - DTUAR
Adt_SetDTDA(M0P_ADTIM4, 6); //CNT向下计数时的死区时间,GCMBR = GCMAR - DTDAR
Adt_CfgDT(M0P_ADTIM4, TRUE, TRUE); //中断使能,并且DTUAR和DTDAR自动相等
TIM4_CHAB_EN(); //timer4 CHA CHB配置为输出
Adt_StartCount(M0P_ADTIM4); //AdvTimer4运行
}
|