DSP28335的ADC外部基准初始化程序
DSP28335的ADC外部基准初始化程序谁有,我按照数据手册上配置总是不对,哪位高手弄过的,给个初始化配置程序给我参考下,本人感激不尽!!! 以下是我的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
} 在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 找TI的example,不要每次都为这些最基本的东西烦恼了,看你弄DSP也有一段时间了。 楼主请问下28335 这些寄存器定义有没有一个专门的文档介绍,类似design guide,我也有个板子,不过它里面都是一个模块一个模块单独的文档{:biggrin:} embeddev_1 发表于 2014-11-25 11:39
楼主请问下28335 这些寄存器定义有没有一个专门的文档介绍,类似design guide,我也有个板子,不过它里面都 ...
都是分模块的寄存器吧,没有所有寄存器合到一起的 steaven2000 发表于 2014-11-25 11:36
找TI的example,不要每次都为这些最基本的东西烦恼了,看你弄DSP也有一段时间了。 ...
楼上说的有道理,TI的例子我也看过了,他就只有设置为内部基准的例子,没有看到外部基准的程序例子,楼上那里是否有,有的传一个给我参考下,万分感谢 楼主用 28335 是学习,还是坐产品呀?我看楼主研究好长时间了么 ....... lljyes 发表于 2014-11-25 11:33
在DSP2833x_Adc里面的,供参考:
EALLOW;
按照楼上的方法去试了,还是不行,AD转换出来的结果还是按照内部基准设置的,是不是还有什么寄存器没配置好? 可以仿真运行,查看外部基准的设定是否成功。 lljyes 发表于 2014-11-26 16:57
可以仿真运行,查看外部基准的设定是否成功。
仿真试过了,虽然设置了AdcRegs.ADCREFSEL.bit.REF_SEL = 0x1; // 选择外部参考电压2.048
但是从ADC采样的数据来看,还是以3V为基准得到的ADC值 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
我也是菜鸟,你可以仿真看一下,外部基准的设定是否设定成功。例程中选了基准后有延时的,你这里设定后没有 ...
测试过了,加入延时也还是不行 tianyaxtutianya 发表于 2014-11-26 17:11
这是我配置为外部基准的初始化函数,大侠帮我看看,是不是还是哪里设置没设置好
void AdcModeSet(void)
已经测试可行,并不是外部基准没有设置成功,而是针对DSP28335,他的AD计算方式如下:不管使用内部还是外部,算法都是:AD = 4095*(模拟电压 - ADCLO)/3 不知道该说什么了。
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的吗?我的神。。。。 steaven2000 发表于 2014-12-8 17:57
不知道该说什么了。
SPRU812A.pdf
感谢楼上的耐心分析,确实第一份贴出来的是内部基准的设置方式,后面第二次贴出来的代码才是外部基准:
AdcRegs.ADCREFSEL.bit.REF_SEL = 0x1; // 选择外部参考电压2.048
之前误解了他的意思,以为外部基准就是按照外部基准的电压值进行计算AD值的,所以一直以为自己的程序有误
页:
[1]