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
}