tianyaxtutianya 发表于 2014-11-25 11:01:02

DSP28335的ADC外部基准初始化程序

DSP28335的ADC外部基准初始化程序谁有,我按照数据手册上配置总是不对,哪位高手弄过的,给个初始化配置程序给我参考下,本人感激不尽!!!

tianyaxtutianya 发表于 2014-11-25 11:03:52

以下是我的ADC内部基准配置方法,哪位高手指点下,外部基准如何配置


/************************************************************************
**函数名称:void AdcModeSet(void)
**函数功能:ADC功能设置,内部基准
**输入参数:无
**返回参数:无
************************************************************************/
void AdcModeSet(void)
{
   InitAdc();      // For this example, init the ADC
   
   //设置ADC时钟
   AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;
   AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;
   
   AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;         //采用级联方式
   AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0x1;   //使能INT FLAG SEQ1的中断请求
   AdcRegs.ADCTRL2.bit.RST_SEQ1 = 0x01;      //复位SEQ1为初始状态
   
   AdcRegs.ADCREFSEL.bit.REF_SEL = 0x00;       //设置为外部基准电压
   
   AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;      //选择采样通道
   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.ADCCHSELSEQ3.bit.CONV08 = 0x8;
   //AdcRegs.ADCCHSELSEQ3.bit.CONV09 = 0x9;
   //AdcRegs.ADCCHSELSEQ3.bit.CONV10 = 0xA;
   //AdcRegs.ADCCHSELSEQ3.bit.CONV11 = 0xB;
   //AdcRegs.ADCCHSELSEQ4.bit.CONV12 = 0xC;
   //AdcRegs.ADCCHSELSEQ4.bit.CONV13 = 0xD;
   //AdcRegs.ADCCHSELSEQ4.bit.CONV14 = 0xE;
   //AdcRegs.ADCCHSELSEQ4.bit.CONV15 = 0xF;
   
   AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 3;   // Set up ADC to perform 4 conversions for every SOC
   
   
}

lljyes 发表于 2014-11-25 11:33:26

在DSP2833x_Adc里面的,供参考:

          EALLOW;
                SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;
                ADC_cal();
                EDIS;

    AdcRegs.ADCREFSEL.bit.REF_SEL = 0x1;       // 选择外部参考电压2.048
//    AdcRegs.ADCREFSEL.bit.REF_SEL = 0x0;    // 选择内部参考电压
    AdcRegs.ADCTRL3.all = 0x00E0;                  // Power up bandgap/reference/ADC circuits
    DELAY_US(ADC_usDELAY);                        // Delay before converting ADC channels

steaven2000 发表于 2014-11-25 11:36:35

找TI的example,不要每次都为这些最基本的东西烦恼了,看你弄DSP也有一段时间了。

embeddev_1 发表于 2014-11-25 11:39:42

楼主请问下28335 这些寄存器定义有没有一个专门的文档介绍,类似design guide,我也有个板子,不过它里面都是一个模块一个模块单独的文档{:biggrin:}

tianyaxtutianya 发表于 2014-11-25 14:58:30

embeddev_1 发表于 2014-11-25 11:39
楼主请问下28335 这些寄存器定义有没有一个专门的文档介绍,类似design guide,我也有个板子,不过它里面都 ...

都是分模块的寄存器吧,没有所有寄存器合到一起的

tianyaxtutianya 发表于 2014-11-25 16:47:56

steaven2000 发表于 2014-11-25 11:36
找TI的example,不要每次都为这些最基本的东西烦恼了,看你弄DSP也有一段时间了。 ...

楼上说的有道理,TI的例子我也看过了,他就只有设置为内部基准的例子,没有看到外部基准的程序例子,楼上那里是否有,有的传一个给我参考下,万分感谢

EMC菜鸟 发表于 2014-11-25 16:50:36

楼主用 28335 是学习,还是坐产品呀?我看楼主研究好长时间了么 .......

tianyaxtutianya 发表于 2014-11-26 14:48:36

lljyes 发表于 2014-11-25 11:33
在DSP2833x_Adc里面的,供参考:

          EALLOW;


按照楼上的方法去试了,还是不行,AD转换出来的结果还是按照内部基准设置的,是不是还有什么寄存器没配置好?

lljyes 发表于 2014-11-26 16:57:55

可以仿真运行,查看外部基准的设定是否成功。

tianyaxtutianya 发表于 2014-11-26 17:08:54

lljyes 发表于 2014-11-26 16:57
可以仿真运行,查看外部基准的设定是否成功。

仿真试过了,虽然设置了AdcRegs.ADCREFSEL.bit.REF_SEL = 0x1;       // 选择外部参考电压2.048

但是从ADC采样的数据来看,还是以3V为基准得到的ADC值

tianyaxtutianya 发表于 2014-11-26 17:11:01

lljyes 发表于 2014-11-26 16:57
可以仿真运行,查看外部基准的设定是否成功。

这是我配置为外部基准的初始化函数,大侠帮我看看,是不是还是哪里设置没设置好

void AdcModeSet(void)
{
   InitAdc();      // For this example, init the ADC
   
   //设置ADC时钟
   AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;
   AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;
   
   AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;         //采用级联方式
   AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0x1;   //使能INT FLAG SEQ1的中断请求
   AdcRegs.ADCTRL2.bit.RST_SEQ1 = 0x01;      //复位SEQ1为初始状态

   //AdcRegs.ADCREFSEL.bit.REF_SEL = 0x00;       //设置为内部基准电压
   AdcRegs.ADCREFSEL.bit.REF_SEL = 0x1;       // 选择外部参考电压2.048
   
   AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;      //选择采样通道
   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.ADCCHSELSEQ3.bit.CONV08 = 0x8;
   //AdcRegs.ADCCHSELSEQ3.bit.CONV09 = 0x9;
   //AdcRegs.ADCCHSELSEQ3.bit.CONV10 = 0xA;
   //AdcRegs.ADCCHSELSEQ3.bit.CONV11 = 0xB;
   //AdcRegs.ADCCHSELSEQ4.bit.CONV12 = 0xC;
   //AdcRegs.ADCCHSELSEQ4.bit.CONV13 = 0xD;
   //AdcRegs.ADCCHSELSEQ4.bit.CONV14 = 0xE;
   //AdcRegs.ADCCHSELSEQ4.bit.CONV15 = 0xF;
   
   AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 3;   // Set up ADC to perform 4 conversions for every SOC

   ChooseSampleXn(MA_SAMPLE_X1);         //选择MA采样通道
   //ChooseSampleXn(MA_SAMPLE_X0);         //选择MA采样通道
   
   //AdcRegs.ADCTRL3.all = 0x00E0;       // Power up bandgap/reference/ADC circuits
   //delay_us(100);                      // Delay before converting ADC channels
   
}

lljyes 发表于 2014-11-26 18:04:40

我也是菜鸟,你可以仿真看一下,外部基准的设定是否设定成功。例程中选了基准后有延时的,你这里设定后没有延时,不知有没有关系。

tianyaxtutianya 发表于 2014-12-2 18:44:38

lljyes 发表于 2014-11-26 18:04
我也是菜鸟,你可以仿真看一下,外部基准的设定是否设定成功。例程中选了基准后有延时的,你这里设定后没有 ...

测试过了,加入延时也还是不行

tianyaxtutianya 发表于 2014-12-8 16:10:07

tianyaxtutianya 发表于 2014-11-26 17:11
这是我配置为外部基准的初始化函数,大侠帮我看看,是不是还是哪里设置没设置好

void AdcModeSet(void)


已经测试可行,并不是外部基准没有设置成功,而是针对DSP28335,他的AD计算方式如下:不管使用内部还是外部,算法都是:AD = 4095*(模拟电压 - ADCLO)/3

steaven2000 发表于 2014-12-8 17:57:59

不知道该说什么了。

SPRU812A.pdf
1.9 内外基准源选择   外部基准源只能是1.024V,1.500V及2.048V,通过寄存器设置你选择的究竟是哪个基准源。
2.5 ADCREFSEL寄存器00=内部基准(default),01=2.048V外部基准,10=1.500V外部基准,11=1.024V外部基准
你上面的话只说对了一半:AD计算公式确实只有一个,因为无论你选择哪个基准(前提是寄存器设置对),内部都会转换为3V基准。问题是:你的代码明明是选择的内部基准啊。。。

楼主你都不读datasheet的吗?我的神。。。。

tianyaxtutianya 发表于 2014-12-9 09:09:45

steaven2000 发表于 2014-12-8 17:57
不知道该说什么了。

SPRU812A.pdf


感谢楼上的耐心分析,确实第一份贴出来的是内部基准的设置方式,后面第二次贴出来的代码才是外部基准:

AdcRegs.ADCREFSEL.bit.REF_SEL = 0x1;       // 选择外部参考电压2.048

之前误解了他的意思,以为外部基准就是按照外部基准的电压值进行计算AD值的,所以一直以为自己的程序有误
页: [1]
查看完整版本: DSP28335的ADC外部基准初始化程序