汇总先

/*---------------------------------------------------------------
使用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--);

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值