主题中讨论的其他器件:DRV8312、 C2000WARE
您好!
我将驱动器 IC UCC27201AQDDARQ1与晶体管一起用于驱动 BLDC 电机、我已更改针对 DRV8312的代码 BLDC_Censored 对于死区、我的问题是 ePWMA 和 ePWMB 之间在末尾有轻微重叠、 如果代码有误、请告诉我。 我要在这里附加代码和波形。
#define DEAD_BAND 10 #define OUT_MODE_ENABLE 3 #define IN_MODE_EPWMA 0 EPwm1Regs.DBCTL.bit.OUT_MODE = OUT_MODE_ENABLE; EPwm2Regs.DBCTL.bit.OUT_MODE = OUT_MODE_ENABLE;EPwm3Regs.DBCTL.bit.DPWM2POL.MODE=EPwCTL.POL.POL.DPWM2POL.MODE=OUT_MODE.POL.POL.POL.MODE=EPwCL_ENABLE; EPw_MODE.POL.POL.POL.POL.POL.DP EPwm3Regs.DBCTL.bit.POLSEL = 2; EPwm1Regs.DBCTL.bit.IN_MODE = IN_MODE_EPWMA; EPwm2Regs.DBCTL.bit.IN_MODE = IN_MODE_EPWMA; EPwm3Regs.DBCTL.BIT.IN_MODE = IN_DAD_MODE ;EPwmW1RAD_DE= IN_DE_DAD_DAD_DE.EPwMAD_DE_DAND_RESH EPwm1Regs.DBFED =死区; EPwm2Regs.DBRED =死区; EPwm2Regs.DBFED =死区; EPwm3Regs.DBRED =死区; EPwm3Regs.DBFED =死区; #define BLDCPWM_MACRO (v) /* 将 "Period"(Q15)调制函数转换为 Q0 */\ tmp =(Int32) v.PeriodMax*(Int32) v.MfuncPeriod;// Q15 = Q0xQ15 */\ 期间=(Int16)(tmp>>>15); /* Q15 -> Q0 (周期) */\ /* */* 检查 PwmActive 设置 */\ if (v.pwmActive=1) /* PWM 高电平有效 */\ { /* */\ GPR0_BLDC_PWM = 0x7FFF - v.DutyFunc; /* */\ CMPB_SMPL_POINT = 0x7FFF -(v.DutyFunc >> 1);//使用 CMPB 在 PWM 脉冲中心进行采样 */\ } /* */\ /* */\ 否则、如果(v.pwmActive=0) /* PWM 低电平有效 */\ { /* */\ GPR0_BLDC_PWM = v.DutyFunc; /* */\ CMPB_SMPL_POINT = v.DutyFunc >> 1; 使用 CMPB 进行/* PWM 脉冲中心采样 */\ } /* */\ /* /\ /*将"DutyFunc"或"GPR0_BLDC_PWM"(Q15)占空比调制函数转换为 Q0 */\ tmp =(int32)周期*(int32) GPR0_BLDC_PWM; /* Q15 = Q0xQ15 */\ Tmp2 =(int32) period*(int32) CMPB_SMPL_point;// Q15 = Q0xQ15 */\ /*EPwm1Regs.CMPB =(Int16)(Tmp2>>15);*/ 使用 CMPB 进行/* PWM 脉冲中心采样 */\ /* */* 状态 s1:电流从 A 相->B 相流入电机绕组、断电相= C */\ if (v.CmtnPointer=0) /* */\ { /* */\ EPwm1Regs.AQCSFRC.bit.CSFB = 0; /*禁用 EPWM1输出 B 上的强制功能 */\ EPwm1Regs.AQCSFRC.bit.CSFA = 0; /*禁用 EPWM1输出 A 上的强制功能 */\ EPwm1Regs.AQCTLA.bit.CAU = 2; //在递增计数时 CTR = CMPA 时设置为高电平 */\ EPwm1Regs.AQCTLA.bit.ZRO = 1; CTR = 0时、/*设置为低电平 */\ EPwm1Regs.AQCTLB.bit.CAU = 1; CTR = 0时、/*设置为低电平 */\ EPwm1Regs.AQCTLB.bit.ZRO = 2; //在递增计数时 CTR = CMPA 时设置为高电平 */\ EPwm1Regs.CMPA.half.CMPA =(Int16)(tmp>>15);/* EPWM1输出 B 上的 PWM 信号(Q15 -> Q0) */\ /*EPwm1Regs.AQCSFRC.bit.CSFA = 2;*/ /*在 EPWM1的输出 A 上强制设置连续高电平*/\ /* */\ EPwm2Regs.AQCSFRC.bit.CSFA = 1; /*在 EPWM2的输出 A 上强制持续为低电平*/\ /*EPwm2Regs.AQCSFRC.bit.CSFB = 2; 将 EPWM2的输出 B 强制为持续高电平* /* */\ EPwm3Regs.AQCSFRC.bit.CSFA = 1; /*在 EPWM3的输出 A 上强制输出持续低电平*/\ EPwm3Regs.AQCSFRC.bit.CSFB = 1; /*在 EPWM3的输出 B 上强制输出持续低电平*/\ EPwm1Regs.DBCTL.bit.OUT_MODE = 3; \ EPwm2Regs.DBCTL.bit.OUT_MODE = 3; \ EPwm3Regs.DBCTL.bit.OUT_MODE = 0; \} /* */\ /* */* 状态 s2:电流从 A 相位->C 流向电机绕组,断电相位= B */\ 否则、如果(v.CmtnPointer = 1) /* */\ { /* */\ EPwm1Regs.AQCSFRC.bit.CSFB = 0; /*禁用 EPWM1输出 B 上的强制功能 */\ EPwm1Regs.AQCSFRC.bit.CSFA = 0; /*禁用 EPWM1输出 A 上的强制功能 */\ EPwm1Regs.AQCTLA.bit.CAU = 2; //在递增计数时 CTR = CMPA 时设置为高电平 */\ EPwm1Regs.AQCTLA.bit.ZRO = 1; CTR = 0时、/*设置为低电平 */\ EPwm1Regs.AQCTLB.bit.CAU = 1; CTR = 0时、/*设置为低电平 */\ EPwm1Regs.AQCTLB.bit.ZRO = 2; //在递增计数时 CTR = CMPA 时设置为高电平 */\ EPwm1Regs.CMPA.half.CMPA =(Int16)(tmp>>15);/* EPWM1输出 B 上的 PWM 信号(Q15 -> Q0) */\ /*EPwm1Regs.AQCSFRC.bit.CSFA = 2;*/ /*在 EPWM1的输出 A 上强制设置连续高电平*/\ /* */\ EPwm2Regs.AQCSFRC.bit.CSFA = 1; /*在 EPWM2的输出 A 上强制持续为低电平*/\ EPwm2Regs.AQCSFRC.bit.CSFB = 1; /*将 EPWM2的输出 B 强制为持续低电平*/\ /* */\ EPwm3Regs.AQCSFRC.bit.CSFA = 1; /*在 EPWM3的输出 A 上强制输出持续低电平*/\ /*EPwm3Regs.AQCSFRC.bit.CSFB = 2; 在 EPWM3的输出 B 上强制设置持续高电平* EPwm1Regs.DBCTL.bit.OUT_MODE = 3; \ EPwm2Regs.DBCTL.bit.OUT_MODE = 0; \ EPwm3Regs.DBCTL.bit.OUT_MODE = 3; \} /* */\ /* /\ /*状态 S3:电流从 B 相位->C 流向电机绕组、断电相位= A */\ 否则、如果(v.CmtnPointer=2) /* */\ { /* */\ EPwm1Regs.AQCSFRC.bit.CSFA = 1; /*在 EPWM1的输出 A 上强制输出持续低电平*/\ EPwm1Regs.AQCSFRC.bit.CSFB = 1; /*在 EPWM1的输出 B 上强制持续为低电平*/\ /* */\ EPwm2Regs.AQCSFRC.bit.CSFB = 0; /*禁用 EPWM2输出 B 上的强制功能 */\ EPwm2Regs.AQCSFRC.bit.CSFA = 0; /*禁用 EPWM2输出 A 上的强制功能 */\ EPwm2Regs.AQCTLA.bit.CAU = 2; //在递增计数时 CTR = CMPA 时设置为高电平 */\ EPwm2Regs.AQCTLA.bit.ZRO = 1; CTR = 0时、/*设置为低电平 */\ EPwm2Regs.AQCTLB.bit.CAU = 1; CTR = 0时、/*设置为低电平 */\ EPwm2Regs.AQCTLB.bit.ZRO = 2; //在递增计数时 CTR = CMPA 时设置为高电平 */\ EPwm2Regs.CMPA.half.CMPA =(Int16)(tmp>>15);/* EPWM2输出 B 上的 PWM 信号(Q15 -> Q0) */\ /*EPwm2Regs.AQCSFRC.bit.CSFA = 2;*/ /*在 EPWM2的输出 A 上强制设置连续高电平*/\ /* */\ EPwm3Regs.AQCSFRC.bit.CSFA = 1; /*在 EPWM3的输出 A 上强制输出持续低电平*/\ /*EPwm3Regs.AQCSFRC.bit.CSFB = 2; 在 EPWM3的输出 B 上强制设置持续高电平* EPwm1Regs.DBCTL.bit.OUT_MODE = 0; \ EPwm2Regs.DBCTL.bit.OUT_MODE = 3; \ EPwm3Regs.DBCTL.bit.OUT_MODE = 3; \} /* */\ /* */* 状态 s4:电流从 B 相位->A 流向电机绕组、断电相位= C */\ 否则、如果(v.CmtnPointer=3) /* */\ { /* */\ EPwm1Regs.AQCSFRC.bit.CSFA = 1; /*在 EPWM1的输出 A 上强制输出持续低电平*/\ /*EPwm1Regs.AQCSFRC.bit.CSFB = 2; 在 EPWM1的输出 B 上强制设置持续高电平*/\ /* */\ EPwm2Regs.AQCSFRC.bit.CSFB = 0; /*禁用 EPWM2输出 B 上的强制功能 */\ EPwm2Regs.AQCSFRC.bit.CSFA = 0; /*禁用 EPWM2输出 A 上的强制功能 */\ EPwm2Regs.AQCTLA.bit.CAU = 2; //在递增计数时 CTR = CMPA 时设置为高电平 */\ EPwm2Regs.AQCTLA.bit.ZRO = 1; CTR = 0时、/*设置为低电平 */\ EPwm2Regs.AQCTLB.bit.CAU = 1; CTR = 0时、/*设置为低电平 */\ EPwm2Regs.AQCTLB.bit.ZRO = 2; //在递增计数时 CTR = CMPA 时设置为高电平 */\ EPwm2Regs.CMPA.half.CMPA =(Int16)(tmp>>15);/* EPWM2输出 B 上的 PWM 信号(Q15 -> Q0) */\ /*EPwm2Regs.AQCSFRC.bit.CSFA = 2;*/ /*在 EPWM2的输出 A 上强制设置连续高电平*/\ /* */\ EPwm3Regs.AQCSFRC.bit.CSFA = 1; /*在 EPWM3的输出 A 上强制输出持续低电平*/\ EPwm3Regs.AQCSFRC.bit.CSFB = 1; /*在 EPWM3的输出 B 上强制输出持续低电平*/\ EPwm1Regs.DBCTL.bit.OUT_MODE = 3; \ EPwm2Regs.DBCTL.bit.OUT_MODE = 3; \ EPwm3Regs.DBCTL.bit.OUT_MODE = 0; \} /* */\ /* */* 状态 s5:电流从 C->A 相流向电机绕组,断电相位= B */\ 否则、如果(v.CmtnPointer=4) /* */\ { /* */\ EPwm1Regs.AQCSFRC.bit.CSFA = 1; /*在 EPWM1的输出 A 上强制输出持续低电平*/\ /*EPwm1Regs.AQCSFRC.bit.CSFB = 2; 在 EPWM1的输出 B 上强制设置持续高电平*/\ /* */\ EPwm2Regs.AQCSFRC.bit.CSFA = 1; /*在 EPWM2的输出 A 上强制持续为低电平*/\ EPwm2Regs.AQCSFRC.bit.CSFB = 1; /*将 EPWM2的输出 B 强制为持续低电平*/\ /* */\ EPwm3Regs.AQCSFRC.bit.CSFB = 0; /*禁用 EPWM3的输出 B 上的强制功能 */\ EPwm3Regs.AQCSFRC.bit.CSFA = 0; /*禁用 EPWM3的输出 A 上的强制功能 */\ EPwm3Regs.AQCTLA.bit.CAU = 2; //在递增计数时 CTR = CMPA 时设置为高电平 */\ EPwm3Regs.AQCTLA.bit.ZRO = 1; CTR = 0时、/*设置为低电平 */\ EPwm3Regs.AQCTLB.bit.CAU = 1; CTR = 0时、/*设置为低电平 */\ EPwm3Regs.AQCTLB.bit.ZRO = 2; //在递增计数时 CTR = CMPA 时设置为高电平 */\ EPwm3Regs.CMPA.half.CMPA =(Int16)(tmp>>15);/* EPWM3的输出 B 上的 PWM 信号(Q15 -> Q0) */\ /*EPwm3Regs.AQCSFRC.bit.CSFA = 2;*/ /*在 EPWM3的输出 A 上强制设置连续高电平*/\ EPwm1Regs.DBCTL.bit.OUT_MODE = 3; \ EPwm2Regs.DBCTL.bit.OUT_MODE = 0; \ EPwm3Regs.DBCTL.bit.OUT_MODE = 3; \} /* */\ /* */* 状态 s6:电流从 C->B 相流向电机绕组,断电相= A */\ 否则、如果(v.CmtnPointer=5) /* */\ { /* */\ EPwm1Regs.AQCSFRC.bit.CSFA = 1; /*在 EPWM1的输出 A 上强制输出持续低电平*/\ EPwm1Regs.AQCSFRC.bit.CSFB = 1; /*在 EPWM1的输出 B 上强制持续为低电平*/\ /* */\ EPwm2Regs.AQCSFRC.bit.CSFA = 1; /*在 EPWM2的输出 A 上强制持续为低电平*/\ /*EPwm2Regs.AQCSFRC.bit.CSFB = 2; 将 EPWM2的输出 B 强制为持续高电平* /* */\ EPwm3Regs.AQCSFRC.bit.CSFB = 0; /*禁用 EPWM3的输出 B 上的强制功能 */\ EPwm3Regs.AQCSFRC.bit.CSFA = 0; /*禁用 EPWM3的输出 A 上的强制功能 */\ EPwm3Regs.AQCTLA.bit.CAU = 2; //在递增计数时 CTR = CMPA 时设置为高电平 */\ EPwm3Regs.AQCTLA.bit.ZRO = 1; CTR = 0时、/*设置为低电平 */\ EPwm3Regs.AQCTLB.bit.CAU = 1; CTR = 0时、/*设置为低电平 */\ EPwm3Regs.AQCTLB.bit.ZRO = 2; //在递增计数时 CTR = CMPA 时设置为高电平 */\ EPwm3Regs.CMPA.half.CMPA =(Int16)(tmp>>15);/* EPWM3的输出 B 上的 PWM 信号(Q15 -> Q0) */\ /*EPwm3Regs.AQCSFRC.bit.CSFA = 2;*/ /*在 EPWM3的输出 A 上强制设置连续高电平*/\ EPwm1Regs.DBCTL.bit.OUT_MODE = 0; \ EPwm2Regs.DBCTL.bit.OUT_MODE = 3; \ EPwm3Regs.DBCTL.bit.OUT_MODE = 3; \}
