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.

500khz pwm signal



I changed this line of code, EPwm1Regs.TBPRD = 750, to get a pwm with a frequency of 100 khz. Although, when I set it to 250 which is suppose to be 300khz the oscilloscope got no reading. What would I have to do to change my pwm frequency to 500khz?

My complete code is below:

 

#include

"DSP28x_Project.h" // Device Headerfile and Examples Include File

//#include "DSP2833x_InitPeripherals.c"

#include

"DSP2833x_Adc.h"

#include

"math.h"

// ADC start parameters

#if

(CPU_FRQ_150MHZ) // Default - 150 MHz SYSCLKOUT

#define

ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3) = 25.0 MHz

#endif

#if

(CPU_FRQ_100MHZ)

#define

ADC_MODCLK 0x2 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2) = 25.0 MHz

#endif

//clock sampling parmaters

#define

ADC_CKPS 0x1 // ADC module clock = HSPCLK/2*ADC_CKPS = 25.0MHz/(1*2) = 12.5MHz

#define

ADC_SHCLK 0xf // S/H width in ADC module periods = 16 ADC clocks

#define

AVG 1000 // Average sample limit

#define

ZOFFSET 0x00 // Average Zero offset

void

InitEPwm1Example(void);

void

check_ADC_A(void);

interrupt

void epwm1_isr(void);

interrupt

void epwm3_isr(void);

 

Uint32 EPwm1TimerIntCount;

Uint32 EPwm3TimerIntCount;

#define

RATE_max 397 //75%

#define

RATE_min 397 //25%

 

// Global variable

Uint32 XXX_A;

Uint16 DRATE;

Uint16 RATE_A = 400;

Uint16 RATE_old_A = 0;

 

Uint32 I_in_A;

Uint32 I_in_old_A = 0;

Uint16 I_in_dir_A = 0;

Uint16 i;

Uint16 k;

Uint16 m;

Uint16 x=0;

Uint16 y=0;

Uint16 z=0;

Uint16 j = 0;

Uint32 total_A = 0;

 

Uint16 RATE_Direction_flag_A = 0;

// right side = 0 Left side = 1

Uint16 RATE_Direction_flag_B = 0;

// right side = 0 Left side = 1

Uint16 RATE_check = 0;

void

main(void)

{

InitSysCtrl();

// Specific clock setting for this example:

EALLOW;

SysCtrlRegs.HISPCP.all = ADC_MODCLK;

// HSPCLK = SYSCLKOUT/ADC_MODCLK

EDIS;

InitEPwm1Gpio();

DINT;

InitPieCtrl();

IER = 0x0000;

IFR = 0x0000;

InitPieVectTable();

PieVectTable.EPWM1_INT = &epwm1_isr;

EDIS;

// This is needed to disable write to EALLOW protected registers

//step 4

InitAdc();

AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;

AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;

// AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 1 Cascaded mode

AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;

// AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x7;

AdcRegs.ADCTRL1.bit.CONT_RUN = 1;

// Setup continuous run

EALLOW;

SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;

EDIS;

// InitEPwm1Example();

EALLOW;

SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;

EDIS;

//step 5

EPwm1TimerIntCount = 0;

EPwm3TimerIntCount = 0;

IER |= M_INT3;

PieCtrlRegs.PIEIER3.bit.INTx1 = 1;

PieCtrlRegs.PIEIER3.bit.INTx3 = 1;

EINT;

// Enable Global interrupt INTM

ERTM;

// Enable Global realtime interrupt DBGM

AdcRegs.ADCTRL2.all = 0x2000;

//

//I_in ^

// | ___

// | L / \ R

// | 1 / \ 0

// | / \

// | / \

// -------------->

// 0% RATE 100%

// 100% dutyrate 0%

//

for(;;){

InitEPwm1Example();

DELAY_US(10000L);

check_ADC_A();

 

if(I_in_A == I_in_old_A){

if(I_in_dir_A == 0){

if(RATE_A < RATE_max){

RATE_old_A = RATE_A;

RATE_A = RATE_A + 1;

}

}

if(I_in_dir_A == 1){

if(RATE_A > RATE_min){

RATE_old_A = RATE_A;

RATE_A= RATE_A - 1;

}

}

}

else if((I_in_A > I_in_old_A)&&(RATE_A > RATE_old_A)){ //2

if(RATE_A < RATE_max){

RATE_old_A = RATE_A;

RATE_A = RATE_A + 1;

I_in_old_A = I_in_A;

I_in_dir_A = 0;

// right side

}

}

else if((I_in_A < I_in_old_A)&&(RATE_A < RATE_old_A)){ //1

if(RATE_A < RATE_max){

RATE_old_A = RATE_A;

RATE_A= RATE_A + 1;

I_in_old_A = I_in_A;

I_in_dir_A = 0;

// right side

}

}

else if((I_in_A > I_in_old_A)&&(RATE_A < RATE_old_A)){ //3

if(RATE_A > RATE_min){

RATE_old_A = RATE_A;

RATE_A = RATE_A - 1;

I_in_old_A = I_in_A;

I_in_dir_A = 1;

// left side

}

}

else if((I_in_A < I_in_old_A)&&(RATE_A > RATE_old_A)){ //4

if(RATE_A > RATE_min){

RATE_old_A = RATE_A;

RATE_A = RATE_A - 1;

I_in_old_A = I_in_A;

I_in_dir_A = 1;

// left side

}

}

}

 

}

interrupt

void epwm1_isr(void){

EPwm1TimerIntCount++;

EPwm1Regs.ETCLR.bit.INT = 1;

PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;

}

interrupt

void epwm3_isr(void){

EPwm3TimerIntCount++;

EPwm3Regs.ETCLR.bit.INT = 1;

PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;

// check

}

void

InitEPwm1Example()

{

EPwm1Regs.TBPRD = 250;

// Set timer period

EPwm1Regs.TBPHS.half.TBPHS = 0x0000;

// Phase is 0

EPwm1Regs.TBCTR = 0x0000;

// Clear counter

EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;

// Count up

EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;

// Disable phase loading

EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;

// Clock ratio to SYSCLKOUT

EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

// Setup compare

EPwm1Regs.CMPA.half.CMPA = RATE_A;

// Set actions

EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;

// Set PWM1A on Zero

EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;

 

EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;

// Set PWM1A on Zero

EPwm1Regs.AQCTLB.bit.CAD = AQ_SET;

}

 

 

 

void

check_ADC_A(void)

{

total_A = 0;

// ADC average{

for(j=0; j<100; j++){

while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {} // Wait for interrupt

AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;

XXX_A =((AdcRegs.ADCRESULT0>>4) );

total_A = XXX_A + total_A;

}

I_in_A = total_A/100;

}

 

 

void

InitAdc(void)

{

extern void DSP28x_usDelay(Uint32 Count);

EALLOW;

SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;

ADC_cal();

EDIS;

AdcRegs.ADCTRL3.all = 0x00E1;

// Power up bandgap/reference/ADC circuits

DELAY_US(5000L);

// Delay before converting ADC channels

}