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.

TMS320F28035: 輸出的pwm1&2訊號不同步

Part Number: TMS320F28035


試想設置兩個pwm1&2訊號可是不知是我哪裡程式有問題,導致訊號不同步

#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
#define   ADC_MODCLK 0x3   // SYSCLKOUT/(2*HSPCP)=150M/(2*3)=25MHz
#define   ADC_CKPS   0x1   // HISPCLK/(2*ADC_CKPS)= 25MHz/(2*1) = 12.5MHz
#define   ADC_CPS    0x6   // 12.5MHz/(2*6)=1.042MHz
#define   ADC_SHCLK  0x0   // Acq time=(1/1.042MHz)*(ADC_SHCLK+1)=0.96μs

void EPwm1(void);
void EPwm2(void);


interrupt void adc_isr(void);

Uint16 VADC;
Uint16 IADC;

float IADC1,VADC1,VNOW,INOW,Pmax;
//static float X[3],Y[2],slope;

void main(void)
{
   InitSysCtrl();    //初始化系統工作頻率
   InitGpio();       //初始化所有IO接腳
   InitEPwm1Gpio();  //設定GPIO 0 1 為PWM1A PWM1B 使用
   InitEPwm2Gpio();  //設定GPIO 0 1 為PWM1A PWM1B 使用

   //禁止所有中斷,並初始Pie控制暫存器,清除IER、IFR
   DINT;           //禁止 全局中斷
   InitPieCtrl();  //初始化中斷Pie控制

   IER = 0x0000;   //清除中斷致能暫存器
   IFR = 0x0000;   //清除中斷旗標暫存器

 //初始化中斷向量表,設定中斷向量表
   InitPieVectTable();    //初始化中斷向量表
   EALLOW;
   PieVectTable.ADCINT = &adc_isr;//將ADCINT設定給adc_isr副程式
   SysCtrlRegs.HISPCP.all = ADC_MODCLK; //HISPCLK=SYSCLKOUT/(2*HSPCP)
   EDIS;

   PieCtrlRegs.PIECTRL.bit.ENPIE = 1;          // 致能 PIE控制 區塊
   PieCtrlRegs.PIEIER1.bit.INTx6 = 1;          // 致能 INT1.6 ADC
   IER |= M_INT1;                              // 致能 CPU int1


   EINT;    //致能全局中斷
   ERTM;    //致能全時域中斷

   EPwm1();   //初始PWM1
   EPwm2();   //初始PWM2

   InitAdc();
   AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;  // HISPCLK/(2*ADC_CKPS)= 25.0MHz/(2*2) = 6.25MHz
   AdcRegs.ADCTRL1.bit.CPS = ADC_CPS;        // 6.25/(2*3)=1.042MHz
   AdcRegs.ADCTRL1.bit.ACQ_PS =ADC_SHCLK ;   // Acq time=(1/1.042MHz)*(ADC_SHCLK+1)=0.96u
   AdcRegs.ADCTRL3.bit.SMODE_SEL =0;       //0為順序採樣模式 1為同步採樣模式
   AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;         //級聯排序器模式
   AdcRegs.ADCTRL1.bit.CONT_RUN = 1;         // 連續運行模式
   AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1;
   AdcRegs.ADCMAXCONV.all = 0x0;          // 設置通道
   AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;    // Setup ADCINA0 as 1st SEQ1 conv.
   AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1; // Setup ADCINA1 as 2nd SEQ1 conv.
   AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;   // Enable SOCA from ePWM to start SEQ1
   AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;    //使能INT_SEQ1 中斷需求
   AdcRegs.ADCMAXCONV.bit.MAX_CONV1=7;      //設置 寄存器 CONV1 3個轉換通道


  for(;;)
  {
/*
        vref = (4095 * 2) / 3;
        Err = vref - VADC;

        //slope compensate
        if (slope < 40)
            slope = slope + 1;
        else
            slope = 0;

        //ty2 compensate
        X[2] = Err;
        Xterms = (0.464397 * X[2]+ 0.040386 * X[1]- 0.424011 * X[0])*3*10*4095;
        Yterms = 0.330487 * Y[1] + 0.669513 * Y[0];
        Y[1] = (Xterms + Yterms);
        Y[0] = Y[1];
        if (Y[1] >= 4095)
            Y[1] = 4095;
        if (Y[1] <= 0)
            Y[1] = 0;

        ty2 = Y[1] - slope;

        X[0] = X[1];
        X[1] = X[2];

        //PWM

        EPwm2Regs.AQCTLA.bit.PRD=AQ_SET;
        if (IADC > ty2)
        {
            EPwm2Regs.CMPA.half.CMPA=EPwm1Regs.TBCTR;
            EPwm2Regs.AQCTLA.bit.CAU=AQ_CLEAR;
        }
        else
        {
            EPwm2Regs.CMPA.half.CMPA = 260;
            EPwm2Regs.AQCTLA.bit.CAU=AQ_CLEAR;
        }
*/
  }
}


void EPwm1()
{
    EPwm1Regs.TBPRD = 3750;                         // TPWM=(TBPRD + 1) x TBCLK=1Mhz
    EPwm1Regs.TBPHS.half.TBPHS = 0x0000;           // Phase 為 0
    EPwm1Regs.TBCTR = 0x0000;                      // 清除 counter

    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;     // 設置為向上計數模式
    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // Disable phase loading
    EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;   // Clock ratio to SYSCLKOUT(150M)
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

    EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;    // 在計數器為零時讀新的CMP值
    EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

    EPwm1Regs.CMPA.half.CMPA = 1125;                // 設置比較暫存器,對應於50%佔空比
    //EPwm1Regs.CMPB = 1125;

    EPwm1Regs.AQCTLB.bit.CAU = AQ_SET;           // 設置 PWM1A 為 1
    EPwm1Regs.AQCTLB.bit.CAD = AQ_CLEAR;


    EPwm1Regs.ETSEL.bit.SOCAEN = 1;           // Enable SOC on A group
          EPwm1Regs.ETSEL.bit.SOCASEL = 2;          // Select SOC from TBCTR=TBPRD
          EPwm1Regs.ETPS.bit.SOCAPRD = 1;           // Generate pulse on every event


}


void EPwm2()
{
    EPwm2Regs.TBPRD = 7499;                        // 100kHz
    EPwm2Regs.TBPHS.half.TBPHS = 0x0000;           // Phase 為 0
    EPwm2Regs.TBCTR = 0x0000;                      // 清除 counter

    EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;     // 設置為向上數模式
    EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;            // Disable phase loading
    EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
    EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;   // Clock ratio to SYSCLKOUT(150M)
    EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;

    EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;    // 在計數器為零時讀新的CMP值
    EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

    EPwm2Regs.CMPA.half.CMPA = 5250;

    EPwm2Regs.AQCTLA.bit.PRD=AQ_SET;
    EPwm2Regs.AQCTLA.bit.CAU=AQ_CLEAR;



}


interrupt void  adc_isr(void)
{

  IADC = AdcRegs.ADCRESULT0 >>4;  //AdcRegs.ADCRESULT0是A0接收到的數值
  VADC = AdcRegs.ADCRESULT1 >>4;  //AdcRegs.ADCRESULT1是A1接收到的數值


  IADC1=((float)IADC*3/4095);
  VADC1=((float)VADC*3/4095);

  VNOW = VADC1*101;
  INOW = IADC1*12.195;
  Pmax = VNOW*INOW;

  AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;         // 重置 SEQ1
  AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;       // 重置 INT SEQ1 bit
  PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;   // Acknowledge interrupt to PIE
}