DSP系列 AD学习及使用
2812的AD是一个12位的,实际只有一个AD转换器,但是有16个输入通道,通过内部模拟开关选择。这16个通道可以分为两个8通道的,也可以级联为一个16通道的。
ADC功能包括:
1、ADC时钟
外部高速时钟HSPCLK经过变换后作为AD的时钟。
HSPCLK先要被控制寄存器3ADCTRL3寄存器中的ADCCLKPS[3:0]位除,随后经过2分频(当ADCTRL1寄存器中的位CPS=1)或不分频(当ADCTRL1寄存器中的位CPS=0)就得到ADC的时钟基准,但是最大为25M。
ADCCLKPS=0时,ADCCLK=HSPCLK/(ADCTRL1[7]+1)
ADCCLKPS!=0时,ADCCLK=HSPCLK/[2x(ADCCLKPS)x(ADCTRL1[7]+1)]例如:外部晶振时钟30M,PLL倍频后为150M,HSPCLK=25M,ADCCLKPS=5,ADCTRL1[7]=1,则
ADCCLK=25/2X5x(1+1)=1.25M
2、采样频率
ADC转换包括采样、保持、量化、编码四个阶段,他把连续的模拟量量化为开关数字量,就相当于在模拟量和AD引脚中间有一个开关,开关闭合,模拟量就输入到AD采样引脚,开关断开,ADC引脚上的模拟量就没有了,采样频率就是采样和保持的时间,就是这个开关闭合的时间。采样时间长短不影响其他操作,这个采样时间控制SOC脉冲宽度。由ADC时钟和ADC控制寄存器1ADCTRL1中的ACQ_PS[11:8]位决定。
Fsoc=ADCCLK/(ACQ_PS[11:8]+1)。
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。
第二个:自动排序器SEQ1 SEQ2 SEQ
自动排序器就是管理在什么时间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个寄存器确定的都是一样的,这样就实现了过采样技术。
a、双通道顺序采样
双通道顺序采样,用到的自动排序器是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--->ADCRESULT0
ADCINB1--->ADCRESULT8
ADCINB2--->ADCRESULT9
ADCINB3--->ADCRESULT10
ADCINB4--->ADCRESULT11
ADCINB5--->ADCRESULT13
ADCINB6--->ADCRESULT14
ADCINB7--->ADCRESULT15
b、双通道同步采样
双通道同步采样,就是一次有一对通道采样,像上面说的这一对是对应的。用到的自动排序器是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.ADCTRL1.bit.SEQ_CASC=0;
/*设置顺序采样模式*/
AdcRegs.ADCTRL3.bit.SMODE_SEL=1;
/*每个序列发生器最大采样通道数为 4,总共可采样 8对通道 , SEQ1 将用到 ADCADCCHSELSEQ1、,SEQ2 将用到 ADCADCCHSELSEQ3、 */
AdcRegs.MAX_CONV.all=0x0033;
/*采样 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.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;
如果 SEQ1 和 SEQ2 两者都已经完成了转换,那么,结果如图 8 所示:
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
c、级联模式顺序采样
级联模式顺序采样,就是两个8通道的合并为一个16通道的,只用到一个排序器SEQ。顺序采样,就是一次采一个通道,最多采样16通道。SEQ 将用到 ADCADCCHSELSEQ1、ADCADCCHSELSEQ2、ADCADCCHSELSEQ3、ADCADCCHSELSEQ4 ,用到ADCMAXCONV中最后七位的低4位。转换顺序是从ADCADCCHSELSEQ1的最低4位开始一直到ADCADCCHSELSEQ3的最高4位这个顺序来的.
C代码分析:这个是顺序采样16通道
/*级联模式 */
AdcRegs.ADCTRL1.bit.SEQ_CASC=1;
/*设置顺序采样模式*/
AdcRegs.ADCTRL3.bit.SMODE_SEL=0;
/*序列发生器最大采样通道数为 16, SEQ 将用到 ADCADCCHSELSEQ1、ADCADCCHSELSEQ2,ADCADCCHSELSEQ3、ADCADCCHSELSEQ4 ,用到ADCMAXCONV的低4位*/
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(" 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
/*时钟设置12.5M*/
AdcRegs.ADCTRL1.bit.CPS=1;
AdcRegs.ADCTRL3.bit.ADCCLKPS=3;
/*采样窗口长度设置2.5M*/
AdcRegs.ADCTRL1.bit.ACQ_PS=5;
/*配置AD*/
/*级联模式 */
AdcRegs.ADCTRL1.bit.SEQ_CASC=1;
/*设置顺序采样模式*/
AdcRegs.ADCTRL3.bit.SMODE_SEL=0;
/*序列发生器最大采样通道数为 16, SEQ 将用到 ADCADCCHSELSEQ1、ADCADCCHSELSEQ2,ADCADCCHSELSEQ3、ADCADCCHSELSEQ4 ,用到ADCMAXCONV的低4位*/
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;
/*中断模式0*/
AdcRegs.ADCTRL2.bit.INT_MOD_SEQ=1;
/*使能ADC中断,*/
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;
/*如果是其他方式触发中断,那么还要设置,比如取EVA触发中断,那么要加这么一条设置,软件上触发就不需要了*/
AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1 = 1;
}
ADC中断函数处理:
ADC的中断函数在DSP281X_DefaultIsr.c库函数中了,在中断函数里面主要是读取ADC结果缓冲寄存器的值,12位在高位了,因此要把结果缓冲寄存器的值右移4位。并且要复位ADC的输入通道排序寄存器到CONV00,等待ADC采样使能,即有SOC脉冲;清外设中断标志位,以及PIEACK清零。
Uint16 ConversionCount;
Uint16 Voltage1[1024];
Uint16 Voltage2[1024];
interrupt void ADCINT_ISR(void) // ADC
{
/*读数*/
Voltage1[ConversionCount] =AdcRegs.ADCRESULT0 >>4;
Voltage2[ConversionCount]= AdcRegs.ADCRESULT1 >>4;
// If 40 conversions have been logged, start over
if(ConversionCount == 1023)
{
ConversionCount = 0;
}
else ConversionCount++;
/*复位SEQ1*/
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;
/*中断标志位清0*/
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
/*PIEACK清0*/
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
return;
} |