TI中文支持网
TI专业的中文技术问题搜集分享网站

关于TMS320F28027 EPWM、比较器、模拟输入输出(AIOn)的几个问题?

Proteus8.0仿真TMS320F28027时遇到的几个问题,希望得到大家指导,

void main1(void)

 {

  /****************************************************************************  

*模拟引脚输出测试:   * Proteus仿真,AIO6引脚接2K上拉电阻时:  

 *   执行GpioDataRegs.AIODAT.bit.AIO6 = 1;输出只有100~200mv,  

 *   没接上拉电阻时输出更小22mV左右,执行上述语句为什么输出不是3.3V左右呢 ?  

 *   ****************************************************************************/

 InitSysCtrl();

 EALLOW;

 GpioCtrlRegs.AIOMUX1.bit.AIO6 = 0;//AIO6 enable

 GpioCtrlRegs.AIODIR.all = 0x1<<6;//output

 EDIS;

 for(;;)

 {  

 //GpioDataRegs.AIOSET.bit.AIO6 = 1;  

 GpioDataRegs.AIODAT.bit.AIO6 = 1;  

 DELAY_US(200);  

 //GpioDataRegs.AIOCLEAR.bit.AIO6 = 0;  

 GpioDataRegs.AIODAT.bit.AIO6 = 0;  

 DELAY_US(200);

 }

 }

 

void main2(void)

{

  /*******************************************************  

 * 模拟引脚输入测试:  

* AIO14引脚接一个接入电位器,从0V调到3.3V调整输入电压,  

 * 为什么GPIO38引脚输出没变化?  

*   ******************************************************/

 InitSysCtrl();

 EALLOW;

 GpioCtrlRegs.AIOMUX1.bit.AIO14 = 0;//AIO14 enable

 GpioCtrlRegs.AIODIR.bit.AIO14 = 0; //input

 GpioCtrlRegs.GPBMUX1.bit.GPIO38 = 0; //I/O  

GpioCtrlRegs.GPBDIR.bit.GPIO38 = 1; //output

 GpioCtrlRegs.GPBPUD.bit.GPIO38 = 0; //enable the internal pullup

 EDIS;

 for(;;)

 {  

 if(GpioDataRegs.AIODAT.bit.AIO14==1)

  {   

 GpioDataRegs.GPBDAT.bit.GPIO38 = 1;  

 }   

else   

{    

GpioDataRegs.GPBDAT.bit.GPIO38 = 0;  

 }

  }

 }

//================================================================================

void main3(void)

 {

 /**************************************************************************  

 * 比较器测试:  

* AIO2、AIO10配置为比较器的输入引脚,分别接一个接入电位器,分别调整两个引脚的  

 * 输入电压,在COMP1A > COMP1B 和 COMP1A<COMP1B情况下 GPIO38与COMP1OUT引脚输出没有变化  

 * 程序如下,问题在哪里呢?  

*   **************************************************************************/

 InitSysCtrl();

 EALLOW;

 GpioCtrlRegs.GPBPUD.bit.GPIO38 = 0; //enable the internal pullup  

GpioCtrlRegs.GPBMUX1.bit.GPIO38 = 0; //I/O  

GpioCtrlRegs.GPBDIR.bit.GPIO38 = 1; //output

 //GpioCtrlRegs.GPAPUD.bit.GPIO1 = 1;     // Disable pull-up for GPIO1 (CMP1OUT)  

//GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;   //output  

GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 3;    // Configure GPIO1 for CMP1OUT operation

 GpioCtrlRegs.AIOMUX1.bit.AIO2 = 3;    //AIO2 disabled — COMP1A

 GpioCtrlRegs.AIOMUX1.bit.AIO10 = 3;   //AIO10 disabled — COMP1B

 SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; //the ADC module is clocked  

AdcRegs.ADCCTL1.bit.ADCPWDN = 1;   //The analog circuitry inside the core is powered up

 AdcRegs.ADCCTL1.bit.ADCBGPWD = 1;   //Bandgap buffer's curcuitry inside core is powered up

 SysCtrlRegs.PCLKCR3.bit.COMP1ENCLK = 1;  

SysCtrlRegs.PCLKCR3.bit.COMP2ENCLK = 1;  

Comp1Regs.COMPCTL.bit.COMPDACEN  = 1;  //comparator/DAC logic is powered up

 Comp1Regs.COMPCTL.bit.COMPSOURCE = 1;  //inverting input connected to exteranl pin  

Comp1Regs.COMPCTL.bit.SYNCSEL = 0;    //asynchronous

 Comp1Regs.COMPCTL.bit.QUALSEL = 0;   //Synchronized value of comparator is passed through

 Comp1Regs.COMPCTL.bit.CMPINV = 1;   //Output of comparator is passed

 EDIS;

 for(;;)

  {  

 if(Comp1Regs.COMPSTS.bit.COMPSTS==1)  

 {   

 GpioDataRegs.GPBDAT.bit.GPIO38 = 1;

  }   

else  

 {    

GpioDataRegs.GPBDAT.bit.GPIO38 = 0;  

 }

  }

 }

 

