Part Number: TMS320F28069M
Other Parts Discussed in Thread: CONTROLSUITE, C2000WARE
Tool/software: Code Composer Studio
I am trying to run an ac induction motor in V/F mode. I wanted to use the trip zone functionality along with current sensing. For that I am using Hall effect sensors to measure the current. Important thing to mention is that I am running the code in Flash mode and the code is C++. Here is the code:
#include "DSP28X_Project.h"
#include "math.h"
#include "inits.h"
#include "vhz_profile.h"
#include "svgen.h"
#include "vf_pid.h"
#include "stdlib.h"
/////////////////////////////////////////////////
#include "ResponsiveFilter.h"
#define new_vhz_params {0,0.1,1,0.05,0.2,0,0}
ResponsiveFilter speed(false,700000000,25,0.01);
/////////////////////////////////////////////////
////////////////////////////////variable initialisations//////////////////////
#define base_freq 100
#define ISR_FREQ 10
VHZPROF vhz = VHZ_PARAMS;
//VHZPROF vhz=new_vhz_params;
SVPWM spwm = SVPWM_DEFAULTS;
VF_PID pid = PID_INIT;
float T=0.001/ISR_FREQ;
float a=0;
float f=0;
////////////////////speed calc///////
#define filt_alpha 0.3f
#define filt_beta 0.7f
int32 time_val=0;
int32 time_prd_delta=0;
float Time_val=0.0;
float Freq_val=0.0;
float Freq_hz=0.0;
float rpm;
long filt_count=0;
long count_exp=0;
float freq_ref=0;
long filtval=0;//tp
long delT1=0;
//////////////////////////////////////////////////////////////////////////
__interrupt void main_isr(void);
__interrupt void ecap_isr(void);
void main(void){
#ifdef _FLASH
memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
#endif
InitSysCtrl(); //system initializations
InitEPwm1Gpio(); //EPWM1 Gpio Inits
InitEPwm2Gpio(); //EPWM2 Gpio Inits
InitEPwm3Gpio(); //EPWM3 Gpio Inits
InitECap1Gpio(); //ECAP1 Gpio Inits
EALLOW;
GpioCtrlRegs.GPACTRL.bit.QUALPRD2=0xFF; //qualification period settings for GPIO16-23, 510 cpu clock cycles
GpioCtrlRegs.GPAQSEL2.bit.GPIO19=2; //qual window set to 6 samples of qualprd2
EDIS;
////////////////////interrupt inits///////////////////
InitPieCtrl();
IER=0x0000;
IFR=0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.EPWM1_INT = &main_isr;
PieVectTable.ECAP1_INT = &ecap_isr;
EDIS;
//////////////////////////////////////////////////////
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0; //disable pwm clock
EDIS;
////////////////peripheral initializations////////////
initepwm1();
initepwm2();
initepwm3();
InitAdc(); //ADC INIT
AdcOffsetSelfCal(); //ADC Callibration THIS IS WHERE THE PROBLEM IS ARISING. THE CODE DOESN'T MOVE FORWARD FROM THIS POINT
init_adc();
InitECapture();
//////////////////////////////////////////////////////
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1; //enable pwm clock
EDIS;
/////////////////enabling interrupts//////////////////
IER |= M_INT3;
IER |= M_INT4;
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
PieCtrlRegs.PIEIER4.bit.INTx1 = 1;
EINT;
ERTM;
//////////////////////////////////////////////////////
spwm.freq_max=6*base_freq*T;
calc_slope_macro(vhz);
for(;;)
{}
}
epwminterrupt(){
}
ecapinterrupt(){
}
and during the debugging I found where exactly the code was getting stuck. It was in this line of code in AdcConversion() function:
