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.

TMS320F28335: Unable to generate PWM

Part Number: TMS320F28335
Other Parts Discussed in Thread: CONTROLSUITE

Hi

I've been trying to generate just an ordinary PWM, but no signal is generated from any of the outputs I've tried. Debugging/loading the program is sucessful, and I have no idea what the problem could be. There goes the code:

/*
 * CÓDIGO BÁSICO PWM PORTA 6 (ePWM1B)
 * main.c
 */

#include <DSP2833x_Device.h> //Arquivos das bibliotecas do dispositivo
#include <DSP2833x_Examples.h>

void InitEPwm1Timer(void);
interrupt void epwm1_isr(void);

int main(void) {

    //Inicializar o controle do sistema: PLL, Watchdog, ativação dos clocks periféricos:
    InitSysCtrl();

    InitEPwm1Gpio();
    //Desativar das interrupções da CPU
    DINT;
    //Inicializar os registradores de controle da PIE para os seus valores padrões (interrupções desativadas e flags zeradas)
    InitPieCtrl();
    //Desativar interrupções e limpar as flags da CPU
    IER = 0x0000;
    IFR = 0x0000;
    //Inicializar a tabela de vetores da PIE, com ponteiros para as ISR
    InitPieVectTable();
    //Inicializar contadores
    InitEPwm1Timer();

    EALLOW;
    PieVectTable.EPWM1_INT = &epwm1_isr;
    EDIS;
    //Habilitar INT1 e INT3 (interrupções dos grupos 1 e 3) da CPU conectadas com o ADC e os EPWM1-6, respectivamente
    IER |= M_INT3;
    //Habilitar a INT1 na PIE
    PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
    //Habilitar interrupções globais e interrupção global de depuração em tempo real (global real-time debugging interrupt, DBGM)
    EINT;
    ERTM;

    for(;;)
    {
       __asm("          NOP");
    }

    return 0;
}
void InitEPwm1Timer()
{
       EPwm1Regs.TBPRD = 0xFFFF;                // Valor do registrador de período (16 bits)
       EPwm1Regs.TBPHS.half.TBPHS = 0x0000;     // Fase da onda
       EPwm1Regs.TBCTL.bit.PHSEN = 0x0;         // Habilita (0x1) ou desabilita (0x0) a sincronização (fase) dos módulos
       EPwm1Regs.TBCTR = 0x0000;                // Limpa o contador

       EPwm1Regs.TBCTL.bit.CTRMODE = 0x0;       // Modo de contagem: crescente (0x0), decrescente (0x1), crescente-decrescente (0x2), parar contador (0x3)
       EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0x0;     // Clock do EPWM: TBCLK = SYSCLKOUT / (HSPCLKDIV × CLKDIV)
       EPwm1Regs.TBCTL.bit.CLKDIV = 0x0;        //Consultar tabela para saber os fatores de divisão
       EPwm1Regs.TBCTL.bit.PRDLD= 0x1;

       EPwm1Regs.CMPB = 0;                 // Valor de comparação B
       EPwm1Regs.CMPCTL.bit.SHDWBMODE = 1;      // 0 ativa modo sombra , 1 ativa modo imediato
       EPwm1Regs.CMPCTL.bit.LOADBMODE = 0x3;    // Substitui do registrador sombra para o registrador efetivo quando CTR = 0 (0x0), CTR = PRD (0x1), CTR = 0 OU PRD (0x2), ou não carrega (0x3)
    // 0x0 Substitui do registrador sombra para o registrador efetivo quando o CTR chegar a zero
    // 0x1 substitui quando igual ao período
    // 0x2 Quando chega a zero e a período
    // 0x3 Desabilita carregamento



    /* Ações do AQ:
     CAD = contador do tempo base é igual à CMPA e está decrementando
     CAU = contador do tempo base é igual à CMPA e está incrementando
     CBD = contador do tempo base é igual à CMPB e está decrementando
     CBU = contador do tempo base é igual à CMPB e está incrementando
     PRD = Contador do tempo base é igual ao período
     ZRO = Contador do tempo base é igual a zero
    */
    //Saída ePWM1A: 0x0 = nada, 0x1 = força a saída para 0, 0x2 = força a saída para 1, 0x3 = inverte o valor atual da saída
    EPwm1Regs.AQCTLB.bit.CBD = 0x0;
    EPwm1Regs.AQCTLB.bit.CBU = 0x0;
    EPwm1Regs.AQCTLB.bit.PRD = 0x3;
    EPwm1Regs.AQCTLB.bit.ZRO = 0x0;
}
__interrupt void epwm1_isr(void)
{
   //Coloque a função aqui

   // Limpar a flag de interrupção para esse contador
   EPwm1Regs.ETCLR.bit.INT = 1;

   // Notificar essa interrupção para então receber outras interrupções do grupo 3
   PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}

During debugging I noticed that the counters didn't seem to be initialized, but I really don't know if it has anything to do with it, or the code, so please bear with me.

Thanks in advance.