dsp28335的AD采样(单次模式、连续模式、DMA传输)

配置了三种模式,为单次模式,连续模式和DMA传输

单次模式是调用一次采集函数,在指定的某一个AD端口采集,用到的时候在去采样

连续模式是连续转换多个通道,采用级联模式,采用16路AD通道的值

DMA传输时AD采样的值直接通过DMA传输到内存中,不需要要CPU干预,持续采样,放到内存,需要用到数据的时候去读取相应的存储区即可。


1、单次模式

//单次模式AD初始化
void Ad_Onechanneltime_Init(void)
{
EALLOW;
SysCtrlRegs.HISPCP.all = ADC_MODCLK; // HSPCLK = SYSCLKOUT/ADC_MODCLK
EDIS;
InitAdc();         // For this example, init the ADC

// Specific ADC setup for this example:
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;  // Sequential mode: Sample rate   = 1/[(2+ACQ_PS)*ADC                                              //clock in ns]
                                                                                //  = 1/(3*40ns) =8.3MHz (for 150 MHz SYSCLKOUT)
                                       //    = 1/(3*80ns) =4.17MHz (for 100 MHz SYSCLKOUT)
   // If Simultaneous mode enabled: Sample rate = 1/[(3+ACQ_PS)*ADC clock in ns]
AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;        // 1  级联模式

AdcRegs.ADCTRL1.bit.CONT_RUN = 0;       //  启动停止模式
AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1;       // Enable Sequencer override feature

AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0;  // convert and store in 1 results registers
DELAY_US(100);
}


//单通道单次转换0~7对应A0~A7,8~15对应B0~B7
Uint16  Ad_Get(u8 n)
{
switch (n)
{
case 0:  AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;break;
case 1:  AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1;break;
case 2:  AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2;break;
case 3:  AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x3;break;
case 4:  AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x4;break;
case 5:  AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x5;break;
case 6:  AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x6;break;
case 7:  AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x7;break;
case 8:  AdcRegs.ADCCHSELSEQ3.bit.CONV08 = 0x8;break;
case 9:  AdcRegs.ADCCHSELSEQ3.bit.CONV09 = 0x9;break;
case 10: AdcRegs.ADCCHSELSEQ3.bit.CONV10 = 0x0A;break;
case 11: AdcRegs.ADCCHSELSEQ3.bit.CONV11 = 0x0B;break;
case 12: AdcRegs.ADCCHSELSEQ4.bit.CONV12 = 0x0C;break;
case 13: AdcRegs.ADCCHSELSEQ4.bit.CONV13 = 0x0D;break;
case 14: AdcRegs.ADCCHSELSEQ4.bit.CONV14 = 0x0E;break;
case 15: AdcRegs.ADCCHSELSEQ4.bit.CONV15 = 0x0F;break;
default :break;
}

//Start SEQ1
AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;
while(AdcRegs.ADCST.bit.INT_SEQ1 == 0);
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;

switch (n)
{
case 0: return ( (AdcRegs.ADCRESULT0)>>4);break;
         case 1: return ( (AdcRegs.ADCRESULT1)>>4);break;
         case 2: return ( (AdcRegs.ADCRESULT2)>>4);break;
case 3: return ( (AdcRegs.ADCRESULT3)>>4);break;
         case 4:  return ( (AdcRegs.ADCRESULT4)>>4);break;
case 5:  return ( (AdcRegs.ADCRESULT5)>>4);break;
case 6:  return ( (AdcRegs.ADCRESULT6)>>4);break;
case 7:  return ( (AdcRegs.ADCRESULT7)>>4);break;
case 8:  return ( (AdcRegs.ADCRESULT8)>>4);break;
case 9:  return ( (AdcRegs.ADCRESULT9)>>4);break;
case 10: return ( (AdcRegs.ADCRESULT10)>>4);break;
case 11: return ( (AdcRegs.ADCRESULT11)>>4);break;
case 12: return ( (AdcRegs.ADCRESULT12)>>4);break;
case 13: return ( (AdcRegs.ADCRESULT13)>>4);break;
case 14: return ( (AdcRegs.ADCRESULT14)>>4);break;
case 15: return ( (AdcRegs.ADCRESULT15)>>4);break;
default: break;
}
return 0;
}



