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.

[参考译文] TMS320F2800137:如何将 EPWM A 和 B 极性更改为 DRV8323连接驱动器

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1322800/tms320f2800137-how-to-change-epwm-a-and-b-polarity-to-drv8323-gatedriver

器件型号:TMS320F2800137
主题中讨论的其他器件:LAUNCHXL-F2800137

大家好!

我一直在针对特定的电机控制应用使用 LAUNCHXL-F2800137和 BOOSTXL-DRV8323S 进行测试。

现在、一名硬件工程师基于上述板制作了定制 PCB、但来回翻转某些内容。

在 LAUNCHXL 板上、ePWM A 输出进入 DRV8323S 的高侧相位输入。 有关阐释、请参阅下表。

名称 LAUNCHXL 引脚
HIN A GPIO 0 (EPWM1 A)
LIN A GPIO 1 (EPWM1 B)
HIN B GPIO 2 (EPWM2 A)
线 B GPIO 3 (EPWM2 B)
HIN C GPIO 10 (EPWM6 A)
LIN C GPIO 11 (EPWM6 B)

现在、在我们的硬件上、A 和 B 通道被切换(错误)。

问题是、如何在电机控制实验的 hal.c 文件中的 PWM 设置中更改两个通道的极性? 我已将代码放在下面。 我认为它与死区发生器有关。 但我不确定。 有人能说明这两个渠道是如何相互关联的吗? 因为在 PWM 写入函数中、相同的比较值被写入通道 A 和 B。

提前感谢!

PWM 设置功能:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void HAL_setupPWMs(HAL_MTR_Handle handle)
{
HAL_MTR_Obj *obj = (HAL_MTR_Obj *)handle;
uint16_t cnt;
uint16_t pwmPeriodCycles = (uint16_t)(MOTORCONFIG_PWM_TBPRD_NUM);
uint16_t numPWMTicksPerISRTick = MOTORCONFIG_NUM_PWM_TICKS_PER_ISR_TICK;
// disable the ePWM module time base clock sync signal
// to synchronize all of the PWMs
SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
// turns off the outputs of the EPWM peripherals which will put the power
// switches into a high impedance state.
EPWM_forceTripZoneEvent(obj->pwmHandle[0], EPWM_TZ_FORCE_EVENT_OST);
EPWM_forceTripZoneEvent(obj->pwmHandle[1], EPWM_TZ_FORCE_EVENT_OST);
EPWM_forceTripZoneEvent(obj->pwmHandle[2], EPWM_TZ_FORCE_EVENT_OST);
for(cnt=0; cnt<3; cnt++)
{
// setup the Time-Base Control Register (TBCTL)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

写入 PWM 函数:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//! \brief Writes PWM data to the PWM comparators for motor control
//! \param[in] handle The hardware abstraction layer (HAL) handle
//! \param[in] pPWMData The pointer to the PWM data
static inline void
HAL_writePWMData(HAL_MTR_Handle handle, HAL_PWMData_t *pPWMData)
{
HAL_MTR_Obj *obj = (HAL_MTR_Obj *)handle;
float32_t period = (float32_t)(EPWM_getTimeBasePeriod(obj->pwmHandle[0]));
uint16_t pwmCnt;
for(pwmCnt=0; pwmCnt<3; pwmCnt++)
{
// compute the value
float32_t V_pu = -pPWMData->Vabc_pu.value[pwmCnt]; // Negative
float32_t V_sat_pu = __fsat(V_pu, 0.5, -0.5); // -0.5~0.5
float32_t V_sat_dc_pu = V_sat_pu + 0.5; // 0~1.0
pPWMData->cmpValue[pwmCnt] = (int16_t)(V_sat_dc_pu * period); //
if(pPWMData->cmpValue[pwmCnt] < pPWMData->minCMPValue)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    您好!

    PWM 死区子模块确实有针对此问题的内置选项!  DBCTL[OUTSWAP]寄存器以显式方式执行该函数。

    要启用该寄存器、插入以下代码:

    EPWM_setDeadBandOutputSwapMode(obj->pwmHandle[cnt], EPWM_DB_OUTPUT_A, true);

    EPWM_setDeadBandOutputSwapMode(obj->pwmHandle[cnt], EPWM_DB_OUTPUT_B, true);

    在 ePWM 配置期间、将此内容添加到您提供的第一个代码摘录的第99行附近。 这将切换全部3个 ePWM 的高/低侧。 希望这对您有所帮助!

    此致、
    杰森·奥斯博尔恩

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

    非常感谢! 我将必须在硬件上尝试、以验证它。 但是在阅读完函数标题后、我确实认为这正是我所需要的。

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

    更新;我在硬件上对它进行了测试、它做了应有的工作! 再次感谢。

    以前;

    添加行后;