Tool/software: Code Composer Studio
Sir,
I am trying to generate a sine PWM using sine lookup table. But I am not getting any output can you please suggest me where is the mistake. The lookup table I have referred from one more link of e2e.ti.com.
Thank you
Bighnaraj Panda
- #include "F28x_Project.h"
- //
- // Defines
- //
- #define Sine_TABLE_LENGTH 100
- #define EPWM1_TIMER_TBPRD 2500 // Period register
- #define EPWM2_TIMER_TBPRD 2500
- #define EPWM3_TIMER_TBPRD 2500
- #pragma DATA_SECTION(SineTable,"SineTableSection")
- uint32_t SineTable[Sine_TABLE_LENGTH]={
- 0x00000000,0x41bc646b,0x423c5e7a,0x428d3f6d,0x42bc46b4,0x42eb421a,0x430d1754,0x432484b3,0x433be7b1,0x43533ed4,0x436a88a2,0x4380e1d2,0x438c7731,0x439803b2,0x43a3869d,0x43aeff36,0x43ba6cc3,0x43c5ce8e,0x43d123dd,0x43dc6bfa,0x43e7a62e,0x43f2d1c4,0x43fdee08,0x44047d23,0x4409fae6,0x440f6ff4,0x4414dbf5,0x441a3e91,0x441f9771,0x4424e640,0x442a2aa7,0x442f6451,0x443492ea,0x4439b61e,0x443ecd9a,0x4443d90c,0x4448d822,0x444dca8c,0x4452affa,0x4457881c,0x445c52a4,0x44610f46,0x4465bdb4,0x446a5da3,0x446eeec8,0x447370d5,0x4477e38e,0x447c469f,0x44804ce2,0x44826e5d,0x4484879c,0x4486987e,0x4488a0e3,0x448aa0a8,0x448c97ae,0x448e85d4,0x44906afd,0x44924709,0x449419d9,0x4495e352,0x4497a355,0x449959c6,0x449b068b,0x449ca987,0x449e42a1,0x449fd1be,0x44a156c5,0x44a2d19e,0x44a44231,0x44a5a867,0x44a70429,0x44a85561,0x44a99bf9,0x44aad7de,0x44ac08fb,0x44ad2f3d,0x44ae4a92,0x44af5ae7,0x44b0602b,0x44b15a4f,0x44b24941,0x44b32cf4,0x44b40558,0x44b4d260,0x44b593ff,0x44b64a29,0x44b6f4d3,0x44b793f1,0x44b82779,0x44b8af63,0x44b92ba6,0x44b99c39,0x44ba0116,0x44ba5a36,0x44baa794,0x44bae92b,
- 0x44bb1ef7,0x44bb48f4,0x44bb6720,0x44bb7978,0x44bb7ffc};
- /// CMPA and CMPB sum should be 2500 for 50% duty cycle
- //
- int interrupt_count = 1;
- unsigned long IntCount;
- // Function Prototypes
- void Gpio_setup (void);
- void InitEPwm1Example(void);
- void InitEPwm2Example(void);
- void InitEPwm3Example(void);
- __interrupt void epwm1_isr(void);
- __interrupt void epwm2_isr(void);
- __interrupt void epwm3_isr(void);
- //
- // Main
- //
- void main(void)
- {
- InitSysCtrl();
- InitGpio();
- Gpio_setup ();
- CpuSysRegs.PCLKCR2.bit.EPWM1=1;
- CpuSysRegs.PCLKCR2.bit.EPWM2=1;
- CpuSysRegs.PCLKCR2.bit.EPWM3=1;
- InitEPwm1Gpio();
- InitEPwm2Gpio();
- InitEPwm3Gpio();
- DINT;
- InitPieCtrl();
- IER = 0x0000;
- IFR = 0x0000;
- InitPieVectTable();
- //
- EALLOW; // This is needed to write to EALLOW protected registers
- PieVectTable.EPWM1_INT = &epwm1_isr;
- PieVectTable.EPWM2_INT = &epwm2_isr;
- PieVectTable.EPWM3_INT = &epwm3_isr;
- EDIS; // This is needed to disable write to EALLOW protected registers
- EALLOW;
- CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
- EDIS;
- InitEPwm1Example();
- InitEPwm2Example();
- InitEPwm3Example();
- EALLOW;
- CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
- EDIS;
- IER |= M_INT3;
- PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
- PieCtrlRegs.PIEIER3.bit.INTx2 = 1;
- PieCtrlRegs.PIEIER3.bit.INTx3 = 1;
- //
- // Enable global Interrupts and higher priority real-time debug events:
- //
- EINT; // Enable Global interrupt INTM
- ERTM; // Enable Global realtime interrupt DBGM
- //
- // Step 5. IDLE loop. Just sit and loop forever (optional):
- while(1)
- {
- }
- }
- //
- // epwm1_isr - EPWM1 ISR
- //
- __interrupt void epwm1_isr(void)
- {
- interrupt_count++;
- // Generate 2nd interrupt when Counter down count = CMPB
- if(interrupt_count == 2)
- {
- GpioDataRegs.GPBDAT.bit.GPIO63 = 1; //set GPIO-63 high
- // GpioDataRegs.GPBSET.bit.GPIO63 = 1; //set GPIO-63 high
- // GpioDataRegs.GPADAT.bit.GPIO14 = 1; //set GPIO-14 high
- // GpioDataRegs.GPASET.bit.GPIO14 = 1; //set GPIO-14 high
- EPwm1Regs.ETSEL.bit.INTSEL = 7;
- }
- // After generating interrupt when counter down count = CMPB
- // Reset the next interrupt to generate again when counter up count = CMPA
- else
- {
- GpioDataRegs.GPBDAT.bit.GPIO63 = 0; //set GPIO-63 low
- // GpioDataRegs.GPBCLEAR.bit.GPIO63 = 1; //set GPIO-63 low
- // GpioDataRegs.GPADAT.bit.GPIO14 = 0; //set GPIO-14 low
- // GpioDataRegs.GPACLEAR.bit.GPIO14 = 1; //set GPIO-14 low
- EPwm1Regs.ETSEL.bit.INTSEL = 4;
- interrupt_count = 1;
- }
- EPwm1Regs.ETCLR.bit.INT = 1;
- PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
- if( IntCount < 100)
- {
- IntCount++;
- }
- else
- IntCount = 0;
- }
- __interrupt void epwm2_isr(void)
- {
- EPwm2Regs.ETCLR.bit.INT = 1;
- PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
- if( IntCount < 100)
- {
- IntCount++;
- }
- else
- IntCount = 0;
- }
- __interrupt void epwm3_isr(void)
- {
- // Clear INT flag for this timer
- //
- EPwm3Regs.ETCLR.bit.INT = 1;
- //
- // Acknowledge this interrupt to receive more interrupts from group 3
- //
- PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
- if( IntCount < 100)
- {
- IntCount++;
- }
- else
- IntCount = 0;
- }
- //
- // InitEPwm1Example - Initialize EPWM1 configuration
- //
- void InitEPwm1Example()
- {
- //
- // Setup TBCLK
- //
- EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD; // Set timer period 801 TBCLKs
- EPwm1Regs.TBPHS.bit.TBPHS = 0x0000; // Phase is 0
- EPwm1Regs.TBCTR = 0x0000; // Clear counter
- //
- // Set Compare values
- //
- EPwm1Regs.CMPA.bit.CMPA = SineTable[IntCount]; // Set compare A value
- EPwm1Regs.CMPB.bit.CMPB = SineTable[IntCount]; // Set Compare B value
- //
- // Setup counter mode
- //
- EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up and down
- 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;
- //
- // Set actions
- //
- EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // Set PWM1A on event A, up
- // count
- EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; // Clear PWM1A on event A,
- // down count
- EPwm1Regs.AQCTLB.bit.CBU = AQ_SET; // Set PWM1B on event B, up
- // count
- EPwm1Regs.AQCTLB.bit.CBD = AQ_CLEAR; // Clear PWM1B on event B,
- // down count
- //
- // Interrupt where we will change the Compare Values
- //
- EPwm1Regs.ETSEL.bit.INTSEL = 4; // Select INT on TBCTR = CMPA up-count
- EPwm1Regs.ETSEL.bit.INTEN = 1; // Enable INT
- EPwm1Regs.ETPS.bit.INTPRD = 1; // Generate INT on 3rd event
- }
- void InitEPwm2Example()
- {
- //
- // Setup TBCLK
- //
- EPwm2Regs.TBPRD = EPWM2_TIMER_TBPRD; // Set timer period 801 TBCLKs
- EPwm2Regs.TBPHS.bit.TBPHS = 0x0000; // Phase is 0
- EPwm2Regs.TBCTR = 0x0000; // Clear counter
- //
- // Set Compare values
- //
- EPwm2Regs.CMPA.bit.CMPA = SineTable[IntCount]; // Set compare A value
- EPwm2Regs.CMPB.bit.CMPB = SineTable[IntCount]; // Set Compare B value
- //
- // Setup counter mode
- //
- EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up and down
- EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loading
- EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
- EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;
- //
- // Set actions
- //
- EPwm2Regs.AQCTLA.bit.CAU = AQ_SET; // Set PWM1A on event A, up
- // count
- EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR; // Clear PWM1A on event A,
- // down count
- EPwm2Regs.AQCTLB.bit.CBU = AQ_SET; // Set PWM1B on event B, up
- // count
- EPwm2Regs.AQCTLB.bit.CBD = AQ_CLEAR; // Clear PWM1B on event B,
- // down count
- //
- // Interrupt where we will change the Compare Values
- //
- EPwm2Regs.ETSEL.bit.INTSEL = 4; // Select INT on TBCTR = CMPA up-count
- EPwm2Regs.ETSEL.bit.INTEN = 1; // Enable INT
- EPwm2Regs.ETPS.bit.INTPRD = 1; // Generate INT on 3rd event
- }
- void InitEPwm3Example()
- {
- //
- // Setup TBCLK
- //
- EPwm3Regs.TBPRD = EPWM3_TIMER_TBPRD; // Set timer period 801 TBCLKs
- EPwm3Regs.TBPHS.bit.TBPHS = 0x0000; // Phase is 0
- EPwm3Regs.TBCTR = 0x0000; // Clear counter
- //
- // Set Compare values
- //
- EPwm3Regs.CMPA.bit.CMPA = SineTable[IntCount]; // Set compare A value
- EPwm3Regs.CMPB.bit.CMPB = SineTable[IntCount]; // Set Compare B value
- //
- // Setup counter mode
- //
- EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up and down
- EPwm3Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loading
- EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
- EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1;
- //
- // Set actions
- //
- EPwm3Regs.AQCTLA.bit.CAU = AQ_SET; // Set PWM1A on event A, up
- // count
- EPwm3Regs.AQCTLA.bit.CAD = AQ_CLEAR; // Clear PWM1A on event A,
- // down count
- EPwm3Regs.AQCTLB.bit.CBU = AQ_SET; // Set PWM1B on event B, up
- // count
- EPwm3Regs.AQCTLB.bit.CBD = AQ_CLEAR; // Clear PWM1B on event B,
- // down count
- //
- // Interrupt where we will change the Compare Values
- //
- EPwm3Regs.ETSEL.bit.INTSEL = 4; // Select INT on TBCTR = CMPA up-count
- EPwm3Regs.ETSEL.bit.INTEN = 1; // Enable INT
- EPwm3Regs.ETPS.bit.INTPRD = 1; // Generate INT on 3rd event
- }
- void Gpio_setup (void)
- {
- EALLOW;
- GpioCtrlRegs.GPBMUX2.bit.GPIO63 = 0;//GPIO
- GpioCtrlRegs.GPBDIR.bit.GPIO63 = 1; //output
- EDIS;
- }
