This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我需要兩個ePWM波形
ePWM1可放大縮小,但ePWM2須維持固定大小,並與ePWM1同時關斷
兩個訊號Duty不同,但在同一時間關斷
因為令 EPwm2Regs.CMPA.half.CMPA = Vc1-0.1*1499; (EPwm2中GPIO3是GPIO2的反向訊號)
因此目前是 ePWM1 GPIO0為主要訊號,可使ePWM2 GPIO3可在GPIO0關斷前導通一段時間,但GPIO3在GPIO0關斷時仍繼續導通
需要的是GPIO3與GPIO0同時關斷
或者是能有甚麼方式可以控制這樣的訊號
#include "DSP28x_Project.h" typedef struct { volatile struct EPWM_REGS *EPwmRegHandle; Uint16 EPwm_CMPA_Direction; Uint16 EPwm_CMPB_Direction; Uint16 EPwmTimerIntCount; Uint16 EPwmMaxCMPA; Uint16 EPwmMinCMPA; Uint16 EPwmMaxCMPB; Uint16 EPwmMinCMPB; } EPWM_INFO; void InitEpwm1(void); __interrupt void adc_isr(void); __interrupt void epwm_isr(void); int count = 0; int x = 0; int S4DBR = 0; Uint16 LoopCount; Uint16 ConversionCount; float Voltage1; float VoltageFB; float Vcmd; float Verror; float Verror1; float Kp; float Ki; float Vc; float Vc1; float Vc_last; float DeadTime; float Td; float D0DT; float S34DB; float S3Duty; #define EPWM1_TIMER_TBPRD 1499 #define EPWM1_MAX_CMPA 1499 #define EPWM1_MIN_CMPA 700 #define EPWM2_TIMER_TBPRD 1499 #define EPWM2_MAX_CMPA 1499 #define EPWM2_MIN_CMPA 700 #define EPWM3_TIMER_TBPRD 1499 #define EPWM3_MAX_CMPA 1499 #define EPWM3_MIN_CMPA 700 main() { InitSysCtrl(); EALLOW; #if (CPU_FRQ_150MHZ) #define ADC_MODCLK 0x3 #endif #if (CPU_FRQ_100MHZ) #define ADC_MODCLK 0x2 #endif EDIS; EALLOW; SysCtrlRegs.HISPCP.all = ADC_MODCLK; EDIS; InitEPwm1Gpio(); InitEPwm2Gpio(); InitEPwm3Gpio(); DINT; InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); EALLOW; PieVectTable.ADCINT = &adc_isr; PieVectTable.EPWM1_INT = &epwm_isr; EDIS; InitAdc(); InitEpwm1(); IER |= M_INT1; IER |= M_INT3; PieCtrlRegs.PIEIER3.bit.INTx1 = 1; PieCtrlRegs.PIEIER3.bit.INTx2 = 1; PieCtrlRegs.PIEIER3.bit.INTx3 = 1; PieCtrlRegs.PIEIER1.bit.INTx6 = 1; EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1; SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1; SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 1; EDIS; EINT; ERTM; ////////////////////////////////////////////////////// LoopCount = 0; ConversionCount = 0; Vcmd = 3100; Kp = 0.75; Ki = 0.005; S34DB = 0.15; DeadTime = 40; S4DBR = 0; count = 0; x = 0; ////////////////////////////////////////////////////// for(;;) { DELAY_US(5000); if(x == 0) { count++; if(count == 500) { x = 1; } } else { count--; if(count == 0) { x = 0; } } } AdcRegs.ADCMAXCONV.all = 0x0001; AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; //AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x2; AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1; AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; EPwm1Regs.ETSEL.bit.SOCAEN = 1; EPwm1Regs.ETSEL.bit.SOCASEL = 4; EPwm1Regs.ETPS.bit.SOCAPRD = 1; EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD; EPwm1Regs.TBCTL.bit.CTRMODE = 0; EPwm2Regs.ETSEL.bit.SOCAEN = 1; EPwm2Regs.ETSEL.bit.SOCASEL = 4; EPwm2Regs.ETPS.bit.SOCAPRD = 1; EPwm2Regs.TBPRD = EPWM1_TIMER_TBPRD; EPwm2Regs.TBCTL.bit.CTRMODE = 0; EPwm3Regs.ETSEL.bit.SOCAEN = 1; EPwm3Regs.ETSEL.bit.SOCASEL = 4; EPwm3Regs.ETPS.bit.SOCAPRD = 1; EPwm3Regs.TBPRD = EPWM1_TIMER_TBPRD; EPwm3Regs.TBCTL.bit.CTRMODE = 0; EPwm1Regs.TBCTL.bit.PHSEN = TB_ENABLE; EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE; EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE; for(;;) { asm(" NOP"); LoopCount++; } } __interrupt void adc_isr(void) { Voltage1 = AdcRegs.ADCRESULT0 >>4; VoltageFB = ((float)Voltage1); AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; } __interrupt void epwm_isr(void) { Vc = 1000; Vc1 = Vc + count; if(Vc1 >= EPWM1_MAX_CMPA) { Vc1 = EPWM1_MAX_CMPA; } if(Vc1 <= EPWM1_MIN_CMPA) { Vc1 = EPWM1_MIN_CMPA; } Verror1 = Verror; Vc_last = Vc1; EPwm1Regs.CMPA.half.CMPA = Vc1; EPwm2Regs.CMPA.half.CMPA = Vc1-0.1*1499; EPwm3Regs.CMPA.half.CMPA = Vc1; EPwm1Regs.ETCLR.bit.INT = 1; EPwm2Regs.ETCLR.bit.INT = 1; EPwm3Regs.ETCLR.bit.INT = 1; PieCtrlRegs.PIEACK.all = PIEACK_GROUP3; } void InitEpwm1() { EALLOW; GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0; GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0; GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; EDIS; EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD; EPwm1Regs.TBPHS.half.TBPHS = 0x0000; EPwm1Regs.TBCTR = 0x0000; EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; EPwm1Regs.TBCTL.bit.PHSEN = TB_ENABLE; EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0; EPwm1Regs.TBCTL.bit.CLKDIV = 0; EPwm1Regs.CMPCTL.bit.SHDWAMODE = 1; EPwm1Regs.CMPCTL.bit.SHDWBMODE = 1; EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; EPwm1Regs.AQCTLA.bit.CAU = 2; EPwm1Regs.AQCTLA.bit.CAD = 1; EPwm1Regs.AQCTLB.bit.CAU = 2; EPwm1Regs.AQCTLB.bit.CAD = 1; EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; EPwm1Regs.AQCTLB.bit.ZRO = 2; EPwm1Regs.AQCTLB.bit.CAU = 1; EPwm1Regs.DBCTL.bit.IN_MODE = 2; EPwm1Regs.DBCTL.bit.POLSEL = 2; EPwm1Regs.DBCTL.bit.OUT_MODE = 3; EPwm1Regs.DBRED = DeadTime; EPwm1Regs.DBFED = DeadTime; EPwm1Regs.ETSEL.bit.INTEN = 1; EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; EPwm1Regs.ETPS.bit.INTPRD = 1; EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; EDIS; //////////////////////////////////////////////////////////////////////////////////////////////////// EALLOW; GpioCtrlRegs.GPAPUD.bit.GPIO2 = 0; GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0; GpioCtrlRegs.GPAMUX1.bit.GPIO2= 1; GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1; EDIS; EPwm2Regs.TBPRD = EPWM1_TIMER_TBPRD; EPwm2Regs.TBPHS.half.TBPHS = 2; EPwm2Regs.TBCTR = 0x0000; EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE; EPwm2Regs.TBCTL.bit.HSPCLKDIV = 0; EPwm2Regs.TBCTL.bit.CLKDIV = 0; EPwm2Regs.CMPCTL.bit.SHDWAMODE = 1; EPwm2Regs.CMPCTL.bit.SHDWBMODE = 1; EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; EPwm2Regs.AQCTLA.bit.CAU = 2; EPwm2Regs.AQCTLA.bit.CAD = 1; EPwm2Regs.AQCTLB.bit.CAU = 2; EPwm2Regs.AQCTLB.bit.CAD = 1; EPwm2Regs.AQCTLA.bit.ZRO = AQ_SET; EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR; EPwm2Regs.AQCTLB.bit.ZRO = 2; EPwm2Regs.AQCTLB.bit.CAU = 1; EPwm2Regs.DBCTL.bit.IN_MODE = 2; EPwm2Regs.DBCTL.bit.POLSEL = 2; EPwm2Regs.DBCTL.bit.OUT_MODE = 3; EPwm2Regs.DBRED = DeadTime; EPwm2Regs.DBFED = DeadTime; //////////////////////////////////////////////////////////////////////////////////////////////////// EALLOW; GpioCtrlRegs.GPAPUD.bit.GPIO4 = 0; GpioCtrlRegs.GPAPUD.bit.GPIO5 = 0; GpioCtrlRegs.GPAMUX1.bit.GPIO4= 1; GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 1; EDIS; EPwm3Regs.TBPRD = EPWM1_TIMER_TBPRD; EPwm3Regs.TBPHS.half.TBPHS = 2; EPwm3Regs.TBCTR = 0x0000; EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE; EPwm3Regs.TBCTL.bit.HSPCLKDIV = 0; EPwm3Regs.TBCTL.bit.CLKDIV = 0; EPwm3Regs.CMPCTL.bit.SHDWAMODE = 1; EPwm3Regs.CMPCTL.bit.SHDWBMODE = 1; EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; EPwm3Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; EPwm3Regs.AQCTLA.bit.CAU = 2; EPwm3Regs.AQCTLA.bit.CAD = 1; EPwm3Regs.AQCTLB.bit.CAU = 2; EPwm3Regs.AQCTLB.bit.CAD = 1; EPwm3Regs.AQCTLA.bit.ZRO = AQ_SET; EPwm3Regs.AQCTLA.bit.CAU = AQ_CLEAR; EPwm3Regs.AQCTLB.bit.ZRO = 2; EPwm3Regs.AQCTLB.bit.CAU = 1; EPwm3Regs.DBCTL.bit.IN_MODE = 2; EPwm3Regs.DBCTL.bit.POLSEL = 2; EPwm3Regs.DBCTL.bit.OUT_MODE = 3; EPwm3Regs.DBRED = DeadTime; EPwm3Regs.DBFED = DeadTime; }
GPIO0是依照回授訊號與內部3V三角波比較出來
後續有成功了,換成使用deadTime控制GPIO0和GPIO2兩者間的大小控制的,一開始deadTime寫在另一個中斷程式,改至與PI補償同一個副程式中即可
__interrupt void epwm_isr(void) { Vc = 800; Vc1 = Vc + count; S3Duty = (((1-D0DT)*1499) - DeadTime); S4DBR = Vc1 - D0DT*1499; if(Vc1 >= EPWM1_MAX_CMPA) { Vc1 = 1050; } if(Vc1 <= EPWM1_MIN_CMPA) { Vc1 = 700; } Verror1 = Verror; Vc_last = Vc1; EPwm1Regs.CMPA.half.CMPA = Vc1; EPwm2Regs.CMPA.half.CMPA = S3Duty; EPwm3Regs.CMPA.half.CMPA = Vc1; EPwm1Regs.ETCLR.bit.INT = 1; EPwm2Regs.ETCLR.bit.INT = 1; EPwm3Regs.ETCLR.bit.INT = 1; PieCtrlRegs.PIEACK.all = PIEACK_GROUP3; EPwm3Regs.DBCTL.bit.IN_MODE = 2; EPwm3Regs.DBCTL.bit.POLSEL = 2; EPwm3Regs.DBCTL.bit.OUT_MODE = 3; EPwm3Regs.DBRED = S4DBR; EPwm3Regs.DBFED = DeadTime; }