搜索
bottom↓
回复: 16

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

[复制链接]

出0入0汤圆

发表于 2014-11-25 11:01:02 | 显示全部楼层 |阅读模式
DSP28335的ADC外部基准初始化程序谁有,我按照数据手册上配置总是不对,哪位高手弄过的,给个初始化配置程序给我参考下,本人感激不尽!!!

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果天空是黑暗的,那就摸黑生存;
如果发出声音是危险的,那就保持沉默;
如果自觉无力发光,那就蜷伏于牆角。
但是,不要习惯了黑暗就为黑暗辩护;
也不要为自己的苟且而得意;
不要嘲讽那些比自己更勇敢的人。
我们可以卑微如尘土,但不可扭曲如蛆虫。

出0入0汤圆

 楼主| 发表于 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
   
   
}

出0入0汤圆

发表于 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

出0入0汤圆

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

出0入0汤圆

发表于 2014-11-25 11:39:42 | 显示全部楼层
楼主请问下28335 这些寄存器定义有没有一个专门的文档介绍,类似design guide,我也有个板子,不过它里面都是一个模块一个模块单独的文档

出0入0汤圆

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

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

出0入0汤圆

 楼主| 发表于 2014-11-25 16:47:56 | 显示全部楼层
steaven2000 发表于 2014-11-25 11:36
找TI的example,不要每次都为这些最基本的东西烦恼了,看你弄DSP也有一段时间了。 ...

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

出5入14汤圆

发表于 2014-11-25 16:50:36 | 显示全部楼层
楼主用 28335 是学习,还是坐产品呀?我看楼主研究好长时间了么 .......

出0入0汤圆

 楼主| 发表于 2014-11-26 14:48:36 | 显示全部楼层
lljyes 发表于 2014-11-25 11:33
在DSP2833x_Adc里面的,供参考:

            EALLOW;

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

出0入0汤圆

发表于 2014-11-26 16:57:55 | 显示全部楼层
可以仿真运行,查看外部基准的设定是否成功。

出0入0汤圆

 楼主| 发表于 2014-11-26 17:08:54 | 显示全部楼层
lljyes 发表于 2014-11-26 16:57
可以仿真运行,查看外部基准的设定是否成功。

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

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

出0入0汤圆

 楼主| 发表于 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
   
}

出0入0汤圆

发表于 2014-11-26 18:04:40 | 显示全部楼层
我也是菜鸟,你可以仿真看一下,外部基准的设定是否设定成功。例程中选了基准后有延时的,你这里设定后没有延时,不知有没有关系。

出0入0汤圆

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

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

出0入0汤圆

 楼主| 发表于 2014-12-8 16:10:07 | 显示全部楼层
tianyaxtutianya 发表于 2014-11-26 17:11
这是我配置为外部基准的初始化函数,大侠帮我看看,是不是还是哪里设置没设置好

void AdcModeSet(void)

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

出0入0汤圆

发表于 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的吗?我的神。。。。

出0入0汤圆

 楼主| 发表于 2014-12-9 09:09:45 | 显示全部楼层
steaven2000 发表于 2014-12-8 17:57
不知道该说什么了。

SPRU812A.pdf

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

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

之前误解了他的意思,以为外部基准就是按照外部基准的电压值进行计算AD值的,所以一直以为自己的程序有误
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-9-27 07:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表