模/数转换ADC在现实世界中,许多量都是模拟量,例如电压、电流、温度、湿度、压力等信号,而在DSP等微控制器的世界中,所有的量却都是数字量,那如何实现将现实世界的模拟量提供给DSP等微控制器呢?ADC1、F281x内部的ADC模块2、ADC模块的工作方式3、ADC模块的中断4、ADC模块的寄存器第5章模/数转换器ADC5.12812内部的ADC模块•ADC模块是一个12位分辨率的、具有流水线结构的模数转换器。•X281X的ADC模块一共具有16个采样通道,分成了两组,一组为ADCINA0~ADCINA7,另一组为ADCINB0~ADCINB7,转换时间在80ns以内。转换结果存储在ADCRESULT0~ADCRESULT15,16个结果寄存器中。ADC模块的结构框图(P143)虽然ADC模块具有多个输入通道,但是它内部只有1个转换器,也就是说同一时刻只能对1路输入信号进行转换。当有多路信号需要转换时,ADC模块该怎么办呢?多路转换示意图ADC模块的特点•一共有16个模拟量输入引脚,将这16个输入引脚分成了两组,A组的引脚为ADCINA0~ADCINA7,B组的引脚为ADCINB0~ADCINB7。•ADC内核内置有2个采样保持器S/H-A和S/H-B,从前面的学习可以知道,引脚ADCINA0~ADCINA7对应于采样保持器S/H-A,引脚ADCINB0~ADCINB7对应于采样保持器S/H-B。·ADC模拟输入的范围为0~3V。AD端口的嵌位电路•ADC模块的时钟频率最高可配置为25MHz,采样频率最高为12.5MIPS,也就是说每秒最高能完成12.5个百万次的采样。•ADC模块的自动序列发生器可以按两个独立的8状态序列发生器(SEQ1和SEQ2)来运行,也可以按一个16状态的序列发生器(SEQ)来运行。•ADC模块对一个序列的通道开始转换必须需要有一个启动信号,或者说是一个触发信号。序列发生器SEQ1SEQ2SEQ启动方式软件立即启动(S/W)EVA的多种事件外部引脚(GPIO/XINT2_ADCSOC)软件立即启动(S/W)EVB的多种事件软件立即启动(S/W)EVA的多种事件EVB的多种事件外部引脚(GPIO/XINT2_ADCSOC)•ADC模块共有16个结果寄存器ADCRESULT0~ADCRESULT15,用来保存转换的数值。每个结果寄存器都是16位的,而X281X的ADC是12位的,也就是说转换后的数字值最高只有12位,那这个12位的值是如何放在16位的结果寄存器中的呢?VoltInputADCLOADResult*655203.0VoltInputADCLO(ADResult4)*40953.0•模拟量与数字量关系:5.2ADC的时钟频率和采样频率-1假设外部晶振的频率为OSCCLKHz,通常选用的是30M的晶振。外部晶振经过PLL模块产生CPU时钟SYSCLKOUT,如果PLL模块的值为m,则有:OSCCLK*mSYSCLKOUT(m!0)2SYSCLKOUTOSCCLK(m0)然后,CPU时钟信号经过高速时钟预定标器HISPCP之后,生成高速外设时钟HSPCLK,假设HISPCP寄存器的值为n,则有:SYSCLKOUTHSPCLK(n!0)2*nHSPCLKSYSCLKOUT(n0)5.2ADC的时钟频率和采样频率-2AD控制寄存器ADCTRL3的第0到第3位,也就是功能位ADCLKPS,可以对HSPCLK进行分频,此外,AD控制寄存器ADCTRL1的CPS位另外还可以提供一个2分频,因此,可以得到ADC模块的时钟ADCLK为:HSPCLKADCLK(ADCLKPS0)CPS1HSPCLKADCLK(ADCLKPS!0)2*ADCLKPS*(CPS1)5.2ADC的时钟频率和采样频率-3ADC时钟频率•ADC的时钟频率就是每秒有多少个时钟脉冲的意思,它是ADC模块运行的基础•正如上面所介绍的,它是由系统时钟经过很多环节分频后得到的,它取决于外部的时钟输入和各个环节的倍频或者分频的系数。ADC采样频率•采样频率是指ADC模块每秒能够完成多少次的采样,采样频率取决于启动ADC的频率。启动ADC的方式有很多,比如利用软件直接启动,利用事件管理器的某些事件,或者是利用外部引脚来启动。启动ADC的频率才是ADC的采样频率,例如:如果每隔1ms启动一次ADC,那么ADC的采样频率就为1KHz。ADC转换时间•转换时间是指ADC模块完成一个通道或者一个序列的转换所需要的时间,很显然,转换时间是由ADC的时钟频率来决定的。ADC模块的结构框图(P143)5.3ADC模块的工作方式•ADC模块既支持2个8状态序列发生器SEQ1和SEQ2分开独立工作,此时称为双序列发生器方式,也支持序列发生器SEQ1和SEQ2级联成一个16状态序列发生器SEQ来工作,此时称为单序列发生器方式,或者称为级联方式。采样方式•并发采样:S/H-A和S/H-B并发采样,即采完A0,就采B0,采完A1,就采B1。。。。总是成对出现的。•序列采样模式:是按顺序单个来的,即先采A0-A7,再采B0-B7。•序列发生器SEQ1和SEQ2、SEQ,序列的从CONV00-CONV15。一种是双个的,SEQ1的CONV00-07,SEQ2的CONV08-15。1)双序列发生器模式下顺序采样2)双序列发生器模式下并发采样3)级联模式下顺序采样4)级联模式下并发采样ADC输入通道选择序列控制寄存器•F281X的16个通道可以通过编程来为序列发生器中需要转换的通道安排顺序,这个功能就需要通过ADC输入通道选择序列控制寄存器ADCCHSELSEQx(x=1,2,3,4)来实现。每一个输入通断选择序列控制寄存器都是16位的,被分成了4个功能位CONVxx,每一个功能位占据寄存器的4个位。ADC输入通道选择序列控制寄存器序列发生器对应的通道选择控制寄存器CONVxx对应的引脚SEQ1ADCCHSELSEQ1ADCCHSELSEQ2CONV00~CONV07ADCINA0~ADCINA7SEQ2ADCCHSELSEQ3ADCCHSELSEQ4CONV08~CONV15ADCINB0~ADCINB7SEQADCCHSELSEQ1ADCCHSELSEQ2ADCCHSELSEQ3ADCCHSELSEQ4CONV00~CONV15ADCINA0~ADCINA7ADCINB0~ADCINB7各个序列发生器所对应的寄存器和可选用的通道情况1)双序列发生器模式下顺序采样•假设需要对ADCINA0~ADCINA7,ADCINB0~ADCINB7这16路通道进行采样,ADC模块工作于双序列发生器模式,并采用顺序采样。ADCCHSELSEQ1CONV000000(ADCINA0)ADCCHSELSEQ3CONV081000(ADCINB0)CONV010001(ADCINA1)CONV091001(ADCINB1)CONV020010(ADCINA2)CONV101010(ADCINB2)CONV030011(ADCINA3)CONV111011(ADCINB3)ADCCHSELSEQ2CONV040100(ADCINA4)ADCCHSELSEQ4CONV121100(ADCINB4)CONV050101(ADCINA5)CONV131101(ADCINB5)CONV060110(ADCINA6)CONV141110(ADCINB6)CONV070111(ADCINA7)CONV151111(ADCINB7)双序列发生器顺序采样模式下16路通道时ADCCHSELSEQn位情况双序列发生器顺序采样模式下序列发生器16路通道选择情况:AdcRegs.ADCTRL1.bit.SEQ_CASC=0;//选择双序列发生器模式AdcRegs.ADCTRL3.bit.SMODE_SEL=0;//选择顺序采样模式AdcRegs.MAX_CONV.all=0x0077;//每个序列发生器最大采样通道数为8,总共可采样16通道//SEQ1将用到ADCCHSELSEQ1、ADCCHSELSEQ2,SEQ2将用到ADCCHSELSEQ3、ADCCHSELSEQ4AdcRegs.CHSELSEQ1.bit.CONV00=0x0;//采样ADCINA0通道AdcRegs.CHSELSEQ1.bit.CONV01=0x1;//采样ADCINA1通道AdcRegs.CHSELSEQ1.bit.CONV02=0x2;//采样ADCINA2通道AdcRegs.CHSELSEQ1.bit.CONV03=0x3;//采样ADCINA3通道AdcRegs.CHSELSEQ2.bit.CONV04=0x4;//采样ADCINA4通道AdcRegs.CHSELSEQ2.bit.CONV05=0x5;//采样ADCINA5通道AdcRegs.CHSELSEQ2.bit.CONV06=0x6;//采样ADCINA6通道AdcRegs.CHSELSEQ2.bit.CONV07=0x7;//采样ADCINA7通道AdcRegs.CHSELSEQ3.bit.CONV08=0x8;//采样ADCINB0通道AdcRegs.CHSELSEQ3.bit.CONV09=0x9;//采样ADCINB1通道AdcRegs.CHSELSEQ3.bit.CONV10=0xA;//采样ADCINB2通道AdcRegs.CHSELSEQ3.bit.CONV11=0xB;//采样ADCINB3通道AdcRegs.CHSELSEQ4.bit.CONV12=0xC;//采样ADCINB4通道AdcRegs.CHSELSEQ4.bit.CONV13=0xD;//采样ADCINB5通道AdcRegs.CHSELSEQ4.bit.CONV14=0xE;//采样ADCINB6通道AdcRegs.CHSELSEQ4.bit.CONV15=0xF;//采样ADCINB7通道初始化代码:最大转换通道寄存器的结构MAX_CONVReservedRESET……cps…SEQCASCReserved03471514ADC控制寄存器1Reserved…ADCCLKPS[0:3]SMODE_SEL0171584ADC控制寄存器3双序列发生器顺序采样模式下16路通道转换结果:2)双序列发生器模式下并发采样•假设需要对ADCINA0~ADCINA7,ADCINB0~ADCINB7这16路通道进行采样,ADC模块工作于双序列发生器模式,并采用并发采样。ADCCHSELSEQ1CONV000000(ADCINA0)ADCCHSELSEQ3CONV081000(ADCINB4)CONV010001(ADCINA1)CONV091001(ADCINB5)CONV020010(ADCINA2)CONV101010(ADCINB6)CONV030011(ADCINA3)CONV111011(ADCINB7)ADCCHSELSEQ2CONV04×ADCCHSELSEQ4CONV12×CONV05×CONV13×CONV06×CONV14×CONV07×CONV15×双序列发生器并发采样模式下16路通道时ADCCHSELSEQn位情况:MAXCONV1=2ChSel(CONV00=0x0)ChSel(CONV01=0x1)ChSel(CONV02=0x2)ChSel(CONV02=0x3)××××状态指针SEQ1MAXCONV2=3ChSel(CONV08=0xC)ChSel(CONV09=0xD)ChSel(CONV10=0xE)ChSel(CONV11=0xF)××××状态指针SEQ2双序列发生器并发采样模式下序列发生器16路通道选择情况:AdcRegs.ADCTRL1.bit.SEQ_CASC=0;//选择双序列发生器模式AdcRegs.ADCTRL3.bit.SMODE_SEL=1;//选择并发采样模式AdcRegs.MA