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.

[参考译文] MSP432E401Y:3个同步 PWM、使用切换比较匹配来生成相移波形

Guru**** 2555630 points
Other Parts Discussed in Thread: MSP432E401Y

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/955083/msp432e401y-3-synchronized-pwms-using-toggling-on-compare-match-to-generate-phase-shifted-waveforms

器件型号:MSP432E401Y
主题中讨论的其他器件: MSP432P401R

测试硬件是 MSP432E401Y Launchpad

我已经设置了 PWM0的第1代和第3代、以使用相同的周期生成三相延迟波形。  

所需的最终结果:

a)使用死区功能

b)第2代 pwmA 输出应延迟2/3的周期

c)第3代 pwmA  输出应延迟2/3的周期

我的发生器引脚配置为:


/*发生器1输出引脚*/
MAP_GPIOPinConfigure (GPIO_PF2_M0PWM2);// PF2
MAP_GPIOPinConfigure (GPIO_PF3_M0PWM3);// PF3

/*发生器2输出引脚*/
MAP_GPIOPinConfigure (GPIO_PG0_M0PWM4);// PG0
MAP_GPIOPinConfigure (GPIO_PG1_M0PWM5);// PG1

/*发生器3输出引脚*/
MAP_GPIOPinConfigure (GPIO_PK4_M0PWM6);// PK4
MAP_GPIOPinConfigure (GPIO_PK5_M0PWM7);// PK5


//配置 PF2-PF3和 PG0-PG1和 PK4-PK5引脚供 PWM 外设使用
MAP_GPIOPinTypePWM (GPIO_PORTF_BASE、(GPIO_PIN_2 | GPIO_PIN_3));
MAP_GPIOPinTypePWM (GPIO_PORTG_BASE、(GPIO_PIN_0 | GPIO_PIN_1));
MAP_GPIOPinTypePWM (GPIO_PORTK_base、(GPIO_PIN_4 | GPIO_PIN_5));

-全部3个计数器均在递减计数模式下运行。

-代码使用 driverlib 函数实现。 但是、由于我希望输出在 CMPA 和 CMPB 上切换、  

我编写了我的函数"PWMGenConfigure_New(..... )"、实质上取代了"PWMGenConfigure(..)"中的递减计数模式 功能:

HWREG (ui32Gen + PWM_O_X_GENA)= PWM_X_GENA_ACTCMPAD_INV;
HWREG (ui32Gen + PWM_O_X_GENB)= PWM_X_GENB_ACTCMPAD_INV;

函数调用包括:

PWMGenConfigure_New (PWM0_BASE、PWM_GEN_1、PWM_GEN_MODE_DOWN | PWM_GEN_MODE_GEN_SYNC_LOCAL);
PWMGenConfigure_New (PWM0_BASE、PWM_GEN_2、PWM_GEN_MODE_DOWN | PWM_GEN_MODE_GEN_SYNC_LOCAL);
PWMGenConfigure_New (PWM0_BASE、PWM_GEN_3、PWM_GEN_MODE_DOWN | PWM_GEN_MODE_GEN_SYNC_LOCAL);

-由于使用"MAP_PWMPulseWidthSet(.)" 函数将 CMPA/CMPB 设置为"period - entered_pulsewidth"

我使用了以下脉冲宽度:

PWMPulseWidth_1 = 3;
PWMPulseWidth_2 = 2*PWMPeriod/3;
PWMPulseWidth_3 = PWMPeriod / 3;


MAP_PWMPulseWidthSet (PWM0_BASE、PWM_OUT_2、PWMPulseWidth_1);//将比较值设置为接近零
MAP_PWMPulseWidthSet (PWM0_BASE、PWM_OUT_4、PWMPulseWidth2);// 120度相移
MAP_PWMPulseWidthSet (PWM0_BASE、PWM_OUT_6、PWMPulseWidth3);// 60度相移

我的死区设置为:(2us 死区)

MAP_PWMDeadBandEnable (PWM0_BASE、PWM_GEN_1、240);
MAP_PWMDeadBandEnable (PWM0_BASE、PWM_GEN_2、240);
MAP_PWMDeadBandEnable (PWM0_BASE、PWM_GEN_3、240);

要启动生成器,请使用:


MAP_PWMGenEnable (PWM0_BASE、PWM_GEN_1);
MAP_PWMGenEnable (PWM0_BASE、PWM_GEN_2);
MAP_PWMGenEnable (PWM0_BASE、PWM_GEN_3);

for (setDelay = 0;setDelay < 10000;setDelay++);


MAP_PWMSyncTimeBase (PWM0_BASE、(PWM_GEN_1_BIT |PWM_GEN_2_BIT | PWM_GEN_3_BIT);

//启用 PWM2-PWM7输出信号
MAP_PWMOutputState (PWM0_BASE、PWM_OUT_2_BIT | PWM_OUT_3_BIT | PWM_OUT_4_BIT | PWM_OUT_5_BIT | PWM_OUT_6_BIT | PWM_OUT_7_BIT、TRUE);

我已经设置了一个测试、以100Hz 的间隔在7kHz 至15kHz 之间运行、在恢复每个新频率之前禁用 PWM 大约2秒钟。

有时我会得到所需的相移、有时反相版本会满足相位分流器的要求。 我认为 thsi 是使用"togling on CMP match"选项的结果。

是否有办法确保所有3个 PWM 同时以相同的逻辑电平(最好是低电平)和 负载启动、从而保持一致性。

示例示波器图如下所示。

谢谢

David Nyarko

e2e.ti.com/.../Three_5F00_PWMs_5F00_figures.docx

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

    尊敬的 David:

    很抱歉耽误你的回答。  请参阅下面显示2个 PWM 的代码示例。  更改频率时、可能需要在更改 PWM 配置之前设置 GPIO 引脚配置。   

    https://dev.ti.com/tirex/explore/node?node=AB7C4ZcRlOTpZ2hfpdUL6A__z-lQYNj__LATEST 

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

    您好、Eddie、

    您提供的链接适用于 MSP432P401R 处理器、而不适用于 MSP432E401Y。

    我配置 GPIO。 我可能缺少一些东西。 我要附加我在 MSP432E401Y launchpad 上执行的 C 文件"th3_PWM_6_step.c"。

    谢谢

    Davide2e.ti.com/.../three_5F00_pwm_5F00_six_5F00_step.c

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

    此外、要监控的主要线路是 PF2、PG0和 PK4。  

    还注意到有时处于已停止状态 (在执行我的函数"Stop_Trigger_Generation()后启用、复制于下方"、

    PK4处于逻辑高电平而不是低电平。

    void Stop_Trigger_Generation (void)

    volatile uint16_t setDelay;


    //禁用 PWM0-PWM5输出信号引脚(注意:生成过程仍在内部继续)
    MAP_PWMOutputState (PWM0_BASE、PWM_OUT_2_BIT | PWM_OUT_3_BIT | PWM_OUT_4_BIT | PWM_OUT_5_BIT | PWM_OUT_6_BIT | PWM_OUT_7_BIT、false);

    //禁用 PWM 发生器的计数器

    MAP_PWMGenDisable (PWM0_BASE、PWM_GEN_1);
    MAP_PWMGenDisable (PWM0_BASE、PWM_GEN_2);
    MAP_PWMGenDisable (PWM0_BASE、PWM_GEN_3);

    for (setDelay = 0;setDelay < 10000;setDelay++);
    //指示 PF0 (D1)上的 PWM 停止状态
    MAP_GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_0、0);// PF0连接到 LED D1关闭


    谢谢

    David