<p style="TEXT-INDENT: 30px;">目前,单片机中嵌入的A/D一般为8位到10位,难以满足信号处理应用中高分辨率的要求;而外接高分辨率的A/D将使成本明显提高,因为A/D转换器的价格将随其位数的增加而成倍增加。本文介绍一种提高<a href="http://www.chinaicmart.com/series-PIC/PIC16C711.html" target="_blank">PIC16C711</a>单片机片内A/D分辨率的方法,将<a href="http://www.chinaicmart.com/series-PIC/PIC16C711.html" target="_blank">PIC16C711</a>片内的8位A/D提高到11位。这种方法在PIC系列的其他单片机也适用。</p><p style="TEXT-INDENT: 30px;">美国Microchip公司推出的8位单片机<a href="http://www.chinaicmart.com/series-PIC/PIC16C711.html" target="_blank">PIC16C711</a>是一种性能价格比很高的单片机。它价格低、封装小、采用CMOS工艺,具有OTP型,开发起来很方便。它内含4路8位高速A/D,将它扩展到11位后,可以大大提高单片机应用系统的性能价格比。</p><p style="TEXT-INDENT: 0px;"><b>一、硬件电路</b></p><p style="TEXT-INDENT: 30px;">实现扩展的原理图如图1所示。8个等值的精密电阻R将0~5V基准电压分割成8档,每档范围为0.625V。8个抽头分别接<a href="http://www.chinaicmart.com/series-CD4/CD4051.html" target="_blank">CD4051</a>八选一模拟开关的8个输入端,通道选择控制端C,B,A分别由<a href="http://www.chinaicmart.com/series-PIC/PIC16C711.html" target="_blank">PIC16C711</a>单片机的RB2,RB1,RB0控制。IC2和IC3为高输入阻抗运放,IC2构成跟随器,IC3构成精密差分放大器。<b><br/><img height="390" hspace="10" src="http://www.21ic.com/info/images/dpj/200106/7a.gif" width="549" vspace="10" border="0" alt=""/><br/>二、工作原理</b></p><p style="TEXT-INDENT: 30px;">实现11位A/D转换由<a href="http://www.chinaicmart.com/series-PIC/PIC16C711.html" target="_blank">PIC16C711</a>做2次8位A/D转换完成。<a href="http://www.chinaicmart.com/series-PIC/PIC16C711.html" target="_blank">PIC16C711</a>有4个模拟量输入通道RA0~RA3,这些模拟量输入通道复用1个采样保持器进入到A/D转换器。参考电压Vref可以来自外部也可以来自内部VDD,A/D转换器属于逐次逼近式,转换结果(8位)存入ADRES寄存器。在A/D转换前必然选择适当的通道,设置足够的采样时间。用户可以通过设置A/D控制寄存器ADCON0和ADCON1来控制其转换过程,同时A/D转换的状态也会在ADCON0中体现出来。</p><p style="TEXT-INDENT: 30px;">先将待转换的电压Vi送到<a href="http://www.chinaicmart.com/series-PIC/PIC16C711.html" target="_blank">PIC16C711</a>的RA0通道做一次A/D转换。根据转换所得的数字量由软件算出Vi在8档中位置,用Vi减去Vi所在档的起始电压。将所得差值放大8位,使之变为0~5V电压信号,再送给<a href="http://www.chinaicmart.com/series-PIC/PIC16C711.html" target="_blank">PIC16C711</a>的RA1通道做1次A/D转换,所得数字量是11位AD转换的低8位,而档位CBA就是高3位,从而实现11位A/D转换。</p><p style="TEXT-INDENT: 30px;">举例说明如下:假设输入电压Vi为3V,程序控制<a href="http://www.chinaicmart.com/series-PIC/PIC16C711.html" target="_blank">PIC16C711</a>的RA0通道先进行第1次A/D转换,所得结果是153,即3/5×255=153,对应8位数字量为10011001。将低5位屏蔽,得10000000,循环右移5次,得00000100,此时低3位对应的就是Vi=3V电压时的档位,即第4档,CBA=100,程序将该档位由RB2,RB1,RB0输出,作为8选一模拟开关的通道选择,使<a href="http://www.chinaicmart.com/series-CD4/CD4051.html" target="_blank">CD4051</a>输出2.5V,即5/8×4=2.5V。该电压经IC2运放跟随,再经IC3进行差分放大。设计时调整R11,R12,R13和R14的阻值,使放大倍数为8位,则得放大器IC3输出Vo=8(Vi-2.5)=8(3-2.5)=4.0V。选择RA1通道进行第2次A/D转换,结果为11001100,这就是11位A/D转换结果的低8位。档位100为11位A/D转换的高3位,合起来就是11位A/D转换的结果10011001100。</p><p style="TEXT-INDENT: 0px;"><b>三、程序</b></p><p style="TEXT-INDENT: 30px;">以下是使用<a href="http://www.chinaicmart.com/series-PIC/PIC16C711.html" target="_blank">PIC16C711</a>指令系统完成11位A/D转换的程序段。</p><p style="TEXT-INDENT: 30px;">BSF STATUS,RP0;选页面1</p><p style="TEXT-INDENT: 30px;">MOVLW 00000010B ;RA0、RA1为模拟通道</p><p style="TEXT-INDENT: 30px;">MOVWF ADCON1 ;内部参考电压</p><p style="TEXT-INDENT: 30px;">BCF STATUS,RP0 ;选页面0</p><p style="TEXT-INDENT: 30px;">MOVLW 11000001B ;选RA0通道和内部时钟</p><p style="TEXT-INDENT: 30px;">MOVWF ADCON0</p><p style="TEXT-INDENT: 30px;">MOVLW .125 ;延时125<font face="Arial">μs</font>,等待输入</p><p style="TEXT-INDENT: 30px;">CALL WAIT ;稳定</p><p style="TEXT-INDENT: 30px;">BSF ADCON0,GO ;启动A/D</p><p style="TEXT-INDENT: 30px;">LOOP BTFSC ADCON0,GO ;判断A/D完成否</p><p style="TEXT-INDENT: 30px;">GOTO LOOP</p><p style="TEXT-INDENT: 30px;">MOVF ADRES,W ;取转换结果</p><p style="TEXT-INDENT: 30px;">ANDLW 0E0 ;屏蔽低5位</p><p style="TEXT-INDENT: 30px;">MOVWF D1 ;存入D1</p><p style="TEXT-INDENT: 30px;">BCF STATUS,C</p><p style="TEXT-INDENT: 30px;">RRF D1,1 ;右移5次</p><p style="TEXT-INDENT: 30px;">RRF D1,1</p><p style="TEXT-INDENT: 30px;">RRF D1,1</p><p style="TEXT-INDENT: 30px;">RRF D1,1</p><p style="TEXT-INDENT: 30px;">RRF D1,1</p><p style="TEXT-INDENT: 30px;">MOVF D1,W</p><p style="TEXT-INDENT: 30px;">MOVWF PORTB ;档位输出</p><p style="TEXT-INDENT: 30px;">MOVLW 11001001B ;选RA1通道</p><p style="TEXT-INDENT: 30px;">MOVWF ADCON0</p><p style="TEXT-INDENT: 30px;">MOVLW .60 ;延时60<font face="Arial">μs</font></p><p style="TEXT-INDENT: 30px;"><font face="Arial">CALL WAIT</font></p><p style="TEXT-INDENT: 30px;"><font face="Arial">BSF ADCON0</font>,GO ;启动A/D</p><p style="TEXT-INDENT: 30px;">LOOP1 BTFSC ADCON0,GO ;判断A/D完成否</p><p style="TEXT-INDENT: 30px;">GOTO LOOP1</p><p style="TEXT-INDENT: 30px;">MOVF ADRES,W ;A/D转换结果存D0</p><p style="TEXT-INDENT: 30px;">MOVWF D0</p><p style="TEXT-INDENT: 30px;">WAIT MOVWF TEMP ;延时子程序</p><p style="TEXT-INDENT: 30px;">NEXT DECFSZ TEMP,1</p><p style="TEXT-INDENT: 30px;">GOTO NEXT</p><p style="TEXT-INDENT: 30px;">RETURN</p><p style="TEXT-INDENT: 30px;">用这种方法实现的11位A/D转换速度快<a href="http://www.chinaicmart.com/series-PIC/PIC16C711.html" target="_blank">PIC16C711</a>基本上都是单周期指令,在<a href="http://www.chinaicmart.com/series-4MH/4MHZ.html" target="_blank">4MHZ</a>振荡频率下指令周期1<font face="Arial">μs</font>,进行1次A/D转换最短时间20<font face="Arial">μs</font>;2次A/D转换40<font face="Arial">μs</font>;2个运放变换时间20<font face="Arial">μs×2=40μs</font>。总的转换时间为百<font face="Arial">μs</font>级。</p><p style="TEXT-INDENT: 30px;">本文介绍的方法电路简单,速度快,调试方便,已用于我们研制的单片机电阻炉温自动控制系统中,取得了预期的效果。对于其他带8位、10位A/D的单片机稍加改动均可使用,具有推广价值。 </p> |
|