文档库 最新最全的文档下载
当前位置:文档库 › 28335_ADC

28335_ADC

28335_ADC
28335_ADC

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

3、ADC时钟

外部高速时钟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的值,那么你就什么时候触发;也可以查询,不复位,让他一直在转化,什么时候想要没什么时候去读。

相关文档