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.

[参考译文] CCS/TMS320F2.8335万:ePWMxSOCA和ePWMxSOCB不能导致ADC中断

Guru**** 2540720 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/615913/ccs-tms320f28335-epwmxsoca-and-epwmxsocb-cannot-lead-to-adc-interrupt

部件号:TMS320F2.8335万

工具/软件: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。

如何解决此问题?

谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Sherry:

    我知道您在IER中启用中断组3的位置,但您是否在某个位置启用了中断组1?

    谢谢!
    Whitney
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    我忘记启用IER中的中断组3。 现在没有人了。
    非常感谢!

    雪利酒
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Whitney

    顺便说一句,您能否告诉我,我可以在哪个参考指南中获得有关从闪存复制到RAM的重要功能的信息。 我搜索了这个问题,但没有找到实用的方法。

    提前感谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我知道《系统控制用户指南》讨论了闪存,但我认为它不涉及复制代码的细节。

    您是否看过FLASH_F2.8335万示例? 我知道它演示了如何将一些函数放入ramfuncs并执行memcpy()。

    Whitney

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的团队成员还建议使用此文档:

    www.ti.com/.../spra958 l .pdf

    Whitney
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    由于您的建议,我尝试了文档958 l 中提到的方法,它是有效的。 但我还有一个问题。

    导管说:
    "使用code_section pragma,可以将多个函数添加到同一个可链接项中
    章节。"
    我认为这意味着我可以在同一个可链接部分中放置多个函数(例如,ramfuncs,在F2.8335万.cmd中定义)。 但最多可以向同一节添加多少个函数? 有限制吗?

    此致,
    雪利酒
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    它取决于函数的大小。 如果空间不足,您应该可以编辑cmd文件以分配更多空间。

    C28x编译器-了解链接

    Whitney