/*---------------------------------------------------------------
使用EPwm模块的SOC信号,触发ADC启动转换,ADC序列转换完成信号,启动DMA通道.
DMA完成整个缓冲区的数据转移后, 在通过串口发送至上位机,供用户程序处理数据.
***************************STS:UNTESTED*************************
-------------------------------------------------------------- */
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#define BUFFERSIZE 2048
#if (CPU_FRQ_150MHZ) // Default - 150 MHz SYSCLKOUT
#define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3) = 25.0 MHz
#endif
#if (CPU_FRQ_100MHZ)
#define ADC_MODCLK 0x2 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2) = 25.0 MHz
#endif
#pragma DATA_SECTION(DMAdata,"DMARAML4");
volatile Uint16 DMAdata[BUFFERSIZE];
volatile Uint16 *DMADest;
volatile Uint16 *DMASource;
void ePWMConfig();
void ADCConfig();
void DMAConfig();
interrupt void loacl_DINTCH1_ISR();
void Delay(Uint16 a);
void main(void)
{
InitSysCtrl();
EALLOW;
SysCtrlRegs.HISPCP.all=ADC_MODCLK;
EDIS;
DINT;
InitPieCtrl();
IER=0x0000;
IFR=0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.DINTCH1= &loacl_DINTCH1_ISR;
EDIS;
IER|=M_INT7;
PieCtrlRegs.PIEIER7.bit.INTx1=1;
PieCtrlRegs.PIECTRL.bit.ENPIE=1;
EINT;
ERTM;
ePWMConfig();
ADCConfig();
DMAConfig();
for(;;);
}
void ePWMConfig()
{
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;
EDIS;
EPwm2Regs.TBPRD=8000;
EPwm2Regs.TBCTR=0;
EPwm2Regs.TBCTL.bit.CTRMODE=TB_COUNT_UP;
EPwm2Regs.TBPHS.half.TBPHS=0;
EPwm2Regs.TBCTL.bit.PHSEN=TB_DISABLE;
EPwm2Regs.TBCTL.bit.SYNCOSEL=TB_SYNC_DISABLE;
EPwm2Regs.TBCTL.bit.PRDLD=TB_SHADOW;
EPwm2Regs.CMPA.half.CMPA=2000;
EPwm2Regs.CMPCTL.bit.SHDWAMODE=CC_SHADOW;
EPwm2Regs.CMPCTL.bit.SHDWBMODE=CC_SHADOW;
EPwm2Regs.CMPCTL.bit.LOADAMODE=CC_CTR_ZERO;
EPwm2Regs.CMPCTL.bit.LOADBMODE=CC_CTR_ZERO;
EPwm2Regs.AQCTLA.bit.CAU=AQ_SET;
EPwm2Regs.AQCTLA.bit.PRD=AQ_CLEAR;
EPwm2Regs.DBCTL.bit.OUT_MODE=DB_DISABLE; //产生两路互补无死区且a路占空比为75%的波形
EPwm2Regs.ETSEL.bit.SOCAEN=1;
EPwm2Regs.ETSEL.bit.SOCASEL=ET_CTRU_CMPA;
EPwm2Regs.ETPS.bit.SOCAPRD=ET_3RD; //3次比较事件触发ADC
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;
EDIS;
}
void ADCConfig()
{
AdcRegs.ADCTRL3.bit.ADCBGRFDN=0x3; //带间隙和参考电路上电
Delay(1000);
AdcRegs.ADCTRL3.bit.ADCPWDN=1; //其他电路(指模拟电路)上电
Delay(1000);
AdcRegs.ADCTRL1.bit.CPS=0;
AdcRegs.ADCTRL3.bit.ADCCLKPS=0x1; //ADCCLK=HSPCLK/[ADCCLKPS*(CPS+1)].设HSPCLK=25Mhz,则ADCCLK=12.5Mhz
AdcRegs.ADCTRL1.bit.ACQ_PS=0xf; //SOC脉宽=(ACQ_PS+1)*ADCCLK周期=1.28us
AdcRegs.ADCTRL3.bit.SMODE_SEL=0;
AdcRegs.ADCTRL1.bit.SEQ_CASC=0; //顺序双排序模式
AdcRegs.ADCMAXCONV.all=0x3;
AdcRegs.ADCCHSELSEQ1.bit.CONV00=0x0;
AdcRegs.ADCCHSELSEQ1.bit.CONV01=0x1;
AdcRegs.ADCCHSELSEQ1.bit.CONV02=0x2;
AdcRegs.ADCCHSELSEQ1.bit.CONV03=0x3; //转换4个通道,依次使用ADCINA0~3
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1; //允许ePWM_SCOA触发信号启动SEQ1
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; //允许SEQ1中断
}
void DMAConfig()
{
Uint16 i;
for (i=0; i<BUFFERSIZE; i++)
{
DMAdata[i] = 0;
}
DMASource = &AdcMirror.ADCRESULT0;
DMADest=DMAdata;
DMACH1AddrConfig(DMADest,DMASource);
DMACH1BurstConfig(3,1,10);
DMACH1TransferConfig(9,0,1);
DMACH1WrapConfig(0xffff,0,0xffff,0);
DMACH1ModeConfig(DMA_SEQ1INT,PERINT_ENABLE,ONESHOT_DISABLE,CONT_DISABLE,SYNC_DISABLE,SYNC_SRC,OVRFLOW_DISABLE,SIXTEEN_BIT,CHINT_END,CHINT_ENABLE);
//在SEQ1排序转换结束时,INT_SEQ1置位,此时触发进入DMA请求
StartDMACH1();
}
interrupt void loacl_DINTCH1_ISR()
{
PieCtrlRegs.PIEACK.all = PIEACK_GROUP7;
AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;
}
void Delay(Uint16 a)
{
for(;a>0;a--);
}
汇总先
最新推荐文章于 2024-06-19 15:10:25 发布