目前使用28335在做平均电流控制,如果我希望adc采样的位置在pwm的中间位置请问我该怎么设定
以下是我目前的代码
int main(void)
{
InitSysCtrl();
InitEPwm1Gpio();
InitEPwm2Gpio();
Gpio_Setup();
InitEPwm1Example();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
adc_init();
AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
EALLOW;// This is needed to write to EALLOW protected registers
PieVectTable.EPWM1_INT = &epwm1_isr;
EDIS;
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
IER |= M_INT3;
// Enable EPWM INTn in the PIE: Group 3 interrupt 1-3
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
// Enable global Interrupts and higher priority real-time debug events:
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
//for(;;){
// __asm(" NOP");
while(1)
{
}
}
void adc_init(void)
{
EALLOW;
#if (CPU_FRQ_150MHZ)
#define ADC_MODCLK 0x3;
#endif
#if (CPU_FRQ_100MHZ)
#define ADC_MODCLK 0x2;
#endif
EDIS;
// Initialize ADC
InitAdc();
EALLOW;
SysCtrlRegs.HISPCP.all = ADC_MODCLK; //HSPCLK = SYSCLKOUT/2*HISPCP = 150/(2*3) = 25.0 MHz
EDIS;
AdcRegs.ADCTRL3.bit.SMODE_SEL = 1;
AdcRegs.ADCTRL1.bit.ACQ_PS = 0xf;
AdcRegs.ADCTRL3.bit.ADCCLKPS = 0x1; // Core clock driver Fclk = HSPCLK/(2*ADCCLKPS),但?ADCCLKPS=0?,Fclk = HSPCLK
AdcRegs.ADCTRL1.bit.CPS = 0x0; //ADCCLK = Fclk / (CPS+1)
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 15; // Set up ADC to perform (value+1) conversions for every SOC
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 0: Dual-sequencer mode, 1: Cascaded mode
AdcRegs.ADCTRL1.bit.CONT_RUN = 1;
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // ADCINA0 to ADCRESULT0
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1; // ADCINA1 to ADCRESULT2
}
void read_adcresults(void)
{
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Immediately reset sequencer to state CONV00
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1; // Software trigger
while(AdcRegs.ADCST.bit.INT_SEQ1 == 0); // Interrupt request by INT_SEQ1 is enabled
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // Clear the SEQ1 interrupt flag bit
p0= (AdcRegs.ADCRESULT0 >> 4); //A0 // Convert 16 bits registers to 12 bits ADC results by right-shift 4 bits
p1= (AdcRegs.ADCRESULT1 >> 4); //B0
}
void InitEPwm1Example(void){
// Setup TBCLK
EPwm1Regs.TBPRD = 1500; // 100KHz
EPwm1Regs.TBPHS.half.TBPHS =0; // Phase is 0
EPwm1Regs.TBCTR = 0; // ?基??器清零
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // Count up
EPwm1Regs.TBCTL.bit.PHSEN = TB_ENABLE; // Disable phase loading
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0; // Clock ratio to SYSCLKOUT 除1
EPwm1Regs.TBCTL.bit.CLKDIV = 0; //1
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
// Setup shadowing
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // Load on Zero
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
// Set Dead-band
EPwm1Regs.DBCTL.bit.OUT_MODE = 0x0; // Enable Dead-band module
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // Active high
// EPwm1Regs.DBFED = 30;
// EPwm1Regs.DBRED = 30;
// Set actions
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // set actions for EPWM1A
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET ;
EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;
// Interrupt where we will change the Compare Values
EPwm1Regs.ETSEL.bit.SOCAEN = 1; // Enable SOC on A group
EPwm1Regs.ETSEL.bit.SOCASEL = 0x6; // CTRU = CMPB
EPwm1Regs.ETPS.bit.SOCAPRD = 0x1;
//EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // Select INT on Zero event
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_PRD; // Select INT on PRD event
EPwm1Regs.ETSEL.bit.INTEN = 1; // Enable INT
EPwm1Regs.ETPS.bit.INTPRD = ET_1ST; // Generate INT on 1ST event
}
interrupt void epwm1_isr(void)
{
read_adcresults();
EPwm1Regs.CMPB=750;
}
我在epwm1_isr中读取adc的数值,这样感觉是在开关导通就采样而不是在中点采样





