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.

[参考译文] TMS320F28377D:生成相移 PWM 信号时出现问题

Guru**** 2601915 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/670591/tms320f28377d-problems-with-generating-phase-shifted-pwm-signals

器件型号:TMS320F28377D

大家好、

我已经编写了使用 EPWM1、EPWM2和 EPWM3通道生成三个相移 PWM 信号的代码、如图所示。 但是、在运行代码后、我看不到任何来自通道的信号。

您能帮我找出我在代码方面遇到的问题吗?

此致、

Haque   

main.c


#include "F28x_Project.h"
//#include "adc_new.h"
#include "pwm.h"


int main (空)

InitSysCtrl();

PWM_init();
// adc_init();


while (1){
ASM ("NOP");

返回(1);

PWM.c

#include "pwm.h"
//#include "torator_instance.h"
//#include "adc_new.h"
//#include "pll.h"
//#include "measurement.h"
//unsigned int comp;

浮点 Duty_P1;
浮点 Duty_P2;
浮点 Duty_P3;

void PWM_init()

//启用三个转换器的 PWM 模块+

CpuSysRegs.PCLKCR2.bit.EPWM1 = 1;
CpuSysRegs.PCLKCR2.bit.EPWM2 = 1;
CpuSysRegs.PCLKCR2.bit.EPWM3 = 1;

//为三个转换器配置输出引脚

InitEPwm1Gpio();
InitEPwm2Gpio();
InitEPwm3Gpio();


//配置中断
Dint;

InitPieCtrl();

//禁用 CPU 中断并清除所有 CPU 中断标志:
IER = 0x0000;
IFR = 0x0000;

InitPieVectTable();

EALLOW;
PieVectTable.EPWM1_INT =&PWM_INTERRUPT;
EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的

//设置 PWM 通道...
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC =0;
EDIS;

configure_pwm1();
configure_pwm2();
CONFIG_pwm3 ();


EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;
EDIS;

//启用 PIE 中断
IER |= M_INT3;
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;

//为中断使用配置引脚...
EALLOW;
GpioCtrlRegs.GPADIR.bit.GPIO13 = 1;
EDIS;

//启用中断,openloop 将启动...
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM


void configure_pwm1()

EPwm1Regs.TBPRD = 1250;//设置定时器周期
EPwm1Regs.TBPHS.bit.TBPHS = 0x0000;//相位为0
EPwm1Regs.TBCTR = 0x0000;//清除计数器

//设置 TBCLK
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上计数
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV2;

EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADODE;//每0加载一次寄存器
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

void configure_pwm2()

EPwm2Regs.TBPRD = 1250;//设置定时器周期
EPwm2Regs.TBPHS.bit.TBPHS = 0x009C;//相位为45度(TBPHS 156)
EPwm2Regs.TBCTR = 0x0000;//清除计数器

//设置 TBCLK
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上计数
EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;//启用相位加载
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV2;

EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADODE;//每0加载一次寄存器
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;


void configure_pwm3 ()

EPwm3Regs.TBPRD = 1250;//设置定时器周期
EPwm3Regs.TBPHS.bit.TBPHS = 0x0138;//相位为90度(TBPHS 312)
EPwm3Regs.TBCTR = 0x0000;//清除计数器

//设置 TBCLK
EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上计数
EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE;//启用相位加载
EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV2;

EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_SHADODE;//每0加载一次寄存器
EPwm3Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm3Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;


_interrupt void PWM_interrupt (void)


GpioDataRegs.GPASET.bit.GPIO13 = 1;

//全部测量()
// PLL 节拍
//串联电压调节节拍
//并联 reg tick
//直流总线寄存器节拍

//设置串联转换器的占空比
Duty_P1 =(float) PWM_PERIOD / 2;
EPwm1Regs.CMPA.bit.CMPA =(int) Duty_P1;
EPwm1Regs.CMPB.bit.CMPB =(int) Duty_P1;

//设置操作
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;//将 PWM1A 设置为零
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;

EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;//将 PWM1B 置为零
EPwm1Regs.AQCTLB.bit.CAD = AQ_SET;


Duty_P2 =(float) PWM_PERIOD / 2;
EPwm2Regs.CMPA.bit.CMPA =(int) Duty_P2;
EPwm2Regs.CMPB.bit.CMPB =(int) Duty_P2;

//设置操作
EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;//将 PWM1A 设置为零
EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR;

EPwm2Regs.AQCTLB.bit.CAU = AQ_CLEAR;//将 PWM1A 设置为零
EPwm2Regs.AQCTLB.bit.CAD = AQ_SET;


Duty_P3 =(float) PWM_PERIOD / 2;
EPwm3Regs.CMPA.bit.CMPA =(int) Duty_P3;
EPwm3Regs.CMPB.bit.CMPB =(int) Duty_P3;

//设置操作
EPwm3Regs.AQCTLA.bit.CAU = AQ_SET;//将 PWM1A 设置为零
EPwm3Regs.AQCTLA.bit.CAD = AQ_CLEAR;

EPwm3Regs.AQCTLB.bit.CAU = AQ_CLEAR;//将 PWM1B 置为零
EPwm3Regs.AQCTLB.bit.CAD = AQ_SET;

EPwm1Regs.ETCLR.bit.INT = 1;
PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;

GpioDataRegs.GPACLEAR.bit.GPIO13=1;

pwm.h

#ifndef PWM_H_
#define PWM_H_


#include "F28x_Project.h"
//#include "sine_tor.h"

#define PWM_PERIOD 1250
extern float Duty_P1;
extern float Duty_P2;
extern float Duty_P3;

void PWM_init();

三个转换器的// PWM 1~3
void configure_pwm1();
void configure_pwm2();
void configure_pwm3();

_interrupt void PWM_interrupt (void);


#endif /* PWM_H_*/

如果你们中的任何人能帮助我解决这个问题、我会很高兴。

此致

Haque

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我能看到用于 ePWM GPIO 初始化的代码吗? 我想确保为 ePWM 输出正确配置多路复用器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Nima、

    我为它编写的代码都附在这里。 具体而言、我已初始化上述代码中的 EPwmGpio 引脚配置、如下所示。 请参阅以下代码。 我热切地等待你的答复。

    此致、
    Haque

    //启用三个转换器的 PWM 模块+

    CpuSysRegs.PCLKCR2.bit.EPWM1 = 1;
    CpuSysRegs.PCLKCR2.bit.EPWM2 = 1;
    CpuSysRegs.PCLKCR2.bit.EPWM3 = 1;

    //为三个转换器配置输出引脚

    InitEPwm1Gpio();
    InitEPwm2Gpio();
    InitEPwm3Gpio();


    //配置中断
    Dint;

    InitPieCtrl();

    //禁用 CPU 中断并清除所有 CPU 中断标志:
    IER = 0x0000;
    IFR = 0x0000;

    InitPieVectTable();

    EALLOW;
    PieVectTable.EPWM1_INT =&PWM_INTERRUPT;
    EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的

    //设置 PWM 通道...
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC =0;
    EDIS;

    configure_pwm1();
    configure_pwm2();
    CONFIG_pwm3 ();


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

    您能否共享 InitEPwm1Gpio、 InitEPwm2Gpio 和 InitEPwm3Gpio 的代码? 我想仔细检查配置 GPIO 多路复用器的代码行。

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

    我想确保您正确设置了 GPIO。 您能否共享 InitEPwm1Gpio 的代码?

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

    由于不活动、我将关闭此主题、如果您有任何疑问、请再次发布。 但是、我认为这是可以解决您的问题的方法。

    在 F2837x_ePWM.c 内、设置了 ePWM 模块的 GPIO 多路复用器。 以下是为 ePWM1设置 GPIO 的示例:

    //
    // InitEPwm1Gpio -初始化 EPWM1 GPIO
    //
    void InitEPwm1Gpio (void)
    {
    EALLOW;
    
    //
    //禁用所选输出引脚的内部上拉
    //以降低功耗
    //用户可以启用或禁用上拉。
    //注释掉其他不需要的行。
    //
    GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1;//禁用 GPIO0上的上拉电阻(EPWM1A)
    GpioCtrlRegs.GPAPUD.bit.GPIO1 = 1;//禁用 GPIO1上的上拉电阻(EPWM1B)
    // GpioCtrlRegs.GPEPUD.bit.GPIO145 = 1;//禁用 GPIO145上的上拉电阻(EPWM1A)
    // GpioCtrlRegs.GPEPUD.bit.GPIO146 = 1;//禁用 GPIO146上的上拉电阻(EPWM1B)
    
    //
    //使用 GPIO 寄存器配置 EPW-1引脚
    //这指定哪个可能的 GPIO 引脚将是 EPWM1功能
    //引脚。
    //注释掉其他不需要的行。
    //
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;//将 GPIO0配置为 EPWM1A
    GpioCtrlRegs.GPAMUX1.bit.GPIO1=1;//将 GPIO1配置为 EPWM1B
    // GpioCtrlRegs.GPEMUX2.bit.GPIO145 = 1;//将 GPIO145配置为 EPWM1A
    // GpioCtrlRegs.GPEMUX2.bit.GPIO146 = 1;//将 GPIO0146配置为 EPWM1B
    
    EDIS;
    }
    

    请将应用中的 GPIO 编号更改为特定的编号。