This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28069M:软件强制关闭时出现问题

Guru**** 2553450 points
Other Parts Discussed in Thread: DRV8312, C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/832436/tms320f28069m-problem-while-software-force-off

器件型号:TMS320F28069M
主题中讨论的其他器件:DRV8312C2000WARE

您好!

我将驱动器 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;
\} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    根据晶体管的上升和下降时间、您需要调整死区。 由于您仍有一些重叠、因此请增加此数字、直到您获得所需的效果。 "#define DEAD_BAND  10"

    此致、
    Cody  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这是处于开路状态的 DSP GPIO 的输出。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、这个概念仍然适用。 您将需要增加死区、以便在信号在 VDDIO 和 VSS 之间转换时避免重叠、反之亦然。

    此致、
    Cody  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我是否进行了正确的配置、或者是否有更好的方法来实现它? 如果您仔细观察波形、则会发现重叠发生在最后一个脉冲中、只有脉冲的其余部分具有足够的死区、 在 AB 和 AC 阶跃期间工作正常、其中相位中存在 PWM、而我们移至 BC 阶跃时、在相位上关闭 PWM、这会发生此问题。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您的配置看起来不错。 有一点奇怪的是、一个周期的重叠多于之前的周期、但这不应是基于配置的问题、除非您在运行时修改配置。

    您是否更改了信号的宽度或其他内容? 为什么最后一个黄色脉冲比第一个黄色脉冲宽得多?

    此致、
    Cody

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、我要更改信号的宽度、但到现在为止、它是恒定的。 我还检查了增加死区的问题、但问题仍然存在。

    如果您仔细观察到黄色脉冲不会更宽、因为脉冲顶部有两个信号、它看起来会更宽、我希望您在系统中实现此代码、检查结果。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    岐山

    在我看来、第二个黄色脉冲的基极略小于其他脉冲。  

    当您增加死区时会发生什么情况?

    此时我不打算运行任何实验或在代码中实现这一点。"

    此致、
    Cody  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在增加死区时也会发生同样的情况。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您能否提供增加的死区的示波器捕获?

    谢谢、
    Cody  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    岐山

    我看不到您的代码有任何令人惊讶的错误。 我不清楚为什么要删除具有 CSFx 和死区输出修改的 CSFx。 我认为这种方法可以起作用、但我看不到优势。

    我不清楚您的死区延迟遵循模式的原因、但我怀疑它与您切换 DB 输出模式的方式有关。 遗憾的是、我没有调试整个代码的资源、但是如果您发现更具体的问题、如"当我设置 x 我看到 y 时、为什么会发生这种情况?" 然后、我将能够帮助解释这一点或找到解决方法。

    如果您想查看一个可正常工作的死区示例、您可以在 C2000Ware 中找到该示例:C:\ti\c2000Ware_2_00_00_02\device_support\f2806x\examples\c28\ePWM_死 区

    此致、
    Cody  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我的问题通过以下更改得以解决:

     EPwm1Regs.CMPCTL.bit.SHDWAMODE = 1;
     EPwm1Regs.CMPCTL.bit.SHDWBMODE = 1;
     EPwm2Regs.CMPCTL.bit.SHDWAMODE = 1;
     EPwm2Regs.CMPCTL.bit.SHDWBMODE = 1;
     EPwm3Regs.CMPCTL.bit.SHDWAMODE = 1;
     EPwm3Regs.CMPCTL.bit.SHDWBMODE = 1;
     EPwm1Regs.AQSFRC.bit.RLDSF = 3;
     EPwm2Regs.AQSFRC.bit.RLDSF = 3;
     EPwm3Regs.AQSFRC.bit.RLDSF = 3;
    正如我在其中一篇文章中所读出的、这可能是因为操作限定符不会立即发生、死区配置是立即发生的。