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的值,那么你就什么时候触发;也可以查询,不复位,让他一直在转化,什么时候想要没什么时候去读。
用户269635 2013-8-27 09:43
用户404801 2013-6-18 16:52