//==========================================================

 unsigned int Duty=500;

 interrupt void EPwm1TimerIsr(void)

 {

 EPwm1Regs.CMPA.half.CMPA = Duty;

 EPwm1Regs.CMPB = Duty;

 if(++Duty==600){Duty = 1;}

 EPwm1Regs.ETCLR.bit.INT = 1;  

PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;

 }

void main(void) {

 /*************************************************************************  

 *  

 *  PWM互补输出测试程序:  

 *  试验输出了两路互补的信号,但是…  

*  执行EPwm1Regs.ETFRC.bit.INT = 1;可以进入中断服务程序 ,这说明中断使能位设置正确,  

 *  为什么注释掉该条语句后无法进入中断服务程序,程序如下,导致此问题的原因是什么呢?  

*  

***********************************************************************/

 InitSysCtrl();

 EALLOW;  

GpioCtrlRegs.GPBPUD.bit.GPIO38 = 0; //enable the internal pullup

 GpioCtrlRegs.GPBMUX1.bit.GPIO38 = 0; //I/O  

GpioCtrlRegs.GPBDIR.bit.GPIO38 = 1; //output  EDIS;

 EALLOW;  GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; //Congigure the GPIO1 pin as EPWM1B  

GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; //Congigure the GPIO0 pin AS EPWM1A  EDIS;

 DINT;

 InitPieCtrl();

 IER = 0x0000;  IFR = 0x0000;

 //InitPieVectTable();

 EALLOW;

 PieVectTable.EPWM1_INT = &EPwm1TimerIsr;

 PieCtrlRegs.PIECTRL.bit.ENPIE = 1;  

EDIS;

 

 EALLOW;  

SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;      // Stop all the TB clocks  EDIS;

 EALLOW;

 EPwm1Regs.TBPRD = 600; //Period TBCLK counts;  SYSCLKOUT=60MHZ

 EPwm1Regs.TBCTR = 0; //clear TB counter  

EPwm1Regs.TBCTL.bit.CTRMODE = 2;  //UP-DOWM-COUNTE MODE

 EPwm1Regs.TBCTL.bit.PHSEN = 0;   //phase loading disabled

 EPwm1Regs.TBCTL.bit.PRDLD = 0;   //loaded from its shadow register

 EPwm1Regs.TBCTL.bit.SYNCOSEL = 3;  //disable EPWMxSYNCO signal

 EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;  //TBCLK = SYSCLKOUT

 EPwm1Regs.TBCTL.bit.CLKDIV = 0; //1

 EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0;  //Shadow mode

 EPwm1Regs.CMPCTL.bit.SHDWBMODE = 0;

 EPwm1Regs.CMPCTL.bit.LOADAMODE = 0;  //load on CTR =ZERO  

EPwm1Regs.CMPCTL.bit.LOADBMODE = 0;

 EPwm1Regs.AQCTLA.bit.CAU = 2;  //force EPWMxA output high

 EPwm1Regs.AQCTLA.bit.CAD = 1;  //force EPWMxA output low

 EPwm1Regs.AQCTLB.bit.CBU = 1;  //force EPWMxB output low  

EPwm1Regs.AQCTLB.bit.CBD = 2;  //force EPWMxB output high  

EPwm1Regs.ETPS.bit.INTPRD = 1;  //generate an interrupt on the first event INTCNT =01(first event)  

EPwm1Regs.CMPA.half.CMPA = Duty;

 EPwm1Regs.CMPB = Duty;

 EPwm1Regs.ETCLR.bit.INT = 1; //clear EPWM1_INT flag

 EPwm1Regs.ETSEL.bit.INTSEL = 1; //Enable event time-base counter equal to zero

 EPwm1Regs.ETSEL.bit.INTEN = 1;  //Enable EPWM1_INT generation  EDIS;

 IER |= M_INT3;

 EALLOW;

 PieCtrlRegs.PIEIER3.bit.INTx1 = 1;

 EDIS;

 EINT;  

ERTM;

 EALLOW;

 SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;  //Start all the timers synced  EDIS;

 for(;;)

 {  

 DELAY_US(10);  

 //EPwm1Regs.ETFRC.bit.INT = 1;//can genarate a interrupt event, jump into ISR

 }

 }

连续遇到这几个问题,我产生了各种怀疑?

mangui zhang:

仿真可能不靠谱

1.确认GpioCtrlRegs.AIOMUX1.bit.AIO6 = 0;//AIO6 enable是GPIO模式还是特殊功能模式?

2.注释掉EPwm1Regs.ETFRC.bit.INT = 1;此句    应该是可以进入一次中断吧    此句应该是清除中断标志位   为下次进入做准备的

Proteus8.0仿真TMS320F28027时遇到的几个问题,希望得到大家指导,

void main1(void)

 {

  /****************************************************************************  

*模拟引脚输出测试:   * Proteus仿真,AIO6引脚接2K上拉电阻时:  

 *   执行GpioDataRegs.AIODAT.bit.AIO6 = 1;输出只有100~200mv,  

 *   没接上拉电阻时输出更小22mV左右,执行上述语句为什么输出不是3.3V左右呢 ?  

 *   ****************************************************************************/

 InitSysCtrl();

 EALLOW;

 GpioCtrlRegs.AIOMUX1.bit.AIO6 = 0;//AIO6 enable

 GpioCtrlRegs.AIODIR.all = 0x1<<6;//output

 EDIS;

 for(;;)

 {  

 //GpioDataRegs.AIOSET.bit.AIO6 = 1;  

 GpioDataRegs.AIODAT.bit.AIO6 = 1;  

 DELAY_US(200);  

 //GpioDataRegs.AIOCLEAR.bit.AIO6 = 0;  

 GpioDataRegs.AIODAT.bit.AIO6 = 0;  

 DELAY_US(200);

 }

 }

 

void main2(void)

{

  /*******************************************************  

 * 模拟引脚输入测试:  

* AIO14引脚接一个接入电位器,从0V调到3.3V调整输入电压,  

 * 为什么GPIO38引脚输出没变化?  

*   ******************************************************/

 InitSysCtrl();

 EALLOW;

 GpioCtrlRegs.AIOMUX1.bit.AIO14 = 0;//AIO14 enable

 GpioCtrlRegs.AIODIR.bit.AIO14 = 0; //input

 GpioCtrlRegs.GPBMUX1.bit.GPIO38 = 0; //I/O  

GpioCtrlRegs.GPBDIR.bit.GPIO38 = 1; //output

 GpioCtrlRegs.GPBPUD.bit.GPIO38 = 0; //enable the internal pullup

 EDIS;

 for(;;)

 {  

 if(GpioDataRegs.AIODAT.bit.AIO14==1)

  {   

 GpioDataRegs.GPBDAT.bit.GPIO38 = 1;  

 }   

else   

{    

GpioDataRegs.GPBDAT.bit.GPIO38 = 0;  

 }

  }

 }

//================================================================================

void main3(void)

 {

 /**************************************************************************  

 * 比较器测试:  

* AIO2、AIO10配置为比较器的输入引脚,分别接一个接入电位器,分别调整两个引脚的  

 * 输入电压,在COMP1A > COMP1B 和 COMP1A<COMP1B情况下 GPIO38与COMP1OUT引脚输出没有变化  

 * 程序如下,问题在哪里呢?  

*   **************************************************************************/

 InitSysCtrl();

 EALLOW;

 GpioCtrlRegs.GPBPUD.bit.GPIO38 = 0; //enable the internal pullup  

GpioCtrlRegs.GPBMUX1.bit.GPIO38 = 0; //I/O  

GpioCtrlRegs.GPBDIR.bit.GPIO38 = 1; //output

 //GpioCtrlRegs.GPAPUD.bit.GPIO1 = 1;     // Disable pull-up for GPIO1 (CMP1OUT)  

//GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;   //output  

GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 3;    // Configure GPIO1 for CMP1OUT operation

 GpioCtrlRegs.AIOMUX1.bit.AIO2 = 3;    //AIO2 disabled — COMP1A

 GpioCtrlRegs.AIOMUX1.bit.AIO10 = 3;   //AIO10 disabled — COMP1B

 SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; //the ADC module is clocked  

AdcRegs.ADCCTL1.bit.ADCPWDN = 1;   //The analog circuitry inside the core is powered up

 AdcRegs.ADCCTL1.bit.ADCBGPWD = 1;   //Bandgap buffer's curcuitry inside core is powered up

 SysCtrlRegs.PCLKCR3.bit.COMP1ENCLK = 1;  

SysCtrlRegs.PCLKCR3.bit.COMP2ENCLK = 1;  

Comp1Regs.COMPCTL.bit.COMPDACEN  = 1;  //comparator/DAC logic is powered up

 Comp1Regs.COMPCTL.bit.COMPSOURCE = 1;  //inverting input connected to exteranl pin  

Comp1Regs.COMPCTL.bit.SYNCSEL = 0;    //asynchronous

 Comp1Regs.COMPCTL.bit.QUALSEL = 0;   //Synchronized value of comparator is passed through

 Comp1Regs.COMPCTL.bit.CMPINV = 1;   //Output of comparator is passed

 EDIS;

 for(;;)

  {  

 if(Comp1Regs.COMPSTS.bit.COMPSTS==1)  

 {   

 GpioDataRegs.GPBDAT.bit.GPIO38 = 1;

  }   

else  

 {    

GpioDataRegs.GPBDAT.bit.GPIO38 = 0;  

 }

  }

 }

 

//==========================================================

 unsigned int Duty=500;

 interrupt void EPwm1TimerIsr(void)

 {

 EPwm1Regs.CMPA.half.CMPA = Duty;

 EPwm1Regs.CMPB = Duty;

 if(++Duty==600){Duty = 1;}

 EPwm1Regs.ETCLR.bit.INT = 1;  

PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;

 }

void main(void) {

 /*************************************************************************  

 *  

 *  PWM互补输出测试程序:  

 *  试验输出了两路互补的信号,但是…  

*  执行EPwm1Regs.ETFRC.bit.INT = 1;可以进入中断服务程序 ,这说明中断使能位设置正确,  

 *  为什么注释掉该条语句后无法进入中断服务程序,程序如下,导致此问题的原因是什么呢?  

*  

***********************************************************************/

 InitSysCtrl();

 EALLOW;  

GpioCtrlRegs.GPBPUD.bit.GPIO38 = 0; //enable the internal pullup

 GpioCtrlRegs.GPBMUX1.bit.GPIO38 = 0; //I/O  

GpioCtrlRegs.GPBDIR.bit.GPIO38 = 1; //output  EDIS;

 EALLOW;  GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; //Congigure the GPIO1 pin as EPWM1B  

GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; //Congigure the GPIO0 pin AS EPWM1A  EDIS;

 DINT;

 InitPieCtrl();

 IER = 0x0000;  IFR = 0x0000;

 //InitPieVectTable();

 EALLOW;

 PieVectTable.EPWM1_INT = &EPwm1TimerIsr;

 PieCtrlRegs.PIECTRL.bit.ENPIE = 1;  

EDIS;

 

 EALLOW;  

SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;      // Stop all the TB clocks  EDIS;

 EALLOW;

 EPwm1Regs.TBPRD = 600; //Period TBCLK counts;  SYSCLKOUT=60MHZ

 EPwm1Regs.TBCTR = 0; //clear TB counter  

EPwm1Regs.TBCTL.bit.CTRMODE = 2;  //UP-DOWM-COUNTE MODE

 EPwm1Regs.TBCTL.bit.PHSEN = 0;   //phase loading disabled

 EPwm1Regs.TBCTL.bit.PRDLD = 0;   //loaded from its shadow register

 EPwm1Regs.TBCTL.bit.SYNCOSEL = 3;  //disable EPWMxSYNCO signal

 EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;  //TBCLK = SYSCLKOUT

 EPwm1Regs.TBCTL.bit.CLKDIV = 0; //1

 EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0;  //Shadow mode

 EPwm1Regs.CMPCTL.bit.SHDWBMODE = 0;

 EPwm1Regs.CMPCTL.bit.LOADAMODE = 0;  //load on CTR =ZERO  

EPwm1Regs.CMPCTL.bit.LOADBMODE = 0;

 EPwm1Regs.AQCTLA.bit.CAU = 2;  //force EPWMxA output high

 EPwm1Regs.AQCTLA.bit.CAD = 1;  //force EPWMxA output low

 EPwm1Regs.AQCTLB.bit.CBU = 1;  //force EPWMxB output low  

EPwm1Regs.AQCTLB.bit.CBD = 2;  //force EPWMxB output high  

EPwm1Regs.ETPS.bit.INTPRD = 1;  //generate an interrupt on the first event INTCNT =01(first event)  

EPwm1Regs.CMPA.half.CMPA = Duty;

 EPwm1Regs.CMPB = Duty;

 EPwm1Regs.ETCLR.bit.INT = 1; //clear EPWM1_INT flag

 EPwm1Regs.ETSEL.bit.INTSEL = 1; //Enable event time-base counter equal to zero

 EPwm1Regs.ETSEL.bit.INTEN = 1;  //Enable EPWM1_INT generation  EDIS;

 IER |= M_INT3;

 EALLOW;

 PieCtrlRegs.PIEIER3.bit.INTx1 = 1;

 EDIS;

 EINT;  

ERTM;

 EALLOW;

 SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;  //Start all the timers synced  EDIS;

 for(;;)

 {  

 DELAY_US(10);  

 //EPwm1Regs.ETFRC.bit.INT = 1;//can genarate a interrupt event, jump into ISR

 }

 }

连续遇到这几个问题,我产生了各种怀疑?

bin yang5:

回复 mangui zhang:

"1.确认GpioCtrlRegs.AIOMUX1.bit.AIO6 = 0;//AIO6 enable是GPIO模式还是特殊功能模式?"::  使能引脚AIO6/ADCINA6作为模拟输入输出端口,然后在配置方向为输出。此引脚没有GPIO模式如下图所示:

对于“2.注释….准备的” ::那句是强制产生EPWM_INT中断事件,不是为下次进入做准备的,为下次准备的是中断服务子程序中“…CLR.INT=1; …..ACK3=1;"

Proteus8.0仿真TMS320F28027时遇到的几个问题,希望得到大家指导,

void main1(void)

 {

  /****************************************************************************  

*模拟引脚输出测试:   * Proteus仿真,AIO6引脚接2K上拉电阻时:  

 *   执行GpioDataRegs.AIODAT.bit.AIO6 = 1;输出只有100~200mv,  

 *   没接上拉电阻时输出更小22mV左右,执行上述语句为什么输出不是3.3V左右呢 ?  

 *   ****************************************************************************/

 InitSysCtrl();

 EALLOW;

 GpioCtrlRegs.AIOMUX1.bit.AIO6 = 0;//AIO6 enable

 GpioCtrlRegs.AIODIR.all = 0x1<<6;//output

 EDIS;

 for(;;)

 {  

 //GpioDataRegs.AIOSET.bit.AIO6 = 1;  

 GpioDataRegs.AIODAT.bit.AIO6 = 1;  

 DELAY_US(200);  

 //GpioDataRegs.AIOCLEAR.bit.AIO6 = 0;  

 GpioDataRegs.AIODAT.bit.AIO6 = 0;  

 DELAY_US(200);

 }

 }

 

void main2(void)

{

  /*******************************************************  

 * 模拟引脚输入测试:  

* AIO14引脚接一个接入电位器,从0V调到3.3V调整输入电压,  

 * 为什么GPIO38引脚输出没变化?  

*   ******************************************************/

 InitSysCtrl();

 EALLOW;

 GpioCtrlRegs.AIOMUX1.bit.AIO14 = 0;//AIO14 enable

 GpioCtrlRegs.AIODIR.bit.AIO14 = 0; //input

 GpioCtrlRegs.GPBMUX1.bit.GPIO38 = 0; //I/O  

GpioCtrlRegs.GPBDIR.bit.GPIO38 = 1; //output

 GpioCtrlRegs.GPBPUD.bit.GPIO38 = 0; //enable the internal pullup

 EDIS;

 for(;;)

 {  

 if(GpioDataRegs.AIODAT.bit.AIO14==1)

  {   

 GpioDataRegs.GPBDAT.bit.GPIO38 = 1;  

 }   

else   

{    

GpioDataRegs.GPBDAT.bit.GPIO38 = 0;  

 }

  }

 }

//================================================================================

void main3(void)

 {

 /**************************************************************************  

 * 比较器测试:  

* AIO2、AIO10配置为比较器的输入引脚,分别接一个接入电位器,分别调整两个引脚的  

 * 输入电压,在COMP1A > COMP1B 和 COMP1A<COMP1B情况下 GPIO38与COMP1OUT引脚输出没有变化  

 * 程序如下,问题在哪里呢?  

*   **************************************************************************/

 InitSysCtrl();

 EALLOW;

 GpioCtrlRegs.GPBPUD.bit.GPIO38 = 0; //enable the internal pullup  

GpioCtrlRegs.GPBMUX1.bit.GPIO38 = 0; //I/O  

GpioCtrlRegs.GPBDIR.bit.GPIO38 = 1; //output

 //GpioCtrlRegs.GPAPUD.bit.GPIO1 = 1;     // Disable pull-up for GPIO1 (CMP1OUT)  

//GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;   //output  

GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 3;    // Configure GPIO1 for CMP1OUT operation

 GpioCtrlRegs.AIOMUX1.bit.AIO2 = 3;    //AIO2 disabled — COMP1A

 GpioCtrlRegs.AIOMUX1.bit.AIO10 = 3;   //AIO10 disabled — COMP1B

 SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; //the ADC module is clocked  

AdcRegs.ADCCTL1.bit.ADCPWDN = 1;   //The analog circuitry inside the core is powered up

 AdcRegs.ADCCTL1.bit.ADCBGPWD = 1;   //Bandgap buffer's curcuitry inside core is powered up

 SysCtrlRegs.PCLKCR3.bit.COMP1ENCLK = 1;  

SysCtrlRegs.PCLKCR3.bit.COMP2ENCLK = 1;  

Comp1Regs.COMPCTL.bit.COMPDACEN  = 1;  //comparator/DAC logic is powered up

 Comp1Regs.COMPCTL.bit.COMPSOURCE = 1;  //inverting input connected to exteranl pin  

Comp1Regs.COMPCTL.bit.SYNCSEL = 0;    //asynchronous

 Comp1Regs.COMPCTL.bit.QUALSEL = 0;   //Synchronized value of comparator is passed through

 Comp1Regs.COMPCTL.bit.CMPINV = 1;   //Output of comparator is passed

 EDIS;

 for(;;)

  {  

 if(Comp1Regs.COMPSTS.bit.COMPSTS==1)  

 {   

 GpioDataRegs.GPBDAT.bit.GPIO38 = 1;

  }   

else  

 {    

GpioDataRegs.GPBDAT.bit.GPIO38 = 0;  

 }

  }

 }

 

