本帖最后由 JKM99 于 2014-11-28 15:38 编辑
使用Proteus仿真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
//Configure the GPIO38 as general purpose I/O and enable the internal pullup
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
}
}
|