\\"简简单单DSP\\"系列学习活动 - 第六期AD学习及使用 联系客服

发布时间 : 星期五 文章\\"简简单单DSP\\"系列学习活动 - 第六期AD学习及使用更新完毕开始阅读8e56a1781711cc7931b71644

AdcRegs.MAX_CONV.all=0x000F; /*采样 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; /*采样 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; 转换完成后,结果存放在结果缓冲寄存器ADCRESULTn(x=1~16)中,结果排序如下

如果 SEQ已经完成了转换,那么,结果如图 所示: ADCINA0--->ADCRESULT0 ADCINA1--->ADCRESULT1 ADCINA2--->ADCRESULT2 ADCINA3--->ADCRESULT3 ADCINA4--->ADCRESULT4 ADCINA5--->ADCRESULT5 ADCINA6--->ADCRESULT6 ADCINA7--->ADCRESULT7 ADCINB0--->ADCRESULT0 ADCINB1--->ADCRESULT8

ADCINB2--->ADCRESULT9 ADCINB3--->ADCRESULT10 ADCINB4--->ADCRESULT11 ADCINB5--->ADCRESULT13 ADCINB6--->ADCRESULT14 ADCINB7--->ADCRESULT15 d、级联模式同步采样 级联模式同步采样,就是一次有一对通道采样,像上面说的这一对是对应的。用到的自动排序器是SEQ将用到SEQADCADCCHSELSEQ1、ADCADCCHSELSEQ2.

ADCADCCHSELSEQ1、ADCADCCHSELSEQ2中的每4位的最高位设置为0;用到ADCMAXCONV中最后七位的低3位。转换顺序是从ADCADCCHSELSEQ1的最低4位开始一直到ADCADCCHSELSEQ2的最高4位这个顺序来的.

C代码分析:这个是8对同步采样的,每次采样俩个通道,每个通道都采样一次 /*级联模式 */

AdcRegs.ADCTRL1.bit.SEQ_CASC=1; /*设置同步采样模式*/

AdcRegs.ADCTRL3.bit.SMODE_SEL=1;

/*序列发生器最大采样通道数为 8,总共可采样 8对通道 , SEQ 将用到 ADCADCCHSELSEQ1、 ADCADCCHSELSEQ2 */ AdcRegs.MAX_CONV.all=0x0007; /*采样 ADCINA0,ADCINB0*/

AdcRegs.ADCCHSELSEQ1.bit.CONV00=0x0; /*采样 ADCINA1,ADCINB1*/

AdcRegs.ADCCHSELSEQ1.bit.CONV01=0x1; /*采样 ADCINA2,ADCINB2*/

AdcRegs.ADCCHSELSEQ1.bit.CONV02=0x2; /*采样 ADCINA3,ADCINB3*/

AdcRegs.ADCCHSELSEQ1.bit.CONV03=0x3; /*采样 ADCINA4,ADCINB4*/

AdcRegs.ADCCHSELSEQ2.bit.CONV04=0x4; /*采样 ADCINA5,ADCINB5*/

AdcRegs.ADCCHSELSEQ2.bit.CONV05=0x5; /*采样 ADCINA6,ADCINB6*/

AdcRegs.ADCCHSELSEQ2.bit.CONV6=0x6; /*采样 ADCINA7,ADCINB7*/

AdcRegs.ADCCHSELSEQ2.bit.CONV7=0x7;

如果 SEQ1都已经完成了转换,那么结果如图 所示: ADCINA0--->ADCRESULT0 ADCINB0--->ADCRESULT1 ADCINA1--->ADCRESULT2 ADCINB1--->ADCRESULT3 ADCINA2--->ADCRESULT4 ADCINB2--->ADCRESULT5 ADCINA3--->ADCRESULT6 ADCINB3--->ADCRESULT7 ADCINA4--->ADCRESULT8

ADCINB4--->ADCRESULT9 ADCINA5--->ADCRESULT10 ADCINB5--->ADCRESULT11 ADCINA6--->ADCRESULT12 ADCINB6--->ADCRESULT13 ADCINA7--->ADCRESULT14 ADCINB7--->ADCRESULT15 通过上述的 4 种情况我们不难发现,双序列发生器同步采样和级联模式同步采样的结果是一样的,双 序列发生器顺序采样和级联模式顺序采样的结果也是一样的,就是寄存器配置有些差别,不可张冠李戴,否则采样不能正确进行。大家可以仔细比对,体会这 4 种情况的不同之处。在实际应用中,大家可以根据情况来进行选择,最简单的就是级联成 16 路,然后进行顺序采样。

4、序列发生器的连续自动序列化模式和启动/停止模式 我们知道,一个序列的转换数是由 MAXCONVn 进行控制的,在启动一个转换序列进行转换时,AD 模块将 MAXCONVn 的值装载进自动序列状态寄存器 ADCASEQSR 的序列计数器状态位 SEQCNTR。当序列发生器从状态 CONV00 开始并顺序进行(CONV01,CONV02。。。。)时, SEQCNTR 位从装入值开始递减,直到为 0,结束一个序列的转换,完成转换数为(MAXCONVn+1)。 当 AD 的控制寄存器 1 的 CONT RUN 位设为 0 的时候,AD 的序列发生器运行在启动/停止模式,也就是说这种模式下,序列发生器在完成 1 个序列的转换之后将停止工作,在下一次转换启动开始之前,必须复位序列发生器,将转换器置为 CONV00。复位的方法如下: 复位序列发生器 :

/*立即复位序列发生器为 CONV00 */ AdcRegs.ADCTRL2.bit.RST_SEQ1=1; /*立即复位序列发生器为 CONV08*/ AdcRegs.ADCTRL2.bit.RST_SEQ2=1; 当 AD 的控制寄存器 1 的 CONT RUN 位设为 1 的时候,AD 的序列发生器运行在连续自动序列化模式,当序列转换结束时,转换序列自动重复开始,SOC触发时自动将 MAXCONVn装入 SEQCNTR,SEQ的状态变为 CONV00。在这种情况下,为了避免重写数据,必须确保在下一个转换序列开始前,读取结果寄存器。 5、ADC的初始化 首先应该复位ADC,再给REF和bandgap电路上电,上电之后要由至少5MS的延时使电源稳定,再给ADC主模块上电。初始化函数在DSP281X_Adc.c库函数中,在主函数中调用即可

#define ADC_usDELAY 8000L #define ADC_usDELAY2 20L void InitAdc(void) {

extern void DSP28x_usDelay(Uint32 Count); AdcRegs.ADCTRL1.bit.RESET=1;//复位

asm(“ RPT # 10 || NOP”);//至少等待12周期以使复位有效

AdcRegs.ADCTRL3.bit.ADCBGRFDN = 0x3; // Power up bandgap/reference circuitry DELAY_US(ADC_usDELAY); // Delay before powering up rest of ADC AdcRegs.ADCTRL3.bit.ADCPWDN = 1; // Power up rest of ADC DELAY_US(ADC_usDELAY2); // Delay after powering up ADC

}

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;//禁止所有的中断 IFR = 0x0000;

InitPieVectTable();//初始化pie中断向量表 InitAdc(); //调用初始化ADC函数

PieCtrlRegs.PIEIER1.bit.INTx6 = 1;//使能AD的PIE级中断 IER |= M_INT1; // 使能AD的CPU级的中断 EINT; // 开全局中断 ERTM; // 使能仿真中断 LoopCount = 0; /*软件触发*/

AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1; while(1) {

LoopCount++; } }

初始化ADC函数 void InitAdc(void) {

extern void DSP28x_usDelay(Uint32 Count);

AdcRegs.ADCTRL1.bit.RESET = 1;// ADC复位 asm(\等待至少12周期

AdcRegs.ADCTRL3.bit.ADCBGRFDN = 0x3; // Power up bandgap/reference circuitry DELAY_US(ADC_usDELAY); // Delay before powering up rest of ADC AdcRegs.ADCTRL3.bit.ADCPWDN = 1; // Power up rest of ADC DELAY_US(ADC_usDELAY2); // Delay after powering up ADC /*时钟设置12.5M*/