简简单单DSP系列学习活动第六期AD学习及使用精Word格式文档下载.docx
《简简单单DSP系列学习活动第六期AD学习及使用精Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《简简单单DSP系列学习活动第六期AD学习及使用精Word格式文档下载.docx(10页珍藏版)》请在冰豆网上搜索。
3、ADC采样模式
ADC采样有顺序采样和同时采样两种模式。
顺序采样就是按照自动排序器的设置一个通道一个通道采样,而同时采样是按照顺序排序器的设置一对一对的采样,但是这一对的编号要一样,即ADCINA0与ADCINB0,ADCINA1和ADCINB1……同时采样。
2812的ADC是12位16通道的,可以分两个8通道的也可以级联为一个16通道的,这样的话就有4种工作模式,即:
a、双通道顺序采样
b、双通道同步采样
c、级联模式顺序采样
d、级联模式同步采样
就每种工作模式进行介绍,不对C代码进行详解,在讲这些之前,先说一下涉及到的比较重要而且难理解的寄存器
第一个:
最大转换通道寄存器ADCMAXCONV
ADCMAXCONV中能用的位是最后七位,在双通道采样模式下,自动排序寄存器SEQ1(A通道)用到的是MAXCONV1_2-0,就是低三位,采样的通道数=MAXCONV1_2-0+1;
自动排序寄存器SEQ2(B通道)用到的是MAXCONV2_2-0,就是高三位,采样的通道数=MAXCONV2_2-0+1;
在级联模式下,自动排序器SEQ用到的是MAXCONV1_3-0,采样的通道数=MAXCONV1_3-0+1。
第二个:
自动排序器SEQ1SEQ2SEQ
自动排序器就是管理在什么时间A、B通道的哪一个通道进行采样,就是把这16个通道排列顺序。
在双通道模式下,SEQ1管理的是A通道的那8个输入,SEQ2管理的是B通道的那8个输入,在级联模式下SEQ(即SEQ1)管理16个通道。
第三个:
四个输入通道选择排序寄存器ADCCHSELSEQx(X=1、2、3、4),都是16位的寄存器,每个寄存器中的4位确定一个采样通道(因为4位最大值正好是16,这样每个4位就可以确定16个通道的任一个),这样一个寄存器确定4个通道,4个寄存器正好是确定16个通道。
每个寄存器可以确定4个通道,这4个通道可以是一样的,甚至4个寄存器确定的都是一样的,这样就实现了过采样技术。
双通道顺序采样,用到的自动排序器是SEQ1,SEQ2,其中SEQ1将用到ADCADCCHSELSEQ1和ADCADCCHSELSEQ2,ADCCHSELSEQx中的每4位的最高位设置为0;
SEQ2将用到ADCADCCHSELSEQ3和ADCADCCHSELSEQ4,ADCCHSELSEQx中的每4位的最高位设置为1;
用到ADCMAXCONV中最后七位的低三位和高三位。
低三位MAXCONV1_2-0决定SEQ1中的采样次数;
高三位MAXCONV2_2-0决定SEQ2中的采样次数.转换顺序是从ADCADCCHSELSEQ1的最低4位开始一直到ADCADCCHSELSEQ4的最高4位这个顺序来的。
C代码分析:
这个是16个顺序采样的,每个通道都采样一次
/*双通道发生器模式*/
AdcRegs.ADCTRL1.bit.SEQ_CASC=0;
/*设置顺序采样模式*/
AdcRegs.ADCTRL3.bit.SMODE_SEL=0;
/*每个序列发生器最大采样通道数为8,总共可采样16通道,SEQ1将用到ADCADCCHSELSEQ1、ADCADCCHSELSEQ2,SEQ2将用到ADCADCCHSELSEQ3、ADCADCCHSELSEQ4*/
AdcRegs.MAX_CONV.all=0x0077;
/*采样ADCINA0*/
AdcRegs.ADCCHSELSEQ1.bit.CONV00=0x0;
/*采样ADCINA1*/
AdcRegs.ADCCHSELSEQ1.bit.CONV01=0x1;
/*采样ADCINA2*/
AdcRegs.ADCCHSELSEQ1.bit.CONV02=0x2;
/*采样ADCINA3*/
AdcRegs.ADCCHSELSEQ1.bit.CONV03=0x3;
/*采样ADCINA4*/
AdcRegs.ADCCHSELSEQ2.bit.CONV04=0x4;
/*采样ADCINA5*/
AdcRegs.ADCCHSELSEQ2.bit.CONV05=0x5;
/*采样ADCINA6*/
AdcRegs.ADCCHSELSEQ2.bit.CONV06=0x6;
/*采样ADCINA7*/
AdcRegs.ADCCHSELSEQ2.bit.CONV07=0x7;
/*ADCCHSELSEQx中的每4位的最高位为0*/
/*采样ADCINB0*/
AdcRegs.ADCCHSELSEQ3.bit.CONV08=0x8;
/*采样ADCINB1*/
AdcRegs.ADCCHSELSEQ3.bit.CONV09=0x9;
/*采样ADCINB2*/
AdcRegs.ADCCHSELSEQ3.bit.CONV10=0xA;
/*采样ADCINB3*/
AdcRegs.ADCCHSELSEQ3.bit.CONV11=0xB;
/*采样ADCINB4*/
AdcRegs.ADCCHSELSEQ4.bit.CONV12=0xC;
/*采样ADCINB5*/
AdcRegs.ADCCHSELSEQ4.bit.CONV13=0xD;
/*采样ADCINB6*/
AdcRegs.ADCCHSELSEQ4.bit.CONV14=0xE;
/*采样ADCINB7*/
AdcRegs.ADCCHSELSEQ4.bit.CONV15=0xF;
/*ADCCHSELSEQx中的每4位的最高位为1*/
转换完成后,结果存放在结果缓冲寄存器ADCRESULTn(x=1~16)中,结果排序如下
如果SEQ1和SEQ2两者都已经完成了转换,那么,结果如图8所示:
ADCINA0--->
ADCRESULT0
ADCINA1--->
ADCRESULT1
ADCINA2--->
ADCRESULT2
ADCINA3--->
ADCRESULT3
ADCINA4--->
ADCRESULT4
ADCINA5--->
ADCRESULT5
ADCINA6--->
ADCRESULT6
ADCINA7--->
ADCRESULT7
ADCINB0--->
ADCINB1--->
ADCRESULT8
ADCINB2--->
ADCRESULT9
ADCINB3--->
ADCRESULT10
ADCINB4--->
ADCRESULT11
ADCINB5--->
ADCRESULT13
ADCINB6--->
ADCRESULT14
ADCINB7--->
ADCRESULT15
双通道同步采样,就是一次有一对通道采样,像上面说的这一对是对应的。
用到的自动排序器是SEQ1,SEQ2。
其中SEQ1将用到ADCADCCHSELSEQ1,ADCADCCHSELSEQ1中的每4位的最高位设置为0;
SEQ2将用到ADCADCCHSELSEQ3,ADCADCCHSELSEQ3中的每4位的最高位设置为1;
用到ADCMAXCONV中最后七位的低2位和高2位。
低2位MAXCONV1_1-0决定SEQ1中的采样次数,每一次是一对,列如MAXCONV1_1-0=3,那么就是4对;
高2位MAXCONV2_1-0决定SEQ2中的采样次数.转换顺序是从ADCADCCHSELSEQ1的最低4位开始一直到ADCADCCHSELSEQ3的最高4位这个顺序来的.
C代码分析:
这个是8对同步采样的,每个通道都采样一次
AdcRegs.ADCTRL3.bit.SMODE_SEL=1;
/*每个序列发生器最大采样通道数为4,总共可采样8对通道,SEQ1将用到ADCADCCHSELSEQ1、,SEQ2将用到ADCADCCHSELSEQ3、*/
AdcRegs.MAX_CONV.all=0x0033;
/*采样ADCINA0,ADCINB0*/
/*采样ADCINA1,ADCINB1*/
/*采样ADCINA2,ADCINB2*/
/*采样ADCINA3,ADCINB3*/
/*采样ADCINA4,ADCINB4*/
AdcRegs.ADCCHSELSEQ3.bit.CONV08=0x4;
/*采样ADCINA5,ADCINB5*/
AdcRegs.ADCCHSELSEQ3.bit.CONV09=0x5;
/*采样ADCINA6,ADCINB6*/
AdcRegs.ADCCHSELSEQ3.bit.CONV10=0x6;
/*采样ADCINA7,ADCINB7*/
AdcRegs.ADCCHSELSEQ3.bit.CONV11=0x7;
ADCRESULT12
级联模式顺序采样,就是两个8通道的合并为一个16通道的,只用到一个排序器SEQ。
顺序采样,就是一次采一个通道,最多采样16通道。
SEQ将用到ADCADCCHSELSEQ1、ADCADCCHSELSEQ2、ADCADCCHSELSEQ3、ADCADCCHSELSEQ4,用到ADCMAXCONV中最后七位的低4位。
转换顺序是从ADCADCCHSELSEQ1的最低4位开始一直到ADCADCCHSELSEQ3的最高4位这个顺序来的.
这个是顺序采样16通道
/*级联模式*/
AdcRegs.ADCTRL1.bit.SEQ_CASC=1;
/*序列发生器最大采样通道数为16,SEQ将用到ADCADCCHSELSEQ1、ADCADCCHSELSEQ2,ADCADCCHSELSEQ3、ADCADCCHSELSEQ4,用到ADCMAXCONV的低4位*/
AdcRegs.MAX_CONV.all=0x000F;
如果SEQ已经完成了转换,那么,结果如图所示:
级联模式同步采样,就是一次有一对通道采样,像上面说的这一对是对应的。
用到的自动排序器是SEQ将用到SEQADCADCCHSELSEQ1、ADCADCCHSELSEQ2.
ADCADCCHSELSEQ1、ADCADCCHSELSEQ2中的每4位的最高位设置为0;
用到ADCMAXCONV中最后七位的低3位。
转换顺序是从ADCADCCHSELSEQ1的最低4位开始一直到ADCADCCHSELSEQ2的最高4位这个顺序来的.
这个是8对同步采样的,每次采样俩个通道,每个通道都采样一次
/*设置同步采样模式*/
/*序列发生器最大采样通道数为8,总共可采样8对通道,SEQ将用到ADCADCCHSELSEQ1、ADCADCCHSELSEQ2*/
AdcRegs.MAX_CONV.all=0x0007;
AdcRegs.ADCCHSELSEQ2.bit.CONV6=0x6;
AdcRegs.ADCCHSELSEQ2.bit.CONV7=0x7;
如果SEQ1都已经完成了转换,那么结果如图所示:
通过上述的4种情况我们不难发现,双序列发生器同步采样和级联模式同步采样的结果是一样的,双
序列发生器顺序采样和级联模式顺序采样的结果也是一样的,就是寄存器配置有些差别,不可张冠李戴,否则采样不能正确进行。
大家可以仔细比对,体会这4种情况的不同之处。
在实际应用中,大家可以根据情况来进行选择,最简单的就是级联成16路,然后进行顺序采样。
4、序列发生器的连续自动序列化模式和启动/停止模式
我们知道,一个序列的转换数是由MAXCONVn进行控制的,在启动一个转换序列进行转换时,AD模块将MAXCONVn的值装载进自动序列状态寄存器ADCASEQSR的序列计数器状态位SEQCNTR。
当序列发生器从状态CONV00开始并顺序进行(CONV01,CONV02。
。
)时,SEQCNTR位从装入值开始递减,直到为0,结束一个序列的转换,完成转换数为(MAXCONVn+1)。
当AD的控制寄存器1的CONTRUN位设为0的时候,AD的序列发生器运行在启动/停止模式,也就是说这种模式下,序列发生器在完成1个序列的转换之后将停止工作,在下一次转换启动开始之前,必须复位序列发生器,将转换器置为CONV00。
复位的方法如下:
复位序列发生器:
/*立即复位序列发生器为CONV00*/
AdcRegs.ADCTRL2.bit.RST_SEQ1=1;
/*立即复位序列发生器为CONV08*/
AdcRegs.ADCTRL2.bit.RST_SEQ2=1;
当AD的控制寄存器1的CONTRUN位设为1的时候,AD的序列发生器运行在连续自动序列化模式,当序列转换结束时,转换序列自动重复开始,SOC触发时自动将MAXCONVn装入SEQCNTR,SEQ的状态变为CONV00。
在这种情况下,为了避免重写数据,必须确保在下一个转换序列开始前,读取结果寄存器。
5、ADC的初始化
首先应该复位ADC,再给REF和bandgap电路上电,上电之后要由至少5MS的延时使电源稳定,再给ADC主模块上电。
初始化函数在DSP281X_Adc.c库函数中,在主函数中调用即可
#defineADC_usDELAY8000L
#defineADC_usDELAY220L
voidInitAdc(void)
{
externvoidDSP28x_usDelay(Uint32Count);
AdcRegs.ADCTRL1.bit.RESET=1;
//复位
asm(“RPT#10||NOP”);
//至少等待12周期以使复位有效
AdcRegs.ADCTRL3.bit.ADCBGRFDN=0x3;
//Powerupbandgap/referencecircuitry
DELAY_US(ADC_usDELAY);
//DelaybeforepoweringuprestofADC
AdcRegs.ADCTRL3.bit.ADCPWDN=1;
//PoweruprestofADC
DELAY_US(ADC_usDELAY2);
//DelayafterpoweringupADC
}
6、ADC启动
在配置完ADC后,要选择它的启动模式。
SEQ1:
软件立即启动、EVA的多种事件外部引脚
(GPIO/XINT2_ADCSOC)
SEQ2:
软件立即启动、EVB的多种事件
?
SEQ:
软件立即启动、EVA的多种事件、EVB的多种事件、外部引脚(GPIO/XINT2_ADCSOC)
对于这些触发方式的选择有控制寄存器2ADCTRL2决定.
下面以一个完整的C代码为例说明ADC的配置,这个是工作在级联顺序采样,采样16通道,有软件触发,使能中断,工作在中断模式0.
main()
InitSysCtrl();
//初始化cpu
DINT;
//关中断
InitPieCtrl();
//初始化pie寄存器
IER=0x0000;
/