//==========================================================

 unsigned int Duty=500;

 interrupt void EPwm1TimerIsr(void)

 {

 EPwm1Regs.CMPA.half.CMPA = Duty;

 EPwm1Regs.CMPB = Duty;

 if(++Duty==600){Duty = 1;}

 EPwm1Regs.ETCLR.bit.INT = 1;  

PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;

 }

void main(void) {

 /*************************************************************************  

 *  

 *  PWM互补输出测试程序:  

 *  试验输出了两路互补的信号,但是…  

*  执行EPwm1Regs.ETFRC.bit.INT = 1;可以进入中断服务程序 ,这说明中断使能位设置正确,  

 *  为什么注释掉该条语句后无法进入中断服务程序,程序如下,导致此问题的原因是什么呢?  

*  

***********************************************************************/

 InitSysCtrl();

 EALLOW;  

GpioCtrlRegs.GPBPUD.bit.GPIO38 = 0; //enable the internal pullup

 GpioCtrlRegs.GPBMUX1.bit.GPIO38 = 0; //I/O  

GpioCtrlRegs.GPBDIR.bit.GPIO38 = 1; //output  EDIS;

 EALLOW;  GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; //Congigure the GPIO1 pin as EPWM1B  

GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; //Congigure the GPIO0 pin AS EPWM1A  EDIS;

 DINT;

 InitPieCtrl();

 IER = 0x0000;  IFR = 0x0000;

 //InitPieVectTable();

 EALLOW;

 PieVectTable.EPWM1_INT = &EPwm1TimerIsr;

 PieCtrlRegs.PIECTRL.bit.ENPIE = 1;  

EDIS;

 

 EALLOW;  

SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;      // Stop all the TB clocks  EDIS;

 EALLOW;

 EPwm1Regs.TBPRD = 600; //Period TBCLK counts;  SYSCLKOUT=60MHZ

 EPwm1Regs.TBCTR = 0; //clear TB counter  

EPwm1Regs.TBCTL.bit.CTRMODE = 2;  //UP-DOWM-COUNTE MODE

 EPwm1Regs.TBCTL.bit.PHSEN = 0;   //phase loading disabled

 EPwm1Regs.TBCTL.bit.PRDLD = 0;   //loaded from its shadow register

 EPwm1Regs.TBCTL.bit.SYNCOSEL = 3;  //disable EPWMxSYNCO signal

 EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;  //TBCLK = SYSCLKOUT

 EPwm1Regs.TBCTL.bit.CLKDIV = 0; //1

 EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0;  //Shadow mode

 EPwm1Regs.CMPCTL.bit.SHDWBMODE = 0;

 EPwm1Regs.CMPCTL.bit.LOADAMODE = 0;  //load on CTR =ZERO  

EPwm1Regs.CMPCTL.bit.LOADBMODE = 0;

 EPwm1Regs.AQCTLA.bit.CAU = 2;  //force EPWMxA output high

 EPwm1Regs.AQCTLA.bit.CAD = 1;  //force EPWMxA output low

 EPwm1Regs.AQCTLB.bit.CBU = 1;  //force EPWMxB output low  

EPwm1Regs.AQCTLB.bit.CBD = 2;  //force EPWMxB output high  

EPwm1Regs.ETPS.bit.INTPRD = 1;  //generate an interrupt on the first event INTCNT =01(first event)  

EPwm1Regs.CMPA.half.CMPA = Duty;

 EPwm1Regs.CMPB = Duty;

 EPwm1Regs.ETCLR.bit.INT = 1; //clear EPWM1_INT flag

 EPwm1Regs.ETSEL.bit.INTSEL = 1; //Enable event time-base counter equal to zero

 EPwm1Regs.ETSEL.bit.INTEN = 1;  //Enable EPWM1_INT generation  EDIS;

 IER |= M_INT3;

 EALLOW;

 PieCtrlRegs.PIEIER3.bit.INTx1 = 1;

 EDIS;

 EINT;  

ERTM;

 EALLOW;

 SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;  //Start all the timers synced  EDIS;

 for(;;)

 {  

 DELAY_US(10);  

 //EPwm1Regs.ETFRC.bit.INT = 1;//can genarate a interrupt event, jump into ISR

 }

 }

连续遇到这几个问题,我产生了各种怀疑?

bin yang5:

回复 mangui zhang:

 EPwm1Regs.ETCLR.bit.INT = 1;  

PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;

为下次产生中断做准备的是上的两条。

