打印
[技术问答]

求助PWM死区高低问题

[复制链接]
1088|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
PWM, AD, ADT, tc
我需要死区是右边这种,死区时刻是都为高电平,之前用其他ST 新唐 东软都可以调出来,这个用华大的005就调不出来,希望大家帮我看下,谢谢了,我的程序下面
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 = AdtCHxPortOutLow;                       //CHA起始电平为低
    stcAdtTIM4ACfg.enStpOut = AdtCHxPortOutLow;                       //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 = AdtCHxPortOutHigh;                      //CHB起始电平为高(为了上下桥互补)
    stcAdtTIM4BCfg.enStpOut = AdtCHxPortOutLow;                       //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自动相等
    Adt_StartCount(M0P_ADTIM4);                                       //AdvTimer4运行
}

使用特权

评论回复
沙发
cltongkn| | 2020-5-8 08:22 | 只看该作者
CHA/CHB起始电平与结束电平与现在的程序反向下就可以实现你的波形了

使用特权

评论回复
板凳
自己和自己玩|  楼主 | 2020-5-8 08:42 | 只看该作者
cltongkn 发表于 2020-5-8 08:22
CHA/CHB起始电平与结束电平与现在的程序反向下就可以实现你的波形了

非常感谢哈,还有个问题麻烦您帮我看下,目前已经可以输出1KHZ PWM方波,程序如下  App_AdvTimerInit(12000); 12000是占空比设置,因为我的程序要修改12000这个值,所以我就设置了一个全局变量PWM_OUT = App_AdvTimerInit(12000); 然后报错显示不能将“void”类型的值分配给“uint16”类型的实体,

使用特权

评论回复
地板
cltongkn| | 2020-5-9 21:41 | 只看该作者
自己和自己玩 发表于 2020-5-8 08:42
非常感谢哈,还有个问题麻烦您帮我看下,目前已经可以输出1KHZ PWM方波,程序如下  App_AdvTimerInit(120 ...

调用  APP_AdvTimerInit(PWM_OUT)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

82

帖子

0

粉丝