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.

[参考译文] TMS320F28069:如何为 BLDC 电机实现双极调制?

Guru**** 2200880 points
Other Parts Discussed in Thread: TMS320F28069, DRV8307
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/605431/tms320f28069-how-to-implement-bipolar-modulation-for-bldc-motor

器件型号:TMS320F28069
主题中讨论的其他器件: DRV8307

我有一个带 TMS320F28069的定制板、用于通过霍尔传感器控制 BLDC 电机。 首先、我想实施双极调制、以便在电机堵转时保护自举电路放电(我将占空比限制为95%)。 其次 、我们希望电机具有四象限运行。

我分析了实现单极调制的 TI InstantBLDC 示例。

为了实现双极调制、我需要插入死区时间来保护开关短路。 例如霍尔状态101

PWM1A 和 PWM1B 配置为互补 PWM。

对于 PWM2A 和 PWM2B、我使用动作限定符子模块将0强制为高侧晶体管、将1强制为低侧晶体管。

问题在于 PWM3、因为我需要在 PWM 计数器的下一个零之后关闭两个晶体管。 无法使用动作限定符、因为死区子模块会以这种方式阻止两个 PWM:

           (* ePWM[3]).AQCSFRC.bit.CSFB = 1;           //在 EPWM3的输出 A 上强制为连续低电平    

           (* ePWM[3]).AQCSFRC.bit.CSFA = 1;           /*在 EPWM3的输出 B 上强制为持续低电平   *

高侧晶体管关闭、但低侧始终开启。

我考虑过使用 TripZone 或禁用死区模块,但这样做不能像使用动作限定符那样在 EPWM 模块的零计数器事件中强制关闭两个晶体管。

以下是具有同步整流功能的驱动器 drv8307双极调制示例(第13页)。

www.ti.com/.../drv8307.pdf

您对如何实现 BLDC 的双极调制有什么想法吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以使用 AQCTLA 和 DBCTL 仅在启用死区的情况下设置 EWPM1A 和 EPWM1B 输出、并使用 AQCSFRC 设置 EPWM2和 EPWM3输出。 其他通信状态也由 AQCTLA、DBCTL 和 AQCSFRC 设置。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的重播。 我还有一些问题。

    如何修改 AQCTLA 和 DBCTL? 我几乎测试了 AQ 和 DB 子模块的所有可能寄存器、但没有成功。 我一直观察到,在新换向部门的乞讨问题上,有一个没有死机时间的情况下,最后一个是死机时间的情况

    DB 子模块存在问题、因为它未被影子化、并且该寄存器中的每次更改都是立即发生的。

    根据您的建议、我的代码中有一个部门:

    1)我修改了 AQCTLB (我已将 PCB 上的 PWMA 与 PWMB 交换、并在 DB 子模块的输入上使用 PWMB)

    2) 2)我不确定应该如何处理 DBCTL、因此我测试了禁用死区时间或更改 POLSEL

    3) 3)我习惯强制执行、如下所示:我还测试 了 RLDCSF。

        案例 HALL_State_ABC_100

               (* ePWM[pBLDC -> PWmA]).AQCTLB.bit.ZRO = 0;

               (* ePWM[pBLDC -> PWMb]).AQCTLB.bit.ZRO = AQ_SET;

               (* ePWM[pBLDC->PWMc]).AQCTLB.bit.ZRO = 0;

     

               (* ePWM[pBLDC -> PWmA]).AQSFRC.bit.RLDSF = 0;

               (* ePWM[pBLDC->PWMb]).AQSFRC.bit.RLDSF = 3;

               (* ePWM[pBLDC->PWMc]).AQSFRC.bit.RLDSF = 0;

     

     

               (* ePWM[pBLDC -> PWmA]).DBCTL.bit.out_mode = DB_full_enable;

               (* ePWM[pBLDC->PWMb]).DBCTL.bit.OUT_MODE = DB_DISABLE;

               (* ePWM[pBLDC->PWMc]).DBCTL.bit.out_mode = DB_disable;

     

               (* ePWM[pBLDC -> PWmA]).AQCSFRC.bit.CSFB = 0;           //在 EPWM1的输出 A 上强制禁用           

     

               (*ePWM[pBLDC->PWmA]).CMPB = pBLDC->PWM;                /* EPWM1输出 A 上的 PWM 信号 */

               (* ePWM[pBLDC->PWmA]).AQCSFRC.bit.CSFA = 1;           //在 EPWM1的输出 B 上强制一个连续低电平   *

                                                             /*                                                 *//

               (* ePWM[pBLDC->PWMb]).AQCSFRC.bit.CSFB = 1;           //在 EPWM2的输出 A 上强制一个持续低电平   *

               (* ePWM[pBLDC->PWMb]).AQCSFRC.bit.CSFA = 1;           //在 EPWM2的输出 B 上强制一个持续低电平   *

                                                             /*                                                 *//

               (* ePWM[pBLDC->PWMc]).AQCSFRC.bit.CSFB = 1;           //在 EPWM3的输出 A 上强制为连续低电平   *

               (* ePWM[pBLDC->PWMc]).AQCSFRC.bit.CSFA = 2;           //在 EPWM3的输出 B 上强制设置连续高电平  *

               中断;

    您是否有任何想法、错误是什么?