試想設置兩個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
}