//########################################################################### // // FILE: cpu_Timers_cpu01.c // // TITLE: Cpu Timers Example for F2837xD. // //! \addtogroup cpu01_example_list //!

CPU Timers

//! //! This example configures CPU Timer0, 1, and 2 and increments //! a counter each time the timer asserts an interrupt. //! //! \b Watch \b Variables \n //! - CpuTimer0.InterruptCount //! - CpuTimer1.InterruptCount //! - CpuTimer2.InterruptCount //! //########################################################################### // // Included Files // #include "F28x_Project.h" #include "math.h" #define TB_PRD 3125 #define pi 3.14159 #define Ts 0.00005 #define sample_size 500 #define Gain 2.4420e-04 float w = 2*50*3.14159, x=0, x2=0, x3=0, A=0, B=0, C=0; float m_a = 1, m_f = 0.8, vf = 1; float sam =0; int data_type = 1, i = 1; double data_log_1[sample_size]; float B1 = 0, B2 = 0, B3 = 0, B4 = 0, B5 = 0, B6 = 0, B7 = 0, B8 = 0, B9 = 0, B10 = 0, B11 = 0, B12 = 0; float G1 = 1, G2 = 1, G3 = 1, G4 = 1, G5 = 1, G6 = 1, G7 = 1, G8 = 1, G9 = 1, G10 = 1, G11 = 1, G12 = 1; Uint16 V_sen[16]; //Total sensing int ADC = 0; Uint16 sensorSample; int16 sensorTemp; // // Function Prototypes // void Gpio_select(void); void InitEPwm1Example(void); void ConfigureEPWM(void); void ConfigureADC(void); void SetupADCEpwm(Uint16 channel); // void SetupPPBOffset(int16 aOffset, int16 bOffset); interrupt void adca1_isr(void); interrupt void adcb1_isr(void); __interrupt void cpu_timer0_isr(void); void main(void) { // // Step 1. Initialize System Control: InitSysCtrl(); // Step 2. Initialize GPIO: Gpio_select(); // // Step 2.1. Initialize the Device Peripherals: // EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC =0; EDIS; InitEPwm1Example(); EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC =1; EDIS; // // Step 3. Clear all interrupts and initialize PIE vector table: // Disable CPU interrupts DINT; // Initialize the PIE control registers to their default state. InitPieCtrl(); // Disable CPU interrupts and clear all CPU interrupt flags: IER = 0x0000; IFR = 0x0000; // Initialize the PIE vector table with pointers to the shell Interrupt // Service Routines (ISR). InitPieVectTable(); // Interrupts that are used in this example are re-mapped to // ISR functions found within this file. EALLOW; // This is needed to write to EALLOW protected registers PieVectTable.TIMER0_INT = &cpu_timer0_isr; PieVectTable.ADCA1_INT = &adca1_isr; //function for ADCA interrupt 1 PieVectTable.ADCB1_INT = &adcb1_isr; //function for ADCB interrupt 1 EDIS; // This is needed to disable write to EALLOW protected registers // Enable TINT0 in the PIE: Group 1 interrupt 7, adc_a1 and adc_b1 PieCtrlRegs.PIEIER1.bit.INTx1 = 1; PieCtrlRegs.PIEIER1.bit.INTx2 = 1; PieCtrlRegs.PIEIER1.bit.INTx7 = 1; // // Configure the ADC and power it up // ConfigureADC(); // // Configure the ePWM // ConfigureEPWM(); // // Setup the ADC for ePWM triggered conversions on channel 0 // SetupADCEpwm(0); // //Setup PPB offset correction //conversion on channel A will subtract 100 //conversion on channel B will add 100 // // SetupPPBOffset(100, -1000); // Step 4. Initialize the Device Peripheral. InitCpuTimers(); // For this example, only initialize the Cpu Timers // Configure CPU-Timer 0 to interrupt every second: // 200MHz CPU Freq, 1 second Period (in uSeconds) ConfigCpuTimer(&CpuTimer0, 200, 50); // To ensure precise timing, use write-only instructions to write to the // entire register. Therefore, if any of the configuration bits are changed in // ConfigCpuTimer and InitCpuTimers (in F2837xD_cputimervars.h), the below // settings must also be updated. CpuTimer0Regs.TCR.all = 0x4000; // Step 5. User specific code, enable interrupts: // Enable CPU int1 which is connected to CPU-Timer 0 IER |= M_INT1; // Enable global Interrupts and higher priority real-time debug events: EINT; // Enable Global interrupt INTM ERTM; // Enable Global realtime interrupt DBGM // Step 6. IDLE loop. Just sit and loop forever (optional): while(1) { } } // // ConfigureEPWM - Configure EPWM SOC and compare values // void ConfigureEPWM(void) { EALLOW; EPwm2Regs.TBCTL.all = 0xC030; // Configure timer control register /* bit 15-14 11: FREE/SOFT, 11 = ignore emulation suspend bit 13 0: PHSDIR, 0 = count down after sync event bit 12-10 000: CLKDIV, 000 => TBCLK = HSPCLK/1 bit 9-7 000: HSPCLKDIV, 000 => HSPCLK = SYSCLKOUT/1 bit 6 0: SWFSYNC, 0 = no software sync produced bit 5-4 11: SYNCOSEL, 11 = sync-out disabled bit 3 0: PRDLD, 0 = reload PRD on counter=0 bit 2 0: PHSEN, 0 = phase control disabled bit 1-0 00: CTRMODE, 00 = count up mode */ EPwm2Regs.TBPRD = 2999; // TPPRD +1 = TPWM / (HSPCLKDIV * CLKDIV * TSYSCLK) // = 20 µs / 6.667 ns EPwm2Regs.ETPS.all = 0x0100; // Configure ADC start by ePWM2 /* bit 15-14 00: EPWMxSOCB, read-only bit 13-12 00: SOCBPRD, don't care bit 11-10 00: EPWMxSOCA, read-only bit 9-8 01: SOCAPRD, 01 = generate SOCA on first event bit 7-4 0000: reserved bit 3-2 00: INTCNT, don't care bit 1-0 00: INTPRD, don't care */ EPwm2Regs.ETSEL.all = 0x0A00; // Enable SOCA to ADC /* bit 15 0: SOCBEN, 0 = disable SOCB bit 14-12 000: SOCBSEL, don't care bit 11 1: SOCAEN, 1 = enable SOCA bit 10-8 010: SOCASEL, 010 = SOCA on PRD event bit 7-4 0000: reserved bit 3 0: INTEN, 0 = disable interrupt bit 2-0 000: INTSEL, don't care */ EDIS; } // // adca1_isr - Read ADC Buffer in ISR // interrupt void adca1_isr(void) { V_sen[1] = AdcaResultRegs.ADCRESULT0 >> 4 ; V_sen[2] = AdcaResultRegs.ADCRESULT1 >> 4 ; V_sen[3] = AdcaResultRegs.ADCRESULT2 >> 4 ; V_sen[4] = AdcaResultRegs.ADCRESULT3 >> 4 ; V_sen[5] = AdcaResultRegs.ADCRESULT4 >> 4 ; V_sen[6] = AdcaResultRegs.ADCRESULT5 >> 4 ; AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //clear INT1 flag // // Check if overflow has occurred ADCa // if(1 == AdcaRegs.ADCINTOVF.bit.ADCINT1) { AdcaRegs.ADCINTOVFCLR.bit.ADCINT1 = 1; //clear INT1 overflow flag AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //clear INT1 flag } PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; } // // adcb1_isr - Read ADCB Buffer in ISR // interrupt void adcb1_isr(void) { GpioDataRegs.GPBSET.bit.GPIO35 = 1; V_sen[7] = AdcbResultRegs.ADCRESULT0 >> 4 ; V_sen[8] = AdcbResultRegs.ADCRESULT1 >> 4 ; V_sen[9] = AdcbResultRegs.ADCRESULT2 >> 4 ; V_sen[10] = AdcbResultRegs.ADCRESULT3 >> 4 ; V_sen[11] = AdcbResultRegs.ADCRESULT4 >> 4 ; V_sen[12] = AdcbResultRegs.ADCRESULT5 >> 4 ; GpioDataRegs.GPBCLEAR.bit.GPIO35 = 1; AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //clear INT1 flag // // Check if overflow has occurred ADCb // if(1 == AdcbRegs.ADCINTOVF.bit.ADCINT1) { AdcbRegs.ADCINTOVFCLR.bit.ADCINT1 = 1; //clear INT1 overflow flag AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //clear INT1 flag } PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; } // // ConfigureADC // void ConfigureADC(void) { EALLOW; // //write configurations // AdcaRegs.ADCCTL2.bit.PRESCALE = 6; //set ADCCLK divider to /4 AdcbRegs.ADCCTL2.bit.PRESCALE = 6; //set ADCCLK divider to /4 AdccRegs.ADCCTL2.bit.PRESCALE = 6; //set ADCCLK divider to /4 AdcdRegs.ADCCTL2.bit.PRESCALE = 6; //set ADCCLK divider to /4 AdcSetMode(ADC_ADCA, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE); AdcSetMode(ADC_ADCB, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE); AdcSetMode(ADC_ADCC, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE); AdcSetMode(ADC_ADCD, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE); // //Set pulse positions to late // AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1; AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1; AdccRegs.ADCCTL1.bit.INTPULSEPOS = 1; AdcdRegs.ADCCTL1.bit.INTPULSEPOS = 1; // //power up the ADCs // AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1; AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1; AdccRegs.ADCCTL1.bit.ADCPWDNZ = 1; AdcdRegs.ADCCTL1.bit.ADCPWDNZ = 1; // //delay for 1ms to allow ADC time to power up // DELAY_US(1000); EDIS; } // // SetupADCEpwm - Setup ADC EPWM acquisition window // void SetupADCEpwm(Uint16 channel) { Uint16 acqps; // HERE IT IS ONLY WRITTEN FOR ADC A ONLY, Pleae do write for ADC B Also............. // Determine minimum acquisition window (in SYSCLKS) based on resolution // if(ADC_RESOLUTION_12BIT == AdcaRegs.ADCCTL2.bit.RESOLUTION) { acqps = 14; //75ns } else //resolution is 16-bit { acqps = 63; //320ns } // //Select the channels to convert and end of conversion flag // EALLOW; //----------ADC_A Pins------------// AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0; //SOC0 will convert pin A0 AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps; //sample window is 100 SYSCLK cycles AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 7; //trigger on ePWM2 SOCA/C AdcaRegs.ADCSOC1CTL.bit.CHSEL = 1; //SOC1 will convert pin A1 AdcaRegs.ADCSOC1CTL.bit.ACQPS = acqps; //sample window is 100 SYSCLK cycles AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 7; //trigger on ePWM2 SOCA/C AdcaRegs.ADCSOC2CTL.bit.CHSEL = 2; //SOC2 will convert pin A2 AdcaRegs.ADCSOC2CTL.bit.ACQPS = acqps; //sample window is 100 SYSCLK cycles AdcaRegs.ADCSOC2CTL.bit.TRIGSEL = 7; //trigger on ePWM2 SOCA/C AdcaRegs.ADCSOC3CTL.bit.CHSEL = 3; //SOC3 will convert pin A3 AdcaRegs.ADCSOC3CTL.bit.ACQPS = acqps; //sample window is 100 SYSCLK cycles AdcaRegs.ADCSOC3CTL.bit.TRIGSEL = 7; //trigger on ePWM2 SOCA/C AdcaRegs.ADCSOC4CTL.bit.CHSEL = 4; //SOC4 will convert pin A4 AdcaRegs.ADCSOC4CTL.bit.ACQPS = acqps; //sample window is 100 SYSCLK cycles AdcaRegs.ADCSOC4CTL.bit.TRIGSEL = 7; //trigger on ePWM2 SOCA/C AdcaRegs.ADCSOC5CTL.bit.CHSEL = 5; //SOC5 will convert pin A5 AdcaRegs.ADCSOC5CTL.bit.ACQPS = acqps; //sample window is 100 SYSCLK cycles AdcaRegs.ADCSOC5CTL.bit.TRIGSEL = 7; //trigger on ePWM2 SOCA/C // Should i comment out this part ?? AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1; //enable INT1 flag AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 0; AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 5; //end of A_SOC5 will set INT1 flag AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //make sure INT1 flag is cleared //----------ADC_B Pins------------// AdcbRegs.ADCSOC0CTL.bit.CHSEL = 0; //SOC0 will convert pin B0 AdcbRegs.ADCSOC0CTL.bit.ACQPS = acqps; //sample window is 100 SYSCLK cycles AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 7; //trigger on ePWM2 SOCA/C AdcbRegs.ADCSOC1CTL.bit.CHSEL = 1; //SOC1 will convert pin B1 AdcbRegs.ADCSOC1CTL.bit.ACQPS = acqps; //sample window is 100 SYSCLK cycles AdcbRegs.ADCSOC1CTL.bit.TRIGSEL = 7; //trigger on ePWM2 SOCA/C AdcbRegs.ADCSOC2CTL.bit.CHSEL = 2; //SOC2 will convert pin B2 AdcbRegs.ADCSOC2CTL.bit.ACQPS = acqps; //sample window is 100 SYSCLK cycles AdcbRegs.ADCSOC2CTL.bit.TRIGSEL = 7; //trigger on ePWM2 SOCA/C AdcbRegs.ADCSOC3CTL.bit.CHSEL = 3; //SOC3 will convert pin B3 AdcbRegs.ADCSOC3CTL.bit.ACQPS = acqps; //sample window is 100 SYSCLK cycles AdcbRegs.ADCSOC3CTL.bit.TRIGSEL = 7; //trigger on ePWM2 SOCA/C AdcbRegs.ADCSOC4CTL.bit.CHSEL = 4; //SOC4 will convert pin B4 AdcbRegs.ADCSOC4CTL.bit.ACQPS = acqps; //sample window is 100 SYSCLK cycles AdcbRegs.ADCSOC4CTL.bit.TRIGSEL = 7; //trigger on ePWM2 SOCA/C AdcbRegs.ADCSOC5CTL.bit.CHSEL = 5; //SOC5 will convert pin B5 AdcbRegs.ADCSOC5CTL.bit.ACQPS = acqps; //sample window is 100 SYSCLK cycles AdcbRegs.ADCSOC5CTL.bit.TRIGSEL = 7; //trigger on ePWM2 SOCA/C AdcbRegs.ADCINTSEL1N2.bit.INT1E = 1; // enable INT1 flag AdcbRegs.ADCINTSEL1N2.bit.INT1CONT = 0; AdcbRegs.ADCINTSEL1N2.bit.INT1SEL = 5; // end of B_SOC5 will set INT1 flag AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // make sure INT1 flag is cleared /* Since we are triggering with the ePWM 2B pin, this section is not necesssary. // //ADCINT1 will trigger // AdcaRegs.ADCINTSOCSEL1.bit.SOC0 = 1; AdcaRegs.ADCINTSOCSEL1.bit.SOC1 = 1; AdcaRegs.ADCINTSOCSEL1.bit.SOC2 = 1; AdcaRegs.ADCINTSOCSEL1.bit.SOC3 = 1; AdcaRegs.ADCINTSOCSEL1.bit.SOC4 = 1; AdcaRegs.ADCINTSOCSEL1.bit.SOC5 = 1; // //ADCINT1 will trigger // AdcbRegs.ADCINTSOCSEL1.bit.SOC0 = 1; AdcbRegs.ADCINTSOCSEL1.bit.SOC1 = 1; AdcbRegs.ADCINTSOCSEL1.bit.SOC2 = 1; AdcbRegs.ADCINTSOCSEL1.bit.SOC3 = 1; AdcbRegs.ADCINTSOCSEL1.bit.SOC4 = 1; AdcbRegs.ADCINTSOCSEL1.bit.SOC5 = 1; */ EDIS; } /* // // SetupPPBOffset - Configure PPB for SOC // void SetupPPBOffset(int16 aOffset, int16 bOffset) { EALLOW; AdcaRegs.ADCPPB1CONFIG.bit.CONFIG = 5; //PPB1 is associated with SOC1 AdcaRegs.ADCPPB1OFFCAL.all = aOffset; //PPB1 will subtract OFFCAL value //to associated SOC AdcbRegs.ADCPPB1CONFIG.bit.CONFIG = 0; //PPB1 is associated with SOC1 AdcbRegs.ADCPPB1OFFCAL.all = bOffset; //PPB1 will subtract OFFCAL value //to associated SOC EDIS; } */ // cpu_timer0_isr - CPU Timer0 ISR with interrupt counter __interrupt void cpu_timer0_isr(void) { CpuTimer0.InterruptCount++; /* EALLOW; SysCtrlRegs.WDKEY = 0x55; SysCtrlRegs.WDKEY = 0xAA; // service WD #2 EDIS; */ x = m_a*vf*sin(m_f*w*Ts*vf*sam); x2 = m_a*vf*sin(m_f*w*Ts*vf*sam - 2*pi/3); x3 = m_a*vf*sin(m_f*w*Ts*vf*sam - 4*pi/3); /* if (x >=0) { GpioDataRegs.GPBSET.bit.GPIO35 = 1; } else { GpioDataRegs.GPBCLEAR.bit.GPIO35 = 1; } */ A = 0.5*(1 - x); B = 0.5*(1 - x2); C = 0.5*(1 - x3); if (ADC == 0) { EPwm1Regs.CMPA.bit.CMPA= TB_PRD*A ; } else if (ADC == 1) { EPwm1Regs.CMPA.bit.CMPA= TB_PRD*G1*Gain*(V_sen[1] - B1); } else if (ADC == 2) { EPwm1Regs.CMPA.bit.CMPA= TB_PRD*G2*Gain*(V_sen[2] - B2); } else if (ADC == 3) { EPwm1Regs.CMPA.bit.CMPA= TB_PRD*G3*Gain*(V_sen[3] - B3); } else if (ADC == 4) { EPwm1Regs.CMPA.bit.CMPA= TB_PRD*G4*Gain*(V_sen[4] - B4); } else if (ADC == 5) { EPwm1Regs.CMPA.bit.CMPA= TB_PRD*G5*Gain*(V_sen[5] - B5); } else if (ADC == 6) { EPwm1Regs.CMPA.bit.CMPA= TB_PRD*G6*Gain*(V_sen[6] - B6); } else if (ADC == 7) { EPwm1Regs.CMPA.bit.CMPA= TB_PRD*G7*Gain*(V_sen[7] - B7); } else if (ADC == 8) { EPwm1Regs.CMPA.bit.CMPA= TB_PRD*G8*Gain*(V_sen[8] - B8); } else if (ADC == 9) { EPwm1Regs.CMPA.bit.CMPA= TB_PRD*G9*Gain*(V_sen[9] - B9); } else if (ADC == 10) { EPwm1Regs.CMPA.bit.CMPA= TB_PRD*G10*Gain*(V_sen[10] - B10); } else if (ADC == 11) { EPwm1Regs.CMPA.bit.CMPA= TB_PRD*G11*Gain*(V_sen[11] - B11); } else if (ADC == 12) { EPwm1Regs.CMPA.bit.CMPA= TB_PRD*G12*Gain*(V_sen[12] - B12); } EPwm1Regs.CMPA.bit.CMPA = TB_PRD*A ; EPwm1Regs.CMPB.bit.CMPB = TB_PRD*A ; EPwm3Regs.CMPA.bit.CMPA = TB_PRD*B ; EPwm3Regs.CMPB.bit.CMPB = TB_PRD*B ; EPwm4Regs.CMPA.bit.CMPA = TB_PRD*C ; EPwm4Regs.CMPB.bit.CMPB = TB_PRD*C ; // // Acknowledge this interrupt to receive more interrupts from group 1 // PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; if (data_type == 1) { data_log_1[i] = 1000*x; } else if (data_type == 2) { data_log_1[i] = m_f*w*Ts*vf*sam; } else if (data_type == 3) { data_log_1[i] = G1*Gain*(V_sen[1] - B1); } else if (data_type == 4) { data_log_1[i] = G2*Gain*(V_sen[2] - B2); } else if (data_type == 5) { data_log_1[i] = G3*Gain*(V_sen[3] - B3); } else if (data_type == 6) { data_log_1[i] = G4*Gain*(V_sen[4] - B4); } else if (data_type == 7) { data_log_1[i] = G5*Gain*(V_sen[5] - B5); } else if (data_type == 8) { data_log_1[i] = G6*Gain*(V_sen[6] - B6); } else if (data_type == 9) { data_log_1[i] = G7*Gain*(V_sen[7] - B7); } else if (data_type == 10) { data_log_1[i] = G8*Gain*(V_sen[8] - B8); } else if (data_type == 11) { data_log_1[i] = G9*Gain*(V_sen[9] - B9); } else if (data_type == 12) { data_log_1[i] = G10*Gain*(V_sen[10] - B10); } else if (data_type == 13) { data_log_1[i] = G11*Gain*(V_sen[11] - B11); } else if (data_type == 14) { data_log_1[i] = G12*Gain*(V_sen[12] - B12); } i = i+1; if (i == sample_size) { i = 0; } sam++ ; if (m_f*w*Ts*vf*sam == 2*pi) { sam = 0; } } void Gpio_select(void) { EALLOW; GpioCtrlRegs.GPAMUX1.all = 0x00000000; // All GPIO GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // Activating ePWM1A GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; // Activating ePWM1B // ePWM2 is used for ADC conversion and thats why it not used here. GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 1; // Activating ePWM3A GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 1; // Activating ePWM3B GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 1; // Activating ePWM4A GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 1; // Activating ePWM4B GpioCtrlRegs.GPAMUX2.all = 0x00000000; // All GPIO GpioCtrlRegs.GPBMUX1.all = 0x00000000; // All GPIO GpioCtrlRegs.GPADIR.all = 0xFFFFFFFF; // All outputs GpioCtrlRegs.GPBDIR.all = 0x00001FFF; // All outputs EDIS; } void InitEPwm1Example() { EPwm1Regs.TBPRD = 3125; // Set timer period EPwm1Regs.TBPHS.bit.TBPHS = 0x0000; // Phase is 0 EPwm1Regs.TBCTR = 0x0000; // Clear counter // // Setup TBCLK // EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loading EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV4; // Clock ratio to SYSCLKOUT EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV4; EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // Load registers every ZERO EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // // Setup compare // // EPwm1Regs.CMPA.bit.CMPA = 3000; // // 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; /* // // Active Low PWMs - Setup Deadband // EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_LO; EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL; EPwm1Regs.DBRED.bit.DBRED = EPWM1_MIN_DB; EPwm1Regs.DBFED.bit.DBFED = EPWM1_MIN_DB; EPwm1_DB_Direction = DB_UP; // // Interrupt where we will change the Deadband // EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // Select INT on Zero event EPwm1Regs.ETPS.bit.INTPRD = ET_3RD; // Generate INT on 3rd event */ EPwm1Regs.ETSEL.bit.INTEN = 1; // Enable INT //---------------------------------- ePWM3---------------------------------- EPwm3Regs.TBPRD = 3125; // Set timer period EPwm3Regs.TBPHS.bit.TBPHS = 0x0000; // Phase is 0 EPwm3Regs.TBCTR = 0x0000; // Clear counter // // Setup TBCLK // EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up EPwm3Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loading EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV4; // Clock ratio to SYSCLKOUT EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV4; EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // Load registers every ZERO EPwm3Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; EPwm3Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // // Setup compare // // EPwm1Regs.CMPA.bit.CMPA = 3000; // // Set actions // EPwm3Regs.AQCTLA.bit.CAU = AQ_SET; // Set PWM1A on Zero EPwm3Regs.AQCTLA.bit.CAD = AQ_CLEAR; EPwm3Regs.AQCTLB.bit.CAU = AQ_CLEAR; // Set PWM1A on Zero EPwm3Regs.AQCTLB.bit.CAD = AQ_SET; /* // // Active Low PWMs - Setup Deadband // EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_LO; EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL; EPwm1Regs.DBRED.bit.DBRED = EPWM1_MIN_DB; EPwm1Regs.DBFED.bit.DBFED = EPWM1_MIN_DB; EPwm1_DB_Direction = DB_UP; // // Interrupt where we will change the Deadband // EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // Select INT on Zero event EPwm1Regs.ETPS.bit.INTPRD = ET_3RD; // Generate INT on 3rd event */ EPwm3Regs.ETSEL.bit.INTEN = 1; // Enable INT //---------------------------------- ePWM4---------------------------------- EPwm4Regs.TBPRD =3125; // Set timer period EPwm4Regs.TBPHS.bit.TBPHS = 0x0000; // Phase is 0 EPwm4Regs.TBCTR = 0x0000; // Clear counter // // Setup TBCLK // EPwm4Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up EPwm4Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loading EPwm4Regs.TBCTL.bit.HSPCLKDIV = TB_DIV4; // Clock ratio to SYSCLKOUT EPwm4Regs.TBCTL.bit.CLKDIV = TB_DIV4; EPwm4Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // Load registers every ZERO EPwm4Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; EPwm4Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; EPwm4Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // // Setup compare // // EPwm1Regs.CMPA.bit.CMPA = 3000; // // Set actions // EPwm4Regs.AQCTLA.bit.CAU = AQ_SET; // Set PWM1A on Zero EPwm4Regs.AQCTLA.bit.CAD = AQ_CLEAR; EPwm4Regs.AQCTLB.bit.CAU = AQ_CLEAR; // Clear PWM4B on Zero EPwm4Regs.AQCTLB.bit.CAD = AQ_SET; /* // // Active Low PWMs - Setup Deadband // EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_LO; EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL; EPwm1Regs.DBRED.bit.DBRED = EPWM1_MIN_DB; EPwm1Regs.DBFED.bit.DBFED = EPWM1_MIN_DB; EPwm1_DB_Direction = DB_UP; // // Interrupt where we will change the Deadband // EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // Select INT on Zero event EPwm1Regs.ETPS.bit.INTPRD = ET_3RD; // Generate INT on 3rd event */ EPwm4Regs.ETSEL.bit.INTEN = 1; // Enable INT } // // End of file //