谢谢你观看这种要看程序解决问题的贴,呵呵

Proteus8.0仿真TMS320F28027时遇到的几个问题,希望得到大家指导,

void main1(void)

 {

  /****************************************************************************  

*模拟引脚输出测试:   * Proteus仿真,AIO6引脚接2K上拉电阻时:  

 *   执行GpioDataRegs.AIODAT.bit.AIO6 = 1;输出只有100~200mv,  

 *   没接上拉电阻时输出更小22mV左右,执行上述语句为什么输出不是3.3V左右呢 ?  

 *   ****************************************************************************/

 InitSysCtrl();

 EALLOW;

 GpioCtrlRegs.AIOMUX1.bit.AIO6 = 0;//AIO6 enable

 GpioCtrlRegs.AIODIR.all = 0x1<<6;//output

 EDIS;

 for(;;)

 {  

 //GpioDataRegs.AIOSET.bit.AIO6 = 1;  

 GpioDataRegs.AIODAT.bit.AIO6 = 1;  

 DELAY_US(200);  

 //GpioDataRegs.AIOCLEAR.bit.AIO6 = 0;  

 GpioDataRegs.AIODAT.bit.AIO6 = 0;  

 DELAY_US(200);

 }

 }

 

void main2(void)

{

  /*******************************************************  

 * 模拟引脚输入测试:  

* AIO14引脚接一个接入电位器,从0V调到3.3V调整输入电压,  

 * 为什么GPIO38引脚输出没变化?  

*   ******************************************************/

 InitSysCtrl();

 EALLOW;

 GpioCtrlRegs.AIOMUX1.bit.AIO14 = 0;//AIO14 enable

 GpioCtrlRegs.AIODIR.bit.AIO14 = 0; //input

 GpioCtrlRegs.GPBMUX1.bit.GPIO38 = 0; //I/O  

GpioCtrlRegs.GPBDIR.bit.GPIO38 = 1; //output

 GpioCtrlRegs.GPBPUD.bit.GPIO38 = 0; //enable the internal pullup

 EDIS;

 for(;;)

 {  

 if(GpioDataRegs.AIODAT.bit.AIO14==1)

  {   

 GpioDataRegs.GPBDAT.bit.GPIO38 = 1;  

 }   

else   

{    

GpioDataRegs.GPBDAT.bit.GPIO38 = 0;  

 }

  }

 }

//================================================================================

void main3(void)

 {

 /**************************************************************************  

 * 比较器测试:  

* AIO2、AIO10配置为比较器的输入引脚,分别接一个接入电位器,分别调整两个引脚的  

 * 输入电压,在COMP1A > COMP1B 和 COMP1A<COMP1B情况下 GPIO38与COMP1OUT引脚输出没有变化  

 * 程序如下,问题在哪里呢?  

*   **************************************************************************/

 InitSysCtrl();

 EALLOW;

 GpioCtrlRegs.GPBPUD.bit.GPIO38 = 0; //enable the internal pullup  

GpioCtrlRegs.GPBMUX1.bit.GPIO38 = 0; //I/O  

GpioCtrlRegs.GPBDIR.bit.GPIO38 = 1; //output

 //GpioCtrlRegs.GPAPUD.bit.GPIO1 = 1;     // Disable pull-up for GPIO1 (CMP1OUT)  

//GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;   //output  

GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 3;    // Configure GPIO1 for CMP1OUT operation

 GpioCtrlRegs.AIOMUX1.bit.AIO2 = 3;    //AIO2 disabled — COMP1A

 GpioCtrlRegs.AIOMUX1.bit.AIO10 = 3;   //AIO10 disabled — COMP1B

 SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; //the ADC module is clocked  

AdcRegs.ADCCTL1.bit.ADCPWDN = 1;   //The analog circuitry inside the core is powered up

 AdcRegs.ADCCTL1.bit.ADCBGPWD = 1;   //Bandgap buffer's curcuitry inside core is powered up

 SysCtrlRegs.PCLKCR3.bit.COMP1ENCLK = 1;  

SysCtrlRegs.PCLKCR3.bit.COMP2ENCLK = 1;  

Comp1Regs.COMPCTL.bit.COMPDACEN  = 1;  //comparator/DAC logic is powered up

 Comp1Regs.COMPCTL.bit.COMPSOURCE = 1;  //inverting input connected to exteranl pin  

Comp1Regs.COMPCTL.bit.SYNCSEL = 0;    //asynchronous

 Comp1Regs.COMPCTL.bit.QUALSEL = 0;   //Synchronized value of comparator is passed through

 Comp1Regs.COMPCTL.bit.CMPINV = 1;   //Output of comparator is passed

 EDIS;

 for(;;)

  {  

 if(Comp1Regs.COMPSTS.bit.COMPSTS==1)  

 {   

 GpioDataRegs.GPBDAT.bit.GPIO38 = 1;

  }   

else  

 {    

GpioDataRegs.GPBDAT.bit.GPIO38 = 0;  

 }

  }

 }

 

//==========================================================

 unsigned int Duty=500;

 interrupt void EPwm1TimerIsr(void)

 {

 EPwm1Regs.CMPA.half.CMPA = Duty;

 EPwm1Regs.CMPB = Duty;

 if(++Duty==600){Duty = 1;}

 EPwm1Regs.ETCLR.bit.INT = 1;  

PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;

 }

void main(void) {

 /*************************************************************************  

 *  

 *  PWM互补输出测试程序:  

 *  试验输出了两路互补的信号,但是…  

*  执行EPwm1Regs.ETFRC.bit.INT = 1;可以进入中断服务程序 ,这说明中断使能位设置正确,  

 *  为什么注释掉该条语句后无法进入中断服务程序,程序如下,导致此问题的原因是什么呢?  

*  

***********************************************************************/

 InitSysCtrl();

 EALLOW;  

GpioCtrlRegs.GPBPUD.bit.GPIO38 = 0; //enable the internal pullup

 GpioCtrlRegs.GPBMUX1.bit.GPIO38 = 0; //I/O  

GpioCtrlRegs.GPBDIR.bit.GPIO38 = 1; //output  EDIS;

 EALLOW;  GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; //Congigure the GPIO1 pin as EPWM1B  

GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; //Congigure the GPIO0 pin AS EPWM1A  EDIS;

 DINT;

 InitPieCtrl();

 IER = 0x0000;  IFR = 0x0000;

 //InitPieVectTable();

 EALLOW;

 PieVectTable.EPWM1_INT = &EPwm1TimerIsr;

 PieCtrlRegs.PIECTRL.bit.ENPIE = 1;  

EDIS;

 

 EALLOW;  

SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;      // Stop all the TB clocks  EDIS;

 EALLOW;

 EPwm1Regs.TBPRD = 600; //Period TBCLK counts;  SYSCLKOUT=60MHZ

 EPwm1Regs.TBCTR = 0; //clear TB counter  

EPwm1Regs.TBCTL.bit.CTRMODE = 2;  //UP-DOWM-COUNTE MODE

 EPwm1Regs.TBCTL.bit.PHSEN = 0;   //phase loading disabled

 EPwm1Regs.TBCTL.bit.PRDLD = 0;   //loaded from its shadow register

 EPwm1Regs.TBCTL.bit.SYNCOSEL = 3;  //disable EPWMxSYNCO signal

 EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;  //TBCLK = SYSCLKOUT

 EPwm1Regs.TBCTL.bit.CLKDIV = 0; //1

 EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0;  //Shadow mode

 EPwm1Regs.CMPCTL.bit.SHDWBMODE = 0;

 EPwm1Regs.CMPCTL.bit.LOADAMODE = 0;  //load on CTR =ZERO  

EPwm1Regs.CMPCTL.bit.LOADBMODE = 0;

 EPwm1Regs.AQCTLA.bit.CAU = 2;  //force EPWMxA output high

 EPwm1Regs.AQCTLA.bit.CAD = 1;  //force EPWMxA output low

 EPwm1Regs.AQCTLB.bit.CBU = 1;  //force EPWMxB output low  

EPwm1Regs.AQCTLB.bit.CBD = 2;  //force EPWMxB output high  

EPwm1Regs.ETPS.bit.INTPRD = 1;  //generate an interrupt on the first event INTCNT =01(first event)  

EPwm1Regs.CMPA.half.CMPA = Duty;

 EPwm1Regs.CMPB = Duty;

 EPwm1Regs.ETCLR.bit.INT = 1; //clear EPWM1_INT flag

 EPwm1Regs.ETSEL.bit.INTSEL = 1; //Enable event time-base counter equal to zero

 EPwm1Regs.ETSEL.bit.INTEN = 1;  //Enable EPWM1_INT generation  EDIS;

 IER |= M_INT3;

 EALLOW;

 PieCtrlRegs.PIEIER3.bit.INTx1 = 1;

 EDIS;

 EINT;  

ERTM;

 EALLOW;

 SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;  //Start all the timers synced  EDIS;

 for(;;)

 {  

 DELAY_US(10);  

 //EPwm1Regs.ETFRC.bit.INT = 1;//can genarate a interrupt event, jump into ISR

 }

 }

连续遇到这几个问题,我产生了各种怀疑?

bin yang5:

回复 bin yang5:

很久没有看帖子了,去年在淘宝上买了块官方demo板,测试程序发现是仿真软件中的仿真模型有问题。

赞(0)
未经允许不得转载:TI中文支持网 » 关于TMS320F28027 EPWM、比较器、模拟输入输出(AIOn)的几个问题?
分享到: 更多 (0)