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.