自己和自己玩 发表于 2020-5-13 09:17

求助一下HC32F005互补方波周期中断问题

本帖最后由 自己和自己玩 于 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运行
}

martinhu 发表于 2020-5-13 17:33

如果你只是做一次切换,那么我觉得应该不用开中断,
使能周期和比较值的缓存传送功能,这样在三角波A模式的第一个波谷的时候,周期和比较值都会更新为100Hz的需求的值。



至于中断问题,有很多可能,中断函数进了吗?标志位清了吗?

自己和自己玩 发表于 2020-5-14 10:30

本帖最后由 自己和自己玩 于 2020-5-14 12:09 编辑

martinhu 发表于 2020-5-13 17:33
如果你只是做一次切换,那么我觉得应该不用开中断,
使能周期和比较值的缓存传送功能,这样在三角波A模式的 ...
感谢您哈,我试了一下好像不对啊,出来的波形是上面的,我需要下面这种波形,我感觉切换点不对,示波器图片,,切换点应该是对称的一个周期波形,现在是出现了3个波形,如果把第一个波形+第三个波形的话就对了,第二个波形是正确的。代码如下:
void App_full_bridge()
{
                        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;
      uint16_t u16CHA_PWMDuty;
            uint16_t u16Period;
      
                        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载波、计数模式、时钟配置
                        u16Period = 62500;                                                         //7HZ周期值
                        Adt_SetPeriod(M0P_ADTIM4, u16Period);                           //周期值
            Adt_SetPeriodBuf(M0P_ADTIM4,7500);                                          //100HZ缓存周期值
      
                        enAdtCompare = AdtCompareA;                                             //通用比较基准A
            u16CHA_PWMDuty = 31250;                                                         //7HZ比较值
      
                        Adt_SetCompareValue(M0P_ADTIM4, enAdtCompare, u16CHA_PWMDuty);    //通用比较基准值寄存器A设置
                        enAdtCompare = AdtCompareB;
                        u16CHA_PWMDuty = 0;
                        Adt_SetCompareValue(M0P_ADTIM4, enAdtCompare, u16CHA_PWMDuty);    //通用比较基准值寄存器B设置
                        
                        enAdtCompare = AdtCompareC;
                        u16CHA_PWMDuty = 3750;                                                //100HZ比较值
                        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运行
}

自己和自己玩 发表于 2020-5-14 22:01

已经解决
页: [1]
查看完整版本: 求助一下HC32F005互补方波周期中断问题