2、级联顺序转换

//级联顺序转换
void Ad_Contrun_Init(void)
{
EALLOW;
       SysCtrlRegs.HISPCP.all = ADC_MODCLK; // HSPCLK = SYSCLKOUT/ADC_MODCLK
EDIS;
InitAdc();         // For this example, init the ADC
// Specific ADC setup for this example:
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;   // Sequential mode: Sample rate   = 1/[(2+ACQ_PS)*ADC  //clock in ns]
                 // If Simultaneous mode enabled: Sample rate = 1/[(3+ACQ_PS)*ADC //clock in ns]
AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;         // 1  级联模式
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0x1; //允许向CPU发出中断请求
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 0x1;
AdcRegs.ADCTRL1.bit.CONT_RUN = 1;         // 连续模式
AdcRegs.ADCTRL3.bit.SMODE_SEL= 0;         // 顺序采样
AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1;         // Enable Sequencer override feature
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0xF;   // 要转换的通道数
AdcRegs.ADCCHSELSEQ1.all = 0x3210;      // Initialize all ADC channel
AdcRegs.ADCCHSELSEQ2.all = 0x7654;      //每个通道对应相应的结果寄存器
AdcRegs.ADCCHSELSEQ3.all = 0xBA98;
AdcRegs.ADCCHSELSEQ4.all = 0xFEDC;

AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;
DELAY_US(100);
}

//级联顺序转换,根据初始化的通道数可以改变相应要获取的结果寄存器
void Ad_Contrun_Get(Uint16 *value)
{
    value[0] = ( (AdcRegs.ADCRESULT0)>>4);
    value[1] = ( (AdcRegs.ADCRESULT1)>>4);
    value[2] = ( (AdcRegs.ADCRESULT2)>>4);
    value[3] = ( (AdcRegs.ADCRESULT3)>>4);
    value[4] = ( (AdcRegs.ADCRESULT4)>>4);
    value[5] = ( (AdcRegs.ADCRESULT5)>>4);
    value[6] = ( (AdcRegs.ADCRESULT6)>>4);
    value[7] = ( (AdcRegs.ADCRESULT7)>>4);
    value[8] = ( (AdcRegs.ADCRESULT8)>>4);
    value[9] = ( (AdcRegs.ADCRESULT9)>>4);
    value[10] = ( (AdcRegs.ADCRESULT10)>>4);
    value[11] = ( (AdcRegs.ADCRESULT11)>>4);
    value[12] = ( (AdcRegs.ADCRESULT12)>>4);
    value[13] = ( (AdcRegs.ADCRESULT13)>>4);
    value[14] = ( (AdcRegs.ADCRESULT14)>>4);
    value[15] = ( (AdcRegs.ADCRESULT15)>>4);
}


main函数中调用

Uint16 ad[16]={0};


...

...

Ad_Contrun_Init(); //AD连续顺序转换

while(1)

{

....

    Ad_Contrun_Get(ad);   // 读取AD值

....

.....

..

}


3、DMA传输(函数基本都是TI的库文件中的,配置参数即可)

 volatile Uint16 DMABuf1[16];

 volatile Uint16 *DMADest;
 volatile Uint16 *DMASource;


main函数中要设置的东西

    DMAInitialize();
    for (i=0; i<DMA_BUF_SIZE; i++)    // Clear Table
    {
       DMABuf1[i] = 0;
    }
    DMADest   = &DMABuf1[0];              //指定目标buf数组首地址
    DMASource = &AdcMirror.ADCRESULT0;    //指定
    DMACH1AddrConfig(DMADest,DMASource);
    DMACH1BurstConfig(1,1,1);
    DMACH1TransferConfig(7,1,1);
    DMACH1WrapConfig(0xffff,0,0xffff,0);
               DMACH1ModeConfig(DMA_SEQ1INT,PERINT_ENABLE,ONESHOT_DISABLE,CONT_ENABLE,SYNC_DISABLE,     SYNC_SRC,OVRFLOW_DISABLE,SIXTEEN_BIT,CHINT_END,CHINT_ENABLE);
    StartDMACH1();

当然首先AD要配置为连续采样模式,然后就可以直接去读DMABuf1数组的值了





  • 9
    点赞
  • 120
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
DSP28335是德州仪器公司(Texas Instruments)生产的一种数字信号处理器,具有高性能、易于编程和低功耗等特点。在DSP28335中,可以通过ADC(Analog-to-Digital Converter)模块进行模拟信号采样ADC模块可以将模拟信号转换为数字信号,以便进行数字信号处理。DSP28335ADC模块具有以下特点: 1. 采样速率高:最大采样速率为1.5 MSPS,可以满足高速采样的需求。 2. 高精度:ADC模块支持12位精度,可以实现高精度的模拟信号采样。 3. 多通道:DSP28335ADC模块支持8个模拟输入通道,可以同时采样多个模拟信号。 4. 中断触发:ADC模块可以通过中断方式触发采样,可以降低CPU的负载。 在DSP28335中,可以通过编程配置ADC模块的参数,包括采样速率、采样精度、通道选择等。下面是一个简单的ADC采样程序示例: ``` #include "DSP2833x_Device.h" #include "DSP2833x_Examples.h" #define ADC_BUF_LEN 16 Uint16 AdcBuf[ADC_BUF_LEN]; void InitAdc(void) { // ADC模块初始化代码 EALLOW; AdcRegs.ADCCTL1.all = 0x00; AdcRegs.ADCCTL2.all = 0x00; AdcRegs.ADCCTL2.bit.CLKDIV2EN = 1; AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 1; AdcRegs.ADCCTL2.bit.ADCBGRFDN = 0x03; AdcRegs.ADCCTL2.bit.ADCREFSEL = 0x01; AdcRegs.ADCCTL2.bit.ADCRESSEL = 0x02; AdcRegs.ADCCTL1.bit.ADCPWDN = 1; AdcRegs.ADCSOC0CTL.all = 0x00; AdcRegs.ADCSOC0CTL.bit.CHSEL = 0x00; AdcRegs.ADCSOC0CTL.bit.ACQPS = 0x06; AdcRegs.ADCINTSEL1N2.all = 0x00; AdcRegs.ADCINTSEL1N2.bit.INT1SEL = 0x00; AdcRegs.ADCINTSEL1N2.bit.INT1E = 1; AdcRegs.ADCINTFLGCLR.all = 0xFFFF; EDIS; } interrupt void AdcIsr(void) { // ADC采样中断服务程序代码 AdcBuf[i++] = AdcRegs.ADCRESULT0; if (i >= ADC_BUF_LEN) { i = 0; // 数据处理代码 } AdcRegs.ADCINTFLGCLR.all = 0x01; PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; } void main(void) { InitSysCtrl(); InitPieCtrl(); InitAdc(); EALLOW; PieVectTable.ADCINT1 = &AdcIsr; EDIS; PieCtrlRegs.PIEIER1.bit.INTx1 = 1; IER |= M_INT1; InitPieVectTable(); EnableInterrupts(); while (1) { // 主循环代码 } } ``` 在上述程序中,首先调用InitAdc函数进行ADC模块的初始化,然后在AdcIsr函数中处理ADC采样中断,并将采样结果存储到AdcBuf数组中。程序通过中断方式触发ADC采样,并在采样完成后进行数据处理。在主循环中,可以进行其他的操作。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值