模拟比较器的应用(一)
内容导读:
\[编者按\] 全文篇幅较长,分4次连载在本刊第2期至第5期上。第2期:模拟比较器用于超限监测;第3期:模拟比较器用于直流信号的A/D转换;第4期:模拟比较器用于交流信号的A/D转换;第5期:模拟比较器用于参量信号的A/D转换。模拟比较器的应用(一)华东地质学院周航慈涂水林摘要介绍模拟比较器在超限监测、直流信号的A/D转换、交流信号的A/D转换和传感器参量信号的A/D转换中的使用方法,并结合内含模拟比较器的P87LPC76X系列单片机介绍相应的硬件电路设计方法和软件设计思路。关键词模拟比较器A/D转换超限监测 模拟比较器通常用来监测模拟信号的变化情况。如果超过某个限度,就输出一个对应的逻辑信号;如果需要对模拟信号进行更精细的分辨,必须采用A/D转换芯片或者内含A/D部件的单片机来进行A/D转换。当对模拟信号的A/D转换精度要求不是很高(如精度要求在1%左右),每秒采样次数不超过20次时,利用内含模拟比较器的单片机来完成A/D转换将明显降低系统的硬件成本,这在很多家电产品中是非常有意义的。本文采用内含模拟比较器的P87LPC76X系列单片机作为讨论对象,在介绍模拟比较器的一般用法后,重点介绍利用模拟比较器完成A/D转换的实现方法和注意事项。一、 模拟比较器用于超限监测 1. 两路相关模拟信号的监测将两路动态变化的模拟信号分别输入模拟比较器的正向输入端和反向输入端,从输出端就可以监测到它们之间的相互关系。有时可能需要在输入信号和单片机的模拟输入端之间加入分压电阻,以满足单片机输入端的安全需要和两路信号之间关系判断的需要。这一类问题的设计比较简单,示例如下。已知条件:信号A在10~20V之间变化,信号B在6~15V之间变化。正常情况下,信号B的幅度小于信号A幅度的80%。设计要求:当信号B达到或超过信号A的80%时,输出低电平(使一个LED发光),并在信号B达到信号A的80%瞬间触发一个中断子程序,以便在中断子程序中作相关处理。设计过程:硬件电路如图1所示。由于两路信号均超过了5V,不允许直接加到单片机的输入端。为此,信号A通过分压电路输入到比较器的正向输入端CIN1A(P0.4),信号B通过分压电路输入到比较器的反向输入端CMPREF(P0.5)。设两路信号的瞬时值分别为uA和uB,分压系数分别为kA和kB,加到单片机输入端的信号电压最好不要超过4V,则: uAkA< 4 uBkB< 4 图 1两路相关模拟信号的监测电路将两路信号的最大值代入上式,可以求出两路分压系数取值限度: kA< 4V / 20V=0.200 kB< 4V / 15V=0.267 根据中断触发条件,有:uB=0.8uA,信号B达到信号A的80%;uBkB=uAkA,这时加到模拟比较器输入端的信号幅度相同,引起比较器输出端反转。由此得到:0.8 uAkB=uAkA,即kB=1.25kA。信号A由电阻R1和R2分压,则分压系数kA= R2/(R1+R2)。取R1=5.1kΩ,R2=1kΩ,得到分压系数kA= 1/(5.1+1)=0.164,小于0.200,符合安全要求。信号B由电阻R3和R4分压,分压系数kB=1.25kA=0.205,也符合安全要求。如果取R4=1kΩ,就可以通过方程R4/(R3+R4)= kB求解出R3=3.88kΩ(取R3=3.9 kΩ)。根据要求,当信号B达到或超过信号A的80%时,比较器应该输出低电平。如果采用比较器1,则信号A应该输入比较器1的正向输入端CIN1A(P0.4),信号B应该输入比较器1的反向输入端CMPREF(P0.5),LED应该接在它的输出端CMP1O(P0.6)。在程序设计中,有三件事要做:首先,在主程序的初始化部分应该将比较器1的输入端设置为模拟输入状态,将比较器1的输出信号从CMP1O输出,以便控制LED,设置好比较器1的中断功能。其次,在中断向量区填写一条转移指令,引导到比较器1的中断子程序。最后,编写比较器1的中断子程序。由于比较器输出端的上升沿和下降沿均能触发中断,故在中断子程序中要根据情况分别处理,相关程序如下: CMP1〖〗DATA〖〗0ACH;比较器 1控制寄存器〖〗P0M1〖〗DATA〖〗84H;P0方式寄存器 1[]P0M2〖〗DATA〖〗85H;P0方式寄存器 2[]PT0AD〖〗DATA〖〗0F6H;P0数据输入禁能[]IEN1〖〗DATA〖〗0E8H;中断使能寄存器 1[]EC1〖〗BIT〖〗IEN1.5;比较器 1中断使能[]CIN1A〖〗BIT〖〗P0.4;比较器1输入 A(正向输出端)[]CMPREF〖〗BIT〖〗P0.5;比较器参考输入(反向输出端)[]CMP1O〖〗BIT〖〗P0.6;比较器1输出〖〗〖2〗ORG〖〗0000H〖2〗LJMP〖〗MAIN;至主程序〖〗〖2〗ORG〖〗0063H〖2〗LJMP〖〗CMP1;至比较器1中断子程序〖〗〖2〗ORG〖〗0080H〖1〗MAIN:〖〗.〖3〗;主程序例行操作:自检、初始化等〖2〗.〖2〗.〖2〗MOV〖〗PT0AD,#30H;禁止CIN1A和CMPREF上;的数字输入功能,使能比较;器〖2〗ANL〖〗P0M2,#0CFH〖2〗ORL〖〗P0M1,#30H;开启比较器1并进行如下设;置〖〗〖2〗MOV〖〗CMP1,#24H;正向输入为CIN1A,反向输;入为CMPREF,结果输出到;CMP1O〖2〗MOV〖〗R2,#5;延时〖1〗DELAY:〖〗DJNZ〖〗R2,DELAY〖2〗ANL〖〗CMP1,#0FEH;清除比较器1的中断标志〖2〗SETB〖〗EC1;使能比较器1中断,保持当前中断优;先权〖〗〖2〗SETB 〖〗EA;开中断〖〗〖2〗.〖3〗;主程序其他内容〖〗〖2〗.〖〗〖2〗.〖〗〖1〗CMP1:〖〗MOV〖〗A,CMP1;只响应下降沿引起的中断〖〗〖2〗JB〖〗ACC.1,CMP1E〖〗〖2〗.〖3〗;比较器1中断子程序,执行相关操作〖〗〖2〗.〖〗〖2〗.〖〗〖1〗CMP1E:〖〗ANL〖〗CMP1,#0FEH;清除比较器1的中断标志〖〗〖2〗RETI〖〗;中断结束,返回2. 多路独立模拟信号的监测 P87LPC76X系列单片机虽能有2个模拟比较器,可以输入4路模拟信号,但只有一个公共的反向输入端,这意味着各路模拟信号必须与同一个参考电压进行比较。如果各路模拟信号的监测电压互不相同,只能通过调节各路信号的分压系数的方法实现多路信号监测。如果选用1.28V的内部参考电压,可以简化外部电路。下面以一个示例说明多路独立模拟信号的监测方法。有4路模拟信号须要监测,条件为:当信号A超过8V时,LED1点亮;当信号B超过2V时,LED2点亮;当信号C不足4V时,LED3点亮;当信号D不足5V时,LED4点亮。电路设计:硬件电路如图2所示。A路模拟信号通过电阻R1和R2分压后输入到比较器1的正向输入端CIN1A(P0.4);B路模拟信号通过电阻R3和R4分压后输入到比较器1的正向输入端CIN1B(P0.3);C路模拟信号通过电阻R5和R6分压后输入到比较器2的正向输入端CIN2A(P0.2);D路模拟信号通过电阻R7和R8分压后输入到比较器2的正向输入端CIN2B(P0.1)。P0口的另外4个端口用来驱动4个LED。图 2四路模拟信号的监测电路各路分压电阻计算:公共参考电压为1.28V,取R2=R4=R6=R8=1kΩ。 R1=\[(8/1.28)-1\]R2=5.25kΩ,选用7.5kΩ可调电阻。 R3=\[(2/1.28)-1\]R4=0.56kΩ,选用750Ω可调电阻。 R5=\[(4/1.28)-1\]R6=2.13kΩ,选用3.3kΩ可调电阻。 R7=\[(5/1.28)-1\]R8=2.90kΩ,选用3.3kΩ可调电阻。由分压系数计算出来的电阻值一般都不是标称值,即使正好是标称值也不能直接采用,因为内部参考电压1.28V有10%的误差。因此,每路信号均接入一个可调电阻,通过实际调整达到预定的监测条件。程序设计:主程序初始化过程中将P0口设置为4路模拟输入和4路开漏输出,以便检测4路模拟信号和控制4路LED。由于检测过程很简单,耗时也不多,可以设计成一个检测子程序,既可以在主程序中调用,也可以在定时中断子程序中调用。 CMP1〖〗DATA〖〗0ACH;比较器 1控制寄存器〖〗CMP2〖〗DATA〖〗0ADH;比较器 2控制寄存器〖〗P0M1〖〗DATA〖〗84H;P0方式寄存器 1〖〗P0M2〖〗DATA〖〗85H;P0方式寄存器 2〖〗PT0AD〖〗DATA〖〗0F6H;P0数据输入禁能〖〗LED1〖〗BIT〖〗P0.0;A路信号指示(低电平有效)〖〗LED2〖〗BIT〖〗P0.5;B路信号指示(低电平有效)〖〗LED3〖〗BIT〖〗P0.6;C路信号指示(低电平有效)〖〗LED4〖〗BIT〖〗P0.7;D路信号指示(低电平有效)〖〗〖2〗ORG〖〗0000H〖2〗LJMP〖〗MAIN;至主程序〖〗〖2〗ORG〖〗0080H〖1〗MAIN:〖〗.〖〗;主程序例行操作:自检、初始化等〖〗〖2〗.〖〗〖2〗.〖〗〖2〗MOV〖〗PT0AD,#1EH;禁止4路模拟信号输入端;上的数字输入功能〖〗〖2〗MOV〖〗P0M1,#0FFH;P0口设置为4路模拟输入;端,4路开漏输出端〖〗〖2〗MOV〖〗P0M2,#0E1H〖2〗.〖4〗;主程序其他内容〖〗〖2〗.〖2〗.〖1〗LOOP:〖〗LCALL〖〗TEST〖〗〖2〗.〖4〗;主程序其他内容〖〗〖2〗.〖2〗LJMP〖〗LOOP〖1〗TEST:〖〗MOV〖〗CMP2,#0;关闭比较器2〖〗〖〗MOV〖〗CMP1,#28H;使能比较器1,选通CIN1A, ;选用内部参考电压〖〗〖〗MOV〖〗R2,#5〖1〗TEST1:〖〗DJNZ〖〗R2,TEST1;延时〖2〗MOV〖〗A,CMP1〖2〗MOV〖〗C,ACC.1;取信号A的检测结果〖2〗CPL〖〗C〖2〗MOV〖〗LED1,C;控制LED1〖2〗MOV〖〗CMP1,#38H;使能比较器1,选通CIN1B, ;选用内部参考电压〖2〗MOV〖〗R2,#5〖1〗TEST2:〖〗DJNZ〖〗R2,TEST2;延时〖〗〖2〗MOV〖〗A,CMP1〖2〗MOV〖〗C,ACC.1;取信号B的检测结果〖2〗CPL〖〗C〖2〗MOV〖〗LED2,C;控制LED2〖2〗MOV〖〗CMP1,#0;关闭比较器1〖2〗MOV〖〗CMP2,#28H;使能比较器2,选通CIN2A, ;选用内部参考电压〖2〗MOV〖〗R2,#5〖1〗TEST3:〖〗DJNZ〖〗R2,TEST3;延时〖2〗MOV〖〗A,CMP2〖2〗MOV〖〗C,ACC.1;取信号C的检测结果〖2〗MOV〖〗LED3,C;控制LED3〖2〗MOV〖〗CMP2,#38H;使能比较器2,选通CIN2B, ;选用内部参考电压〖2〗MOV〖〗R2,#5〖1〗TEST4:〖〗DJNZ〖〗R2,TEST4;延时〖2〗MOV〖〗A,CMP2〖2〗MOV〖〗C,ACC.1;取信号D的检测结果〖2〗MOV〖〗LED4,C;控制LED4〖2〗RET3. 一路模拟信号的多条件监测在很多情况下,我们检测的模拟信号只有一路,但检测的条件不止一个。最常见的情况是对一个模拟信号同时进行上下限检测,超过上限要报警,低于下限也要报警,并分别采取不同的措施。我们以一个简单的例子来说明设计方法。有一个模拟信号,电压在0~9V之间变化,正常值的范围是4~6V。有一个执行机构,它动作时可以使模拟信号慢慢升高;停止动作时,模拟信号会慢慢衰减。要求用模拟比较器设计一个简单的自动控制系统,使该模拟信号的幅度变化基本上保持在正常值范围之内。该系统虽然只有一个模拟信号,但有两个检测条件,我们可以把这个信号分成两路,每路检测一个条件。利用前一节介绍的方法,很容易得到图3所示电路。R1和R2对信号进行分压,输入到比较器1的CIN1A(P0.4)端口,用来进行上限检测;另一路R3和R4对信号进行分压,输入到比较器1的CIN1B(P0.3)端口,用来进行下限检测。比较器采用内部1.28V的参考电压。LED1用于上限超限报警(用P0.6控制);LED2用于下限超限报警。用P0.0输出执行机构的控制信号OUT,低电平动作,高电平停止。图 3一路模拟信号的多条件监测电路各路分压电阻计算:公共参考电压为1.28V,取R2=R4=1kΩ。 R1=\[(6/1.28)-1\]R2=3.69kΩ;选用4.7kΩ可调电阻。 R3=\[(4/1.28)-1\]R4=2.13kΩ;选用3.3kΩ可调电阻。系统运行时,如果信号低于下限,则点亮LED2,进行下限超限报警,并输出低电平,启动执行机构;如果信号高于上限,则点亮LED1,进行上限超限报警,并输出高电平,关闭执行机构;如果信号在正常范围之内,则熄灭两个LED,维持执行机构的工作状态不变。在实际调试中,因为系统具有惯性,如果严格按照规定条件设置上限和下限,控制的效果反而不好,系统必然经常超限。如果上限检测条件适度低于6V(如5.8V),下限检测条件适度高于4V(如4.2V),执行机构就可以提前采取动作,使系统不至于超限。这时,LED1和LED2点亮,说明系统将要超限。程序设计:主程序初始化过程中将P0口设置为2路模拟输入和6路开漏输出,以便进行上限检测和下限检测,控制2路LED和1路执行机构。由于检测过程很简单,耗时也不多,可以设计成1个检测子程序,既可以在主程序中调用,也可以在定时中断子程序中调用。 CMP1〖〗DATA〖〗0ACH;比较器 1控制寄存器〖〗P0M1〖〗DATA〖〗84H;P0方式寄存器 1〖〗P0M2〖〗DATA〖〗85H;P0方式寄存器 2〖〗PT0AD〖〗DATA〖〗0F6H;P0数据输入禁能〖〗LED1〖〗BIT〖〗P0.6;上限超限报警(低电平有效)〖〗LED2〖〗BIT〖〗P0.7;下限超限报警(低电平有效)〖〗OUT〖〗BIT〖〗P0.0;执行机构控制输出(低电平有效)〖〗FLAG〖〗DATA〖〗20H;标志字节〖〗UP〖〗BIT〖〗FLAG.0;上限检测结果〖〗DOWN〖〗BIT〖〗FLAG.1;下限检测结果〖2〗ORG〖〗0000H〖2〗LJMP〖〗MAIN;至主程序〖〗〖2〗ORG〖〗0080H〖1〗MAIN:〖〗.〖3〗;主程序例行操作:自检、初始化等〖2〗.〖2〗.〖2〗MOV〖〗PT0AD,#18H;禁止2路模拟信号输入端;上的数字输入功能〖〗〖2〗MOV〖〗P0M1,#0FFH;P0口设置为2路模拟输入;端,6路开漏输出端〖2〗MOV〖〗P0M2,#0E7H〖2〗.〖3〗;主程序其他内容〖2〗.〖2〗.〖1〗LOOP:〖〗LCALL〖〗TEST〖2〗.〖3〗;主程序其他内容〖2〗.〖2〗.〖2〗LJMP〖〗LOOP 〖1〗TEST:〖〗MOV〖〗CMP1,#28H;使能比较器1,选通CIN1A,;选用内部参考电压〖2〗MOV〖〗R2,#5〖1〗TEST1:〖〗DJNZ〖〗R2,TEST1;延时〖2〗MOV〖〗A,CMP1〖2〗MOV〖〗C,ACC.1;取上限的检测结果〖2〗MOV〖〗UP,C;保存上限的检测结果〖2〗MOV〖〗CMP1,#38H;使能比较器1,选通CIN1B,;选用内部参考电压〖2〗MOV〖〗R2,#5〖1〗TEST2:〖〗DJNZ〖〗R2,TEST2;延时〖2〗MOV〖〗A,CMP1〖2〗MOV〖〗C,ACC.1;取下限的检测结果〖2〗MOV〖〗DOWN,C;保存下限的检测结果〖2〗MOV〖〗A,FLAG;取检测结果〖2〗ANL〖〗A,#3;将两个结果进行综合判断〖2〗JNZ〖〗TEST3〖2〗CLR〖〗LED2;低于下限,点亮LED2,进行报警〖2〗SETB〖〗LED1;熄灭LED1〖2〗CLR〖〗OUT;启动执行机构〖2〗RET〖1〗TEST3:〖〗CJNE〖〗A,#3,TEST4〖2〗CLR〖〗LED1;高于上限,点亮LED1,进行报警〖2〗SETB〖〗LED2;熄灭LED2〖2〗SETB〖〗OUT;关闭执行机构〖2〗RET〖1〗TEST4:〖2〗CJNE〖〗A,#2,TEST5〖2〗SETB〖〗LED1;正常范围,熄灭LED1〖2〗SETB〖〗LED2;熄灭LED2,执行机构维持现状〖2〗RET〖1〗TEST5:〖〗SETB〖〗LED1;故障状态,点亮LED1〖2〗SETB〖〗LED2;点亮LED2〖2〗SETB〖〗OUT;关闭执行机构〖2〗RET在程序中,我们将2次检测的结果进行综合考虑,就有4种情况。其中3种情况是合理的,分别进行对应的控制操作。有1种情况是不合理的:上限检测得到高电平,说明信号超过上限;下限检测得到低电平,说明信号低于下限。两个检测结果互相矛盾,这在现实情况里是不可能的。惟一能够解释这种检测结果的原因是电路出现故障。例如:当R2发生开路故障,而信号电压下降到4V以下时,就会同时检测到2个报警信号。同样,当R3开路和信号电压上升到6V以上时,也会同时检测到2个报警信号。综合判断可以发现故障状态,以便采取安全措施(关闭执行机构)。(未完待续)
标签:
来源:单片机与嵌入式系统应用 作者:华东地质学院 周航慈 涂水林 时间:2006/2/12 0:00:00