打印
[技术问答]

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

[复制链接]
746|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 自己和自己玩 于 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 | 只看该作者
已经解决

使用特权

评论回复
评论
martinhu 2020-5-18 13:10 回复TA
@自己和自己玩 :周期和比较值相同? 
自己和自己玩 2020-5-15 18:37 回复TA
@martinhu :我改成三角波B 然后把7HZ周期和比较值改成6000 一样就行了 
martinhu 2020-5-15 13:19 回复TA
是什么原因 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

82

帖子

0

粉丝