工具/软件:Code Composer Studio
您好,
我完成了一个SPWM程序,它可以成功运行。 但是现在我需要在TBCTR =0和TBCTR =TBPRD时启动ADC转换,所以我对我的代码做了一些更改,然后发生了一些奇怪的事情。 这是我的代码:
#include "DSP28x_Project.h"
#define PWM_HALFDUTY 187
UINT16正弦频率=25;
UINT16正弦振幅=250;//max=1023
UINT16 PWM_Frquence=2万;
Int SineTable[512]={0,9,18,27,3.6153万,63,6.2281万,90,991.08117126亿 ,1351.44153162亿 ,2402.49257266亿 ,1711.80188197亿 ,4904.9650351亿 ,4334.40447455亿 ,4624.69476483亿 ,5655.71577583亿 ,5165.23529535亿 ,6096.14619624亿 ,6296.34638643亿 ,3403.48356364亿 5885.94599604亿 6476.5265666亿 6936.96699702亿 7237.25727728亿 7387.38738739亿 7367.35734733亿 7197.17715712亿 6866.83679676亿 6386.34629624亿 5775.7156556亿 5034.96490483亿 4184.11403395亿 3243.16308299亿 2232.15206197亿 11.7108万 ,2742.83291299亿 ,2062.15223232亿 ,3723.80388395亿 ,3083.16324332亿 ,5415.4855456亿 ,4034.11418426亿 ,6796.83686689亿 ,126-18,7157.17719721亿 ,7347.35736737亿 ,126-96,6646.68672676亿 ,7387.38738737亿 ,126-18,7277.25723721亿 ,6996.96693689亿 ,124-96,7047.07710712亿 ,6566.52647643亿 ,124-96,7307.31732733亿 ,5995.94588583亿 ,7397.39739739亿 ,124-96,5295.2351651亿 ,124-96,7327.31730728亿 ,4474.40433426亿 ,124-96,7107.07704702亿 ,3563.48340332亿 ,124-9.6124万-96,6726.6866466亿 ,2572.49240232亿 ,1531.44135126亿 ,6196.14609604亿 ,124-96,,5545.48541535亿 ,124-96,,,124-96,4764.69462455亿 ,124-96,3883.80372364亿 ,,124-96,2912.83274266亿 ,,124-96,,1881.80171162亿 ,124-9.6124万-96,,,,,124-96,,126-、124-96,,,,126-、,,124-96,,126-、124-96,,,,
UINT16相位=0;
UINT16 PhaseIncrement;
#define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3) = 25.0 MHz
#define ADC_CKPS 0x2 // ADC模块时钟= HSPCLK/2*ADC_CKPS = 25.0MHz/(1*2)= 12.5MHz
#define ADC_SHCLK 0x1 //在ADC模块周期=2 ADC时钟中的S/H宽度
void EPwm1Config();
void EPwm2Config();
void UpdateFrq();
void AdcConfig();
中断无效epwm1_isr (void);
中断无效epwm2_isr(void);
中断无效ADC_ISR(void);
UINT16标志=1;
void main(){
InitSysCtrl();
伊尼特·格皮奥();
EALLOW;
SysCtrlRegs.HISPPCP.ALL = ADC_MODCLK; // HSPCLK = SYSCLKOUT/2*ADC_MODCLK
EDIS;
色调;
IER =0x0000;
IFR=0x0000;
InitPieCtrl();
InitPieVectorTable();
//Memcopy (&RamfuncsLoadStart,&RamfuncsLoadEnd,&RamfuncsRunStart);
InitAdc();
Initepwm1gpio();
Initepwm2gpio();
UpdateFrq();
EALLOW;
SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK=1;
SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK=1;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
PieVectorTable.EPWM1_INT=&epwm1_ISR;
PieVectorTable.EPWM2_INT=&epwm2_ISR;
PieVectorTable.ADCINT=&ADC_ISR;
PieCtrlRegs.PIEIER1.bit.INTx6=1;
PieCtrlRegs.PIEIER3.bit.INTx1=1;
PieCtrlRegs.PIEIER3.bit.INTx2=1;
IER=M_INT3;
EINT;
ERTM;
EDIS;
EPwm1Config();
EPwm2Config();
AdcConfig();
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
while (1){}
}
void EPwm1Config (void){
EPwm1Regs.TBPRD=376;
EPwm1Regs.TBPHS.Half.TBPHS=0x0000;
EPwm1Regs.TBCTR = 0x0000;
EPwm1Regs.TBCTL.bit.CTRMODE=TB_COUNT_UDOWN;
EPwm1Regs.TBCTL.bit.PHSEN=TB_DISABLE;
EPwm1Regs.TBCTL.bit.HSPCLKDIV=5;
EPwm1Regs.TBCTL.bit.CLKDIV=0;
EPwm1Regs.TBCTL.bit.PRDLD=TB_shadow;
EPwm1Regs.CMPCTL.bit.SHDWAMODE=CC_SHAME;
EPwm1Regs.CMPCTL.bit.SHDWBMODE=CC_SHADO;
EPwm1Regs.CMPCTL.bit.LOADAMODE=CC_CTR_ZE;
EPwm1Regs.CMPCTL.bit.LOADAMODE=CC_CTR_ZE;
EPwm1Regs.CMPA.Halle.CMPA=187;50 %
EPwm1Regs.CMPB=187;
EPwm1Regs.AQCTLA.bit.CAU=AQ_set;
EPwm1Regs.AQCTLA.bit.CAD=AQ_Clear;
EPwm1Regs.AQCTLB.bit.CAU=AQ_set;
EPwm1Regs.AQCTLB.bit.CAD=AQ_Clear;
EPwm1Regs.DBCTL.bit.out模式=DB_disable;
EPwm1Regs.DBCTL.bit.in_mode=dba_all;
EPwm1Regs.DBCTL.bit.POLSE=DB_ACTV_HIC;
EPwm1Regs.DBCTL.bit.out模式=DB_FULL启用;
EPwm1Regs.DBFED=7;
EPwm1Regs.DBRED=7;
EPwm1Regs.ETSEL.bit.inten=1;
EPwm1Regs.ETSEL.bit.INTSEL=ET_CTRD_CMPA;
EPwm1Regs.etps.bit.INTPRD=et_1st;
EPwm1Regs.ETSEL.bit.SOCAEN=1;
EPwm1Regs.ETSEL.bit.SOCASEL=ET_CTR_ZE;
EPwm1Regs.etps.bit.SOCAPRD=et_1st;
EPwm1Regs.ETSEL.bit.SOCBEN=1;
EPwm1Regs.ETSEL.bit.SOCBsel=et_ctr_prD;
EPwm1Regs.etps.bit.SOCBPRD=et_1st;
}
void EPwm2Config (void){
EPwm2Regs.TBPRD=376;
EPwm2Regs.TBPHS.Half.TBPHS=0x0000;
EPwm2Regs.TBCTR = 0x0000;
EPwm2Regs.TBCTL.bit.CTRMODE=TB_COUNT_UDOWN;
EPwm2Regs.TBCTL.bit.PHSEN=TB_DISABLE;
EPwm2Regs.TBCTL.bit.HSPCLKDIV=5;
EPwm2Regs.TBCTL.bit.CLKDIV=0;
EPwm2Regs.TBCTL.bit.PRDLD=TB_shadow;
EPwm2Regs.CMPCTL.bit.SHDWAMODE=CC_SHAME;
EPwm2Regs.CMPCTL.bit.SHDWBMODE=CC_SHADO;
EPwm2Regs.CMPCTL.bit.LOADAMODE=CC_CTR_ZE;
EPwm2Regs.CMPCTL.bit.LOADAMODE=CC_CTR_ZE;
EPwm2Regs.CMPA.Halle.CMPA=187;50 %
EPwm2Regs.CMPB=187;
EPwm2Regs.AQCTLA.bit.CAU=AQ_set;
EPwm2Regs.AQCTLA.bit.CAD=AQ_Clear;
EPwm2Regs.AQCTLB.bit.CAU=AQ_set;
EPwm2Regs.AQCTLB.bit.CAD=AQ_Clear;
EPwm2Regs.DBCTL.bit.out模式=DB_disable;
EPwm2Regs.DBCTL.bit.in_mode=dba_all;
EPwm2Regs.DBCTL.bit.POLSE=DB_ACTV_HIC;
EPwm2Regs.DBCTL.bit.out模式=DB_FULL启用;
EPwm2Regs.DBFED=7;
EPwm2Regs.DBRED=7;
EPwm2Regs.ETSEL.bit.inten=1;
EPwm2Regs.ETSEL.bit.INTSEL=ET_CTRD_CMPA;
EPwm2Regs.etps.bit.INTPRD=et_1st;
EPwm2Regs.ETSEL.bit.SOCAEN=0;
EPwm2Regs.ETSEL.bit.SOCBEN=0;
}
void AddConfig (void){
AdcRegs.ADCTRL1.bit.ACQ_PS=ADC_SHCLK; //Window width=2 ADC时钟
AdcRegs.ADCTRL1.bit.con_run=0; //start/stop模式
AdcRegs.ADCTRL1.bit.SEQ_CASC=1; //级联模式
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1; //启用中断SEQ1
AdcRegs.ADCTRL2.bit.ePWM_SOCA_SEQ1=1;
AdcRegs.ADCTRL2.bit.ePWM_SOCB_SEQ=1;
AdcRegs.ADCTRL3.bit.SMODE_SEL=1; //同步模式
AdcRegs.ADCMAXCONV.All=0x0011;//1 转换;SEQ1
AdcRegs.ADCCHSELSEQ1.bit.CONV00=0x00;//A0&B0 样本源
AdcRegs.ADCCHSELSEQ1.bit.CONV01=0x01; //A1&B1样本源
}
void UpdateFrq (void){
PhaseIncrement=(unsigned Long) Since_Frquences*6.5536万/PWM_Frquences;
}
中断无效epwm1_isr (void){
phase+= PhaseIncrement;
EPwm1Regs.CMPA.Half.CMPA=(long) SineTable[相位>7]*Sine_Amplitude/1023+PWM_HALFDUTY;
EPwm1Regs.ETCLR.bit.INT=1;
PieCtrlRegs.PIEACK/all=PIEACK_Group3;
}
中断void epwm2_isr(void){
phase+= PhaseIncrement;
EPwm2Regs.CMPA.Half.CMPA=(long) SineTable[相位>7]*Sine_Amplitude/1023+PWM_HALFDUTY;
EPwm2Regs.ETCLR.bit.INT=1;
PieCtrlRegs.PIEACK/all=PIEACK_Group3;
}
中断void ADC_ISR(void){
PieCtrlRegs.PIEACG.ALL = PIEACK_GROUP1;
AdcRegs.ADCST.Bit.INT_SEQ1_CLR=1;
AdcRegs.ADCTRL2.bit.RST_SEQ1=1;
Flag=EPwm1Regs.TBCTR;}
因为我需要在两个不同的场合开始转换,所以我将ADC设置为级联模式。 我已经检查过我的代码几次,从EPwm1Regs可以看到,在ETFLG寄存器中设置了SOCA和SOCB,但从未达到中断功能ADC_ISR。
此外,还设置了变量"flag",用于检查是否 已到达ADC_ISR。
如何解决此问题?
谢谢!
