ADC

/*-----------------------------------------------------
功能:利用CPU定时器中断进行AD转换,并串口发送
-----------------------------------------------------*/
#include"DSP281x_Device.h"
#include "DSP281x_Examples.h"


#define ADC_MODCLK 0X3
#define ADC_CKPS 0X1
#define ADC_SHCLK 0Xf

Uint16 ReceivedChar;
interrupt void cpu_timer0_isr();
void Delay();
void Scib_init();
void Scib_xmit(Uint16 a);
void Inadc_init();
void IN_ADCheck();

void main(void)
{
    InitSysCtrl();

    EALLOW;
    SysCtrlRegs.HISPCP.all=ADC_MODCLK;
    EDIS;

    DINT;           //禁止和清除所有CPU中断向量表
    InitPieCtrl();  //初始化PIE控制器
    IER=0x0000;
    IFR=0x0000;
    InitPieVectTable(); //初始化中断向量表

    EALLOW;
    PieVectTable.TINT0=&cpu_timer0_isr;     //设置中断函数
    EDIS;

    InitCpuTimers();
    ConfigCpuTimer(&CpuTimer0,100,1000);
    StartCpuTimer0();

    IER|=M_INT1;
    PieCtrlRegs.PIEIER1.bit.INTx7=1;            //开放cpuINT1.7,对应到连接外设ADC.
    EINT;
    ERTM;

    Inadc_init();
    Scib_init();
    EALLOW;
    GpioMuxRegs.GPGMUX.all|=0x0030;         //使能SCIB口
    EDIS;

    for(;;);

}

/*************定时中断函数*******************/

interrupt void cpu_timer0_isr()
{
    IN_ADCheck();
    PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;       //允许继续响应中断

}

void Delay()
{
    Uint16 i;
    for(i=0;i<0xffff;i++)
    {
        asm("NOP");
    }
}

/*************串口初始化函数******************/

void Scib_init()
{
    ScibRegs.SCIFFTX.all=0xe040;        //使能FIFO,允许发送,清除TXFFINT,禁止TX FIFO中断
    ScibRegs.SCIFFRX.all=0x2021;        //允许接收,清除RXFFINT,使能RX FIFO中断(1级)
    ScibRegs.SCIFFTX.all=0x0000;        //禁止波特率检验

    ScibRegs.SCICCR.all=0x0007;         //1个停止位,8位数据位,无奇偶校验,空闲线模式
    ScibRegs.SCICTL1.all=0x0003;
    ScibRegs.SCICTL2.all=0x0003;        //SCI发送.接收使能和各中断使能
    ScibRegs.SCIHBAUD=0x0001;
    ScibRegs.SCILBAUD=0x00e7;           //波特率9600bps

    ScibRegs.SCICTL1.all=0x0023;        //这句一直不明白什么意思

}

/**********串口发送函数**************/

void Scib_xmit(Uint16 a)
{
    ScibRegs.SCITXBUF=(a&0xff);
    while(ScibRegs.SCICTL2.bit.TXRDY!=1);       //写a进SCI TXBUF,当TXRDY=0时,发送寄存器满
    while(SciaRegs.SCICTL2.bit.TXEMPTY!=1);     //当发送寄存器和移位寄存器都被装入数据,准备发送数据

}

/**************AD初始化函数*******************/

void Inadc_init()
{
    AdcRegs.ADCTRL3.bit.ADCBGRFDN=0x3;          //带间隙和参考电路上电
    Delay();
    AdcRegs.ADCTRL3.bit.ADCPWDN=1;              //其他电路(指模拟电路)上电
    Delay();

    AdcRegs.ADCTRL1.bit.ACQ_PS=ADC_SHCLK;       //SOC脉宽为ADC_SHCLK+1;
    AdcRegs.ADCTRL3.bit.SMODE_SEL=1;            //同步采样
    AdcRegs.ADCTRL1.bit.SEQ_CASC=1;             //级联模式

    AdcRegs.ADCTRL1.bit.CPS=1;
    AdcRegs.ADCTRL3.bit.ADCCLKPS=ADC_CKPS;      //ADCCLKPS和CPS共同决定ADCCLK.具体见表格和流程图

    AdcRegs.ADCMAXCONV.all=0x0007;
    AdcRegs.ADCCHSELSEQ1.bit.CONV00=0x0;            //A0B0作为转换通道
    AdcRegs.ADCCHSELSEQ1.bit.CONV01=0x1;
    AdcRegs.ADCCHSELSEQ1.bit.CONV02=0x2;
    AdcRegs.ADCCHSELSEQ1.bit.CONV03=0x3;
    AdcRegs.ADCCHSELSEQ2.bit.CONV04=0x4;
    AdcRegs.ADCCHSELSEQ2.bit.CONV05=0x5;
    AdcRegs.ADCCHSELSEQ2.bit.CONV06=0x6;
    AdcRegs.ADCCHSELSEQ2.bit.CONV07=0x7;
    AdcRegs.ADCTRL1.bit.CONT_RUN=1;

}

/****************读取AD值,并且将数据发送至串口*******************/

void IN_ADCheck()
{
    AdcRegs.ADCTRL2.all=0x2000;         //软件触发
    while(AdcRegs.ADCST.bit.INT_SEQ1==0);       //等待进入中断,表示每个SEQ1排序转换结束。
                                                    //SEQ1使用的是MAX CONVn的后三位,本例为7,同步级联为8对
    Delay();
    AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;           //清除中断标志位

/*********以上为16路AD数据转换完成************/

    ReceivedChar=(AdcRegs.ADCRESULT0>>4);               //结果数据缓冲器存储的转换数据为左对齐,故需要右移4位
    Scib_xmit(ReceivedChar&0xff);
    ReceivedChar=(AdcRegs.ADCRESULT1>>4);
    Scib_xmit(ReceivedChar&0xff);
    ReceivedChar=(AdcRegs.ADCRESULT2>>4);
    Scib_xmit(ReceivedChar&0xff);
    ReceivedChar=(AdcRegs.ADCRESULT3>>4);
    Scib_xmit(ReceivedChar&0xff);
    ReceivedChar=(AdcRegs.ADCRESULT4>>4);
    Scib_xmit(ReceivedChar&0xff);
    ReceivedChar=(AdcRegs.ADCRESULT5>>4);
    Scib_xmit(ReceivedChar&0xff);
    ReceivedChar=(AdcRegs.ADCRESULT6>>4);
    Scib_xmit(ReceivedChar&0xff);
    ReceivedChar=(AdcRegs.ADCRESULT7>>4);
    Scib_xmit(ReceivedChar&0xff);
    ReceivedChar=(AdcRegs.ADCRESULT8>>4);
    Scib_xmit(ReceivedChar&0xff);
    ReceivedChar=(AdcRegs.ADCRESULT9>>4);
    Scib_xmit(ReceivedChar&0xff);
    ReceivedChar=(AdcRegs.ADCRESULT10>>4);
    Scib_xmit(ReceivedChar&0xff);
    ReceivedChar=(AdcRegs.ADCRESULT11>>4);
    Scib_xmit(ReceivedChar&0xff);
    ReceivedChar=(AdcRegs.ADCRESULT12>>4);
    Scib_xmit(ReceivedChar&0xff);
    ReceivedChar=(AdcRegs.ADCRESULT13>>4);
    Scib_xmit(ReceivedChar&0xff);
    ReceivedChar=(AdcRegs.ADCRESULT14>>4);
    Scib_xmit(ReceivedChar&0xff);
    ReceivedChar=(AdcRegs.ADCRESULT15>>4);
    Scib_xmit(ReceivedChar&0xff);


    //猜想:以上用for语句
}
  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值