原创 【TI博客大赛】28335之ADC

2012-11-7 14:27 8959 11 13 分类: 处理器与DSP

 

      28335的ADC和2812的差不多,12位的AD,一个ADC转换器,16个模拟开关构成16通道输入,这16通道可以分为两个8通道的(独立)和一个16通道的(级联模式);ADC的时钟12.5M,采样频率6.25M。输入范围0~3V,低于0采样值为0,高于3采样值为4095,计算

      可以由软件触发、GPIO XINT2、ePWM1~6触发(工作在双通道模式,一个PWM模块触发一个)。

      ADC模块主要有两个8通道的模拟开关、两个采样保持器和一个12位的ADC转换器构成,这两个采样保持器A、B分别对应着DSP引脚上的INA0~INA7和INB0~INB7。两个采样保持器可以单独工作和级联成一个采样保持器,这就是ADC的两种操作模式:级联模式和双排序模式。每一种模式下还有两种操作方式,顺序采样和同步采样(同步采样就是两个采样保持器对应的输入引脚同时采样保持)

1、         级联模式

A、              顺序采样

最大转换通道寄存器ADCMAXCONV,这个寄存器决定有多少采样通道。在这种模式下寄存器的低四位有效,采样通道数=(ADCMAXCONV0~4)+1。

ADC输入通道选择排序控制寄存器ADCCHSELSEQn。总共有4个寄存器,

ADCCHSELSEQ1,ADCCHSELSEQ2,ADCCHSELSEQ3,ADCCHSELSEQ4,每个寄存器都是16位的,顺序的4位决定一个输入通道,转换顺序是从ADCCHSELSEQ1最低4位到ADCCHSELSEQ4的最高4位,最多16个。

这个模式下,配合着ADCMAXCONV使用ADCMAXCONV决定对多少个通道采样,ADCCHSELSEQn决定采样顺序,其中ADCCHSELSEQn中的每4位的最高位决定哪个采样保持器,剩下的3位决定哪个通道。这样的话3位决定8个通道,正好两个采样保持器,加起来就是16个。举例说明:

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;

从下面开始每四位的最高位决定了是用的B采样保持器

/*采样 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

B 级联模式同步采样

级联模式同步采样就两个采样保持器同时采样是成对的(比如说同时采样保持INA0和INB0)。最大转换通道寄存器ADCMAXCONV的低3位有效,绝定8对通道,用到了ADC输入通道选择排序控制寄存器ADCCHSELSEQ1和2,这两个寄存器的每4位的最高位不起作用,低3位有用,正好是8对。采样保持的顺序还是从ADCCHSELSEQ1低4位到ADCCHSELSEQ2高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

2、双排序模式

双排序模式把两个排序器独立起来使用,有自己的触发方式,可以看做是2个独立的ADC。A通道用的是排序器1(SEQ1)B通道用的是排序器2(SEQ2),SEQ1的优先级高于SEQ2,如果同时来了启动信号,SEQ1现转换。排序器中的转换个数还是受ADCMAXCONV控制。

A、              双排序顺序采样

顺序采样的个数还是受到ADCMAXCONV控制,有用的还是最低7位。采样保持器A用到的是ADCMAXCONV的最低3位,采样保持器B用到的是ADCMAXCONV的最低7位的高3位。采样通道的排序还是受ADC输入通道选择排序控制寄存器ADCCHSELSEQn控制,SEQ1用到的是ADCCHSELSEQ1和2,SEQ2用到的是ADCCHSELSEQ3和4,排序还是从ADCCHSELSEQ1的最低4位到ADCCHSELSEQ4的最高4位,ADCCHSELSEQ1和ADCCHSELSEQ2的每四位的最高位写为0,低三位代表哪个通道,ADCCHSELSEQ3和ADCCHSELSEQ4的每4位的最高位写1,代表了是B通道,低三位代表那个通道。

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; 这个地方已经不是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;

/*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

  • 双排序同步采样

双排序模式同步采样就是两个采样保持器同时采样是成对的(比如说同时采样保持INA0和INB0)。双排序模式与级联模式的区别在于双排序模式用到了ADCCHSELSEQ1(SEQ1)和ADCCHSELSEQ3(SEQ2),实际是级联模式只用到了一个采样保持器而双排序用到了2个采样保持器,这样的话每一个采样保持器控制了4对通道,正好最大是8对16个。决定ADCCHSELSEQ中个数的寄存器ADCMAXCONV的低7位有效,这低七位的高3位最大是3,最低4位的最大值也是3.

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

3ADC时钟

外部高速时钟HSPCLK经过变换后作为AD的时钟。HSPCLK先要被控制寄存器3ADCTRL3寄存器中的ADCCLKPS[3:0]位除,随后经过2分频(当ADCTRL1寄存器中的位CPS=1)或不分频(当ADCTRL1寄存器中的位CPS=0)就得到ADC的时钟基准,但是最大为2.5M。

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

4、采样频率

ADC转换包括采样、保持、量化、编码四个阶段,他把连续的模拟量量化为开关数字量,就相当于在模拟量和AD引脚中间有一个开关,开关闭合,模拟量就输入到AD采样引脚,开关断开,ADC引脚上的模拟量就没有了,采样频率就是采样和保持的时间,就是这个开关闭合的时间。采样时间长短不影响其他操作,这个采样时间控制SOC脉冲宽度。由ADC时钟和ADC控制寄存器1ADCTRL1中的ACQ_PS[11:8]位决定。

Fsoc=ADCCLK/(ACQ_PS[11:8]+1)。

5、以上介绍都是基本的操作,具体使用起来还是比较恶心的,那个启动停止模式就没有使用明白,如果AdcRegs.ADCTRL1.bit.CONT_RUN = 0;就是启动停止模式,这个模式用软件启动没有启动起来,就是AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1

AdcRegs.ADCTRL1.bit.CONT_RUN = 1是连续运行模式,就软件启动一次,如果在用到查询模式的时候,如果不复位的话(AdcRegs.ADCTRL2.bit.RST_SEQ1 = 0),那么就一直在转换,如果复位的话(AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;)那么转化两次,按道理来说复位后就回到了触发前的状态,那么你只启动了一次,这一次转化完成之后,一复位就应该停止了,但是还是又转化了一次。如果用到中断模式的话,启动一次后,在中断里面里面复位了,进两次次中断,如果没有复位的话,那就一直进中断。

在使用的时候,就是用级联模式,使用中断模式,在中断里面复位,什么时候想去要AD的值,那么你就什么时候触发;也可以查询,不复位,让他一直在转化,什么时候想要没什么时候去读。

 

文章评论2条评论)

登录后参与讨论

用户269635 2013-8-27 09:43

分析的很透彻,很好

用户404801 2013-6-18 16:52

写的不错
相关推荐阅读
用户862116 2012-11-27 12:11
【博客大赛】周立功写给学单片机的年轻人
作为过来人思前想后,我感到完全有责任将发自心底的感受传递给年轻一代,“一个企业家心灵深处渴望优秀人才的卓越追求和深层次的叹息、痛苦和感受”。您们千万不要等到毕业求职时才觉得自己能力太差,世界上从来...
用户862116 2012-11-27 08:44
【博客大赛】郭天祥的成长足迹
在哈尔滨工程大学六年,我在学校电子创新实验室呆了四年,这四年里创新实验室给我提供了良好的学习环境和完善的实验设备;在与众多电子爱好者的交流中,使我学到了更多的专业知识;在学校老师们的教导下,让我学...
用户862116 2012-11-20 15:16
【TI博客大赛】DSP高手的经验介绍
几个DSP高手的经验介绍,编写基于DSP程序的注意事项 一. 我是已经从事DSP开发有几年了,看到许多朋友对DSP的开发非常感兴取,我结合这几年对DSP的开发写一写自己的感受,一家之言,欢迎指...
用户862116 2012-11-20 15:13
【博客大赛】一个FPGA高手的总结
很早之前就想对这几个月工作经历写的东西,一是作为自己的总结,二是自己也很想将自己这段时间的一些经历和大家分享一下,希望对初学者而言能使得他们能少走一些弯路。只是公司里的事情很多,最近经常加班,所以...
用户862116 2012-11-16 10:18
【TI博客大赛】【原创】28035JTAG配置指导
JTAG口:TRST, TCK, TDI, TMS, TDO JTAG口与DSP距离最好再5cm,最多不超过15cm 1.  TRST,有内部下拉。当该引脚不接或拉低将处于功能模式,测试复位信号将被忽...
用户862116 2012-11-16 08:44
【TI博客大赛】【原创】28035晶振配置指导
晶振配置注意:(P47,图3-10. Clock Tree)自己的笔记~ 1.  片内无脚振荡器:内部集成两个10M的晶振,默认启动时是有效的且晶振1作为默认时钟源,若为省电,晶振需由用户手动关闭,震...
我要评论
2
11
关闭 站长推荐上一条 /2 下一条