#include "DSP281x_Device.h" void InitSystem(); void SCI_Init(); void InitPieCtrl(); void InitPieVectTable(); void InitCpuTimers(); void freq_key(); void amp_key(); void single_UART(unsigned char cmd); void UART_conv(unsigned long int conv); interrupt void Capture4_isr(void); interrupt void Compare4_isr(void); interrupt void Compare5_isr(void); interrupt void Compare6_isr(void); unsigned int val=0,step_freq=0,amp_per=0,step_amp=0,Rpm=0,Cap_Freq=0, inc_key=0,dec_key=0,pinc_key=0,pdec_key=0,amp_inc=0,amp_dec=0, iamp_key=0,damp_key=0,cap_flag=0,flag=0,j=0; unsigned long int count=0,time=0; unsigned int Index1=0,Index2=21846,Index3=43692,freq=10,amplitude=10; // amplitude in % , freq in Hz signed int Sine_Value1=0,Value1=0,Sine_Loc1=0, Sine_Value2=0,Value2=0,Sine_Loc2=0, Sine_Value3=0,Value3=0,Sine_Loc3=0; char message1[]={"\fSet Frequency in Hz :"}; char message2[]={"\n\rAmplitude in % :"}; char message3[]={"\n\rSensor Frequency in Hz:"}; char message4[]={"\n\rActual Speed in RPM :"}; signed int lookup[256] ={0,807,1614,2420,3224,4027,4827,5624,6417,7207,7992,8773,9548, 10317,11080,11837,12586,13328,14061,14786,15502,16208,16905, 17592,18267,18932,19585,20226,20855,21472,22075,22665,23241, 23803,24351,24883,25401,25903,26390,26860,27315,27752,28173, 28577,28963,29332,29683,30016,30330,30627,30904,31163,31403, 31624,31826,32008,32171,32315,32439,32543,32627,32692,32737, 32761,32766,32751,32717,32662,32587,32493,32379,32246,32092, 31920,31728,31516,31286,31036,30768,30481,30175,29851,29510, 29150,28772,28377,27965,27536,27090,26627,26149,25654,25144, 24619,24079,23524,22955,22372,21775,21165,20542,19907,19260, 18601,17931,17250,16558,15856,15145,14425,13695,12958,12212, 11459,10700,9933,9161,8383,7600,6813,6021,5226,4427,3626,2822, 2017,1211,404,-404,-1211,-2017,-2822,-3626,-4427,-5226,-6021, -6813,-7600,-8383,-9161,-9933,-10700,-11459,-12212,-12958,-13695, -14425,-15145,-15856,-16558,-17250,-17931,-18601,-19260,-19907, -20542,-21165,-21775,-22372,-22955,-23524,-24079,-24619,-25144, -25654,-26149,-26627,-27090,-27536,-27965,-28377,-28772,-29150, -29510,-29851,-30175,-30481,-30768,-31036,-31286,-31516,-31728, -31920,-32092,-32246,-32379,-32493,-32587,-32662,-32717,-32751, -32766,-32761,-32737,-32692,-32627,-32543,-32439,-32315,-32171, -32008,-31826,-31624,-31403,-31163,-30904,-30627,-30330,-30016, -29683,-29332,-28963,-28577,-28173,-27752,-27315,-26860,-26390, -25903,-25401,-24883,-24351,-23803,-23241,-22665,-22075,-21472, -20855,-20226,-19585,-18932,-18267,-17592,-16905,-16208,-15502, -14786,-14061,-13328,-12586,-11837,-11080,-10317,-9548,-8773, -7992,-7207,-6417,-5624,-4827,-4027,-3224,-2420,-1614,-807, 0 }; void main() { InitSystem(); EALLOW; GpioMuxRegs.GPAMUX.all = 0x0; // all GPIO port Pin's as I/O GpioMuxRegs.GPBMUX.all = 0x013F; // muxing the pwm and capture pin GpioMuxRegs.GPADIR.all = 0x0; // GPIO PORT as input GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5 = 1; // muxing the uart pin GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4 = 1; EDIS; SCI_Init(); InitPieCtrl(); InitPieVectTable(); InitCpuTimers(); EALLOW; PieVectTable.CMP4INT = &Compare4_isr; // placing vector location in vector table PieVectTable.CMP5INT = &Compare5_isr; PieVectTable.CMP6INT = &Compare6_isr; PieVectTable.CAPINT4 = &Capture4_isr; EDIS; PieCtrlRegs.PIEIER4.bit.INTx1 = 1; // enable PIE compare4 interrupt PieCtrlRegs.PIEIER4.bit.INTx2 = 1; // enable PIE compare5 interrupt PieCtrlRegs.PIEIER4.bit.INTx3 = 1; // enable PIE compare6 interrupt PieCtrlRegs.PIEIER5.bit.INTx5 = 1; // enable PIE capture4 interrupt IER = 0x0018; EINT; ERTM; EvbRegs.T3CNT = 0x0000; EvbRegs.T3PR = 0x30DA; // 5khz pwm signal EvbRegs.CMPR4 = 0x186A; // 50% duty cycle EvbRegs.CMPR5 = 0x186A; EvbRegs.CMPR6 = 0x186A; EvbRegs.ACTRB.all = 0x0666; // pwm7 -Act High, pwm8 - Act Low... alternatively EvbRegs.DBTCONB.all = 0x05F8; // dead band 4us EvbRegs.COMCONB.all = 0xA600; EvbRegs.EVBIMRA.bit.CMP4INT = 1; // masking the interrupt EvbRegs.EVBIMRA.bit.CMP5INT = 1; EvbRegs.EVBIMRA.bit.CMP6INT = 1; EvbRegs.EVBIMRC.bit.CAP4INT = 1; EvbRegs.CAPCONB.bit.CAP45TSEL = 1; EvbRegs.CAPCONB.bit.CAP4EDGE = 1; EvbRegs.T3CON.all = 0x1042; // GP Timer3 start EvbRegs.CAPCONB.bit.CAP45EN = 1; // Start Capture while(1) { freq_key(); // function to read frequency in Hz amp_key(); // function to read amplitude in % val = 5000/freq; // carrier freq / required freq = no of data step_freq = 65536/val; amp_per = amplitude; step_amp = ((5625/100) * amp_per); time = (7500000000 / count); // ( 1500 * (125000000/25) / count ); Rpm = time; Cap_Freq = (125000000/count); // Capture Frequency if(flag>8000) { flag=0; for(j=0;j<25;j++) single_UART(message1[j]); UART_conv(freq); for(j=0;j<25;j++) single_UART(message2[j]); UART_conv(amp_per); for(j=0;j<25;j++) single_UART(message3[j]); UART_conv(Cap_Freq); for(j=0;j<25;j++) single_UART(message4[j]); UART_conv(Rpm); }flag++; } } void InitSystem() { EALLOW; SysCtrlRegs.WDCR= 0x0068; // Setup the watchdog // 0x0068 to disable the Watchdog , Prescaler = 1 // 0x00AF to NOT disable the Watchdog, Prescaler = 64 SysCtrlRegs.SCSR = 0; // Watchdog generates a RESET SysCtrlRegs.PLLCR.bit.DIV = 10; // Setup the Clock PLL to multiply by 5 SysCtrlRegs.HISPCP.all = 0x1; // Setup Highspeed Clock Prescaler to divide by 2 SysCtrlRegs.LOSPCP.all = 0x2; // Setup Lowspeed CLock Prescaler to divide by 4 // Peripheral clock enables set for the selected peripherals. SysCtrlRegs.PCLKCR.bit.EVAENCLK=0; SysCtrlRegs.PCLKCR.bit.EVBENCLK=1; SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1; SysCtrlRegs.PCLKCR.bit.SCIBENCLK=0; SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=0; SysCtrlRegs.PCLKCR.bit.SPIENCLK=0; SysCtrlRegs.PCLKCR.bit.ECANENCLK=0; SysCtrlRegs.PCLKCR.bit.ADCENCLK=0; EDIS; } void Compare4_isr(void) { Index1 = Index1 + step_freq; if(Index1>65536) Index1=0; Sine_Loc1 = Index1 >> 8; Sine_Value1 = lookup[Sine_Loc1]; Value1 = (Sine_Value1 * (long)step_amp) >> 15; EvbRegs.CMPR4 = Value1 + 0x186A; EvbRegs.EVBIFRA.bit.CMP4INT = 1; // Reset Compare4 Interrupt Flag PieCtrlRegs.PIEACK.all = PIEACK_GROUP4; // Acknowledge this interrupt to receive more interrupts from group 2 } void Compare5_isr(void) { Index2 = Index2 + step_freq; if(Index2>65536) Index2=0; Sine_Loc2 = Index2 >> 8; Sine_Value2 = lookup[Sine_Loc2]; Value2 = (Sine_Value2 * (long)step_amp) >> 15; EvbRegs.CMPR5 = Value2 + 0x186A; EvbRegs.EVBIFRA.bit.CMP5INT = 1; PieCtrlRegs.PIEACK.all = PIEACK_GROUP4; } void Compare6_isr(void) { Index3 = Index3 + step_freq; if(Index3>65536) Index3=0; Sine_Loc3 = Index3 >> 8; Sine_Value3 = lookup[Sine_Loc3]; Value3 = (Sine_Value3 * (long)step_amp) >> 15; EvbRegs.CMPR6 = Value3 + 0x186A; EvbRegs.EVBIFRA.bit.CMP6INT = 1; PieCtrlRegs.PIEACK.all = PIEACK_GROUP4; } void freq_key() { inc_key = GpioDataRegs.GPADAT.bit.GPIOA0; dec_key = GpioDataRegs.GPADAT.bit.GPIOA1; if(inc_key==1 && dec_key==0 && pinc_key==0) { pinc_key=1; if(freq<50) freq+=5; else freq=50; } else if(inc_key==0 && pinc_key==1) { pinc_key=0; } else if(dec_key==1 && inc_key==0 && pdec_key==0) { pdec_key=1; if(freq>10) freq-=5; else freq=10; } else if(dec_key==0 && pdec_key==1) { pdec_key=0; } } void SCI_Init(void) { SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback // No parity,8 char bits, // async mode, idle-line protocol SciaRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK, // Disable RX ERR, SLEEP, TXWAKE SciaRegs.SCIHBAUD = 405 >> 8 ; // 9600 Baud ; LSPCLK = 31.25MHz SciaRegs.SCILBAUD = 405 & 0x00FF; SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset } void amp_key() { amp_inc = GpioDataRegs.GPADAT.bit.GPIOA2; amp_dec = GpioDataRegs.GPADAT.bit.GPIOA3; if(amp_inc==1 && amp_dec==0 && iamp_key==0) { iamp_key=1; if(amplitude<100) amplitude+=5; else amplitude=100; } else if(amp_inc==0 && iamp_key==1) { iamp_key=0; } else if(amp_inc==0 && amp_dec==1 && damp_key==0) { damp_key=1; if(amplitude>10) amplitude-=5; else amplitude=10; } else if(amp_dec==0 && damp_key==1) { damp_key=0; } } void Capture4_isr() { if(cap_flag==0) { cap_flag = 1; CpuTimer0Regs.TIM.all = 0; CpuTimer0Regs.TCR.bit.TSS = 0; } else if(cap_flag==1) { cap_flag = 0; CpuTimer0Regs.TCR.bit.TSS = 1; count = (0xFFFFFFFF - (CpuTimer0Regs.TIM.all)); } EvbRegs.EVBIFRC.bit.CAP4INT = 1; PieCtrlRegs.PIEACK.all = PIEACK_GROUP5; } void UART_conv(unsigned long int conv) { unsigned int cap_freq1,cap_freq2,cap_freq3,cap_freq4,cap_freq5,cap_freq6; cap_freq1 = conv/1000; cap_freq2 = conv%1000; cap_freq3 = cap_freq2/100; cap_freq4 = cap_freq2%100; cap_freq5 = cap_freq4/10; cap_freq6 = cap_freq4%10; single_UART(cap_freq1+0x30); single_UART(cap_freq3+0x30); single_UART(cap_freq5+0x30); single_UART(cap_freq6+0x30); for(j=0;j<1250;j++); } void single_UART(unsigned char cmd) { SciaRegs.SCITXBUF=cmd; while ( SciaRegs.SCICTL2.bit.TXEMPTY == 0); }