您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 第10章 模拟比较器和ADC接口
1第10章模拟比较器和ADC接口2单片机内部常见的支持模拟信号输入接口模拟比较器和模数转换ADC3模拟量输入通道构成主要组成:信号处理装置、采样单元、采样保持器、数据放大器、A/D转换器控制电路。任务:完成模拟量的采集并转换成数字量送入计算机。4AD转换及其应用被测参数,如温度、流量、压力、液位、速度等都是连续变化的量-模拟量单片机只能处理数字量把输入的连续变化的模拟电压信号转换成离散的数字量-ADCAVRATmega16内置10bitADC5模拟比较器10.1模拟比较器610.1.1与模拟比较器相关的寄存器和标志位SFIOR、ACSR2.模拟比较器控制和状态寄存器—ACSR1.特殊功能IO寄存器—SFIOR为模拟比较器多路使能控制位7ACSR是模拟比较器主要的控制寄存器,各位的作用位7—ACD:模拟比较器禁止位6—ACBG:模拟比较器的能隙参考源选择位5—ACO:模拟比较器输出位4—ACI:模拟比较器中断标志位位3—ACIE:模拟比较器中断允许位1、0—ACIS1、ACIS0:模拟比较器中断模式选择位2—ACIC:模拟比较器输入捕获允许8表9-1模拟比较器中断模式选择ACIS1ACIS0中断模式00比较器输出的上升沿和下降沿都触发中断01保留10比较器输出的下降沿触发中断11比较器输出的上升沿触发中断模拟比较器的多路输入用户可以选择ADC7..0引脚中的任一路的模拟信号代替AIN1引脚,作为模拟比较器的反向输入端。9模拟比较器的多路输入选择10模拟比较器使用注意点包括:芯片RESET后,模拟比较器为允许工作状态。如果系统中不使用模拟比较器功能,应将寄存器ACSR的ACD位置1,关闭模拟比较器,这样可以减少电源的消耗。使用模拟比较器时,应注意比较器的两个输入端口PB2、PB3的设置。当PB2/PB3作为模拟输入端使用时,PB2/PB3应设置为输入工作方式,且上拉电阻无效,这样就不会使PB2/PB3上输入的模拟电压受到影响。当AIN0设置为使用芯片内部1.22V的固定能隙(Bandgap)参考电源时,PB2口仍然可以作为通用I/O端口使用,这样就能节省一个I/O引脚。在上面的例子里,AIN0就是设置为使用芯片内部1.22V的固定能隙(Bandgap)参考电源,这样就可将PB2口释放出来,作为普通I/O口用来驱动LED了10.1.2模拟比较器的应用设计11系统电源电压的监测12程序#includemega16.hvoidmain(void){PORTB.2=0x01;//PC0设置为输出,控制LEDDDRB.2=0x01;ACSR=0x40;//模拟比较器初始化,允许模拟比较器,AIN0设置为内部Bandgap参考电压1.22Vwhile(1)//循环检测AC0位{if(ACSR.5)PORTB.2=0;//AIN0AIN1,低电压报警elsePORTB.2=1;//AIN0AIN1,}}1310.2模数转换器ADC外部的模拟信号量需要转变成数字量才能进一步的由MCU进行处理。ATmega16内部集成有一个10位逐次比较(successiveapproximation)ADC电路。因此使用AVR可以非常方便的处理输入的模拟信号量。ATmega16的ADC与一个8通道的模拟多路选择器连接,能够对以PORTA作为ADC输入引脚的8路单端模拟输入电压进行采样,单端电压输入以0V(GND)为参考。另外还支持16种差分电压输入组合,其中2种差分输入方式(ADC1,ADC0和ACD3,ADC2)带有可编程增益放大器,能在A/D转换前对差分输入电压进行0dB(1×),20dB(10×)或46dB(200×)的放大。还有七种差分输入方式的模拟输入通道共用一个负极(ADC1),此时其它任意一个ADC引脚都可作为相应的正极。若增益为1×或10×,则可获得8位的精度。如果增益为200×,那么转换精度为7位。14AVR的模数转换器ADC具有下列特点:10位精度;0.5LSB积分非线形误差±2LSB的绝对精度;13µs-260µs的转换时间;在最大精度下可达到每秒15kSPS的采样速率;8路可选的单端输入通道;7路差分输入通道;2路差分输入通道带有可选的10×和200×增益;ADC转换结果的读取可设置为左端对齐(LEFTADJUSTMENT);10.2.110位ADC结构15ADC的电压输入范围0~Vcc;可选择的内部2.56V的ADC参考电压源;自由连续转换模式和单次转换模式;ADC自动转换触发模式选择;ADC转换完成中断;休眠模式下的噪声抑制器(NOISECANCELER)。16ADC功能单元包括采样保持电路,以确保输入电压在ADC转换过程中保持恒定。图10-3ADC功能单元方框图1710.2.2ADC相关的I/O寄存器位76543210$07($0027)REFS1REFS0ADLARMUX4MUX3MUX2MUX1MUX0ADMUX读/写R/WR/WR/WR/WR/WR/WR/WR/W复位值00000000位7,6—REFS[1:0]:ADC参考电源选择位5—ADLAR:ADC结果左对齐选择位4..0—MUX4:0:模拟通道和增益选择1.ADC多路复用器选择寄存器—ADMUX18位7—ADEN:ADC使能位6—ADSC:ADC转换开始位5—ADATE:ADC自动转换触发允许位4—ADIF:ADC中断标志位位3—ADIE:ADC中断允许位2,0—ADPS[2:0]:ADC预分频选择2.ADC控制和状态寄存器A—ADCSRA193.ADC数据寄存器—ADCL和ADCH位15141312111098$05($0025)------ADC9ADC8ADCH$04($0024)ADC7ADC6ADC5ADC4ADC3ADC2ADC1ADC0ADCL位76543210读/写RRRRRRRR读/写RRRRRRRR复位值00000000复位值00000000ADLAR=0,ADC转换结果右对齐时,ADC结果的保存方式20ADLAR=1,ADC转换结果左对齐时,ADC结果的保存方式位15141312111098$05($0025)ADC9ADC8ADC7ADC6ADC5ADC4ADC3ADC2ADCH$04($0024)ADC1ADC0------ADCL位76543210读/写RRRRRRRR读/写RRRRRRRR复位值00000000复位值0000000021当ADC转换完成后,可以读取ADC寄存器的ADC0-ADC9得到ADC的转换的结果。如果是差分输入,转换值为二进制的补码形式。一旦开始读取ADCL后,ADC数据寄存器就不能被ADC更新,直到ADCH寄存器被读取为止。因此,如果结果是左对齐(ADLAR=1),且不需要大于8位的精度的话,仅仅读取ADCH寄存器就足够了。否则,必须先读取ADCL寄存器,再读取ADCH寄存器。ADMUX寄存器中的ADLAR位决定了从ADC数据寄存器中读取结果的格式。如果ADLAR位为“1”,结果将是左对齐;如果ADLAR位为“0”(默认情况),结果将是右对齐。读数注意224.特殊功能I/O寄存器—SFIOR位76543210$30($0050)ADTS2ADTS1ADTS0---ACMEPUDPSR2PSR10SFIOR读/写R/WR/WR/WRR/WR/WR/WR/W复位值0000000023位7..5—ADTS[2:0]:ADC自动转换触发源选择,见表9-6表9-6ADC自动转换触发源的选择ADTS[2:0]触发源000连续自由转换001模拟比较器010外部中断0011T/C0比较匹配100T/C0溢出101T/C1比较匹配B110T/C1溢出111T/C1输入捕捉241.预分频与转换时间在通常情况下,ADC的逐次比较转换电路要达到最大精度时,需要50kHz~200kHz之间的采样时钟。在要求转换精度低于10位的情况下,ADC的采样时钟可以高于200kHz,以获得更高的采样率。图10-4带预分频器的ADC时钟源10.2.3ADC应用设计要点25AVR的ADC完成一次转换的时间见表10-7。从表中可以看出,完成一次ADC转换通常需要13-14个ADC时钟。而启动ADC开始第一次转换到完成的时间需要25个ADC时钟,这是因为要对ADC单元的模拟电路部分进行初始化。表10-7ADC转换和采样保持时间转换形式采样保持时间完成转换总时间启动ADC后的第一次转换13.5个ADC时钟25个ADC时钟正常转换,单端输入1.5个ADC时钟13个ADC时钟自动触发方式2个ADC时钟13.5个ADC时钟正常转换,差分输入1.5/2.5个ADC时钟13/14个ADC时钟26输入通道:ADMUX写入参考电源:AVcc或芯片内部的2.56V参考源2.ADC输入通道和参考电源的选择27在单次转换模式下,总是在开始转换前改变通道设置。在连续转换模式下,总是在启动ADC开始第一次转换前改变通道设置。改变ADC输入通道时,应该遵循的原则283.ADC转换结果A/D转换结束后(ADIF=1),在ADC数据寄存器(ADCL和ADCH)中可以取得转换的结果。对于单端输入的A/D转换,其转换结果为:ADC=(VIN×1024)/VREF其中VIN表示选定的输入引脚上的电压,VREF表示选定的参考电源的电压。对于差分转换,其结果为:ADC=(VPOS-VNEG)×GAIN×512/VREF说明:VPOS为差分正极输入电压,VNEG为差分负极输入电压2910.2.4ADC的应用实例30本例利用ATmega16内部的ADC进行转换,转换后的结果换算成测量的电压值在4位LED数码管上显示。在数码管上显示AD采样值,实现和完成一个简易电压表的设计。通过调节W改变AD采样值实例功能31程序#includemega16.hflashunsignedcharled_7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};flashunsignedcharposition[4]={0xfe,0xfd,0xfb,0xf7};unsignedchardis_buff[4]={0,0,0,0},posit;bittime_2ms_ok;32//ADC电压值送显示缓冲区函数voidadc_to_disbuffer(unsignedintadc){unsignedchari;for(i=0;i=3;i++){dis_buff[i]=adc%10;adc/=10;}}33//Timer0比较匹配中断服务interrupt[TIM0_COMP]voidtimer0_comp_isr(void){time_2ms_ok=1;}//ADC转换完成中断服务interrupt[ADC_INT]voidadc_isr(void){unsignedintadc_data,adc_v;adc_data=ADCW;//读取ADC置换结果adc_v=(unsignedlong)adc_data*5000/1024;//换算成电压值adc_to_disbuffer(adc_v);}34voiddisplay(void)//4位LED数码管动态扫描函数{PORTA|=0x0f;PORTC=led_7[dis_buff[posit]];if(posit==3)PORTC|=0x80;PORTA&=position[posit];if(++posit=4)posit=0;}35voidmain(void){DDRA=0x0f;PORTA=0x0f;DDRC=0xff;//LED显示控制I/O端口初始化PORTC=0x00;//T/C0初始化TCCR0=0x0B;//内部时钟,64分频(4M/64=62.5KHz),CTC模式TCNT0=0x00;OCR0=0x7C;//OCR0=0x7C(124),(124+1
本文标题:第10章 模拟比较器和ADC接口
链接地址:https://www.777doc.com/doc-3196727 .html