📄 ——模拟比较器的应用(一).htm
字号:
style="TEXT-INDENT: 30px">信号B由电阻R3和R4分压,分压系数kB=1.25kA=0.205,也符合安全要求。如果取R4=1k<FONT
face=Arial>Ω,</FONT>就可以通过方程R4/(R3+R4)=kB求解出R3=3.88k<FONT
face=Arial>Ω(</FONT>取R3=3.9k<FONT face=Arial>Ω)</FONT>。</P>
<P
style="TEXT-INDENT: 30px">根据要求,当信号B达到或超过信号A的80%时,比较器应该输出低电平。如果采用比较器1,则信号A应该输入比较器1的正向输入端CIN1A(P0.4),信号B应该输入比较器1的反向输入端CMPREF(P0.5),LED应该接在它的输出端CMP1O(P0.6)。</P>
<P
style="TEXT-INDENT: 30px">根据要求,当信号B达到超过信号A的80%时,比较器应该输出低电平。如果采用比较器1,则信号A应该输入比较器1的正向输入端CIN1A(P0.4),信号B应该输入比较器1的反向输入端CMPREF(P0.5),LED应该接在它的输出端CMP1O(P0.6)。</P>
<P
style="TEXT-INDENT: 30px">在程序设计中,有三件事要做:首先,在主程序的初始化部分应该将比较器1的输入端设置为模拟输入状态,将比较器1的输出信号从CMP1O输出,以便控制LED,设置好比较器1的中断功能。其次,在中断向量区填写一条转移指令,引导到比较器1的中断子程序。最后,编写比较器1的中断子程序。由于比较器输出端的上升沿和下降沿均能触发中断,故在中断子程序中要根据情况分别处理,相关程序如下:</P>
<P style="TEXT-INDENT: 30px">CMP1 DATA 0ACH;比较器1控制寄存器</P>
<P style="TEXT-INDENT: 30px">P0M1 DATA 84H;P0方式寄存器1</P>
<P style="TEXT-INDENT: 30px">P0M2 DATA 85H;P0方式寄存器2</P>
<P style="TEXT-INDENT: 30px">PT0AD DATA 0F6H;P0数据输入禁能</P>
<P style="TEXT-INDENT: 30px">IEN1 DATA 0E8H;中断使能寄存器1</P>
<P style="TEXT-INDENT: 30px">EC1 BIT IEN1.5;比较器1中断使能</P>
<P style="TEXT-INDENT: 30px">CIN1A BIT P0.4;比较器1输入A(正向输出端)</P>
<P style="TEXT-INDENT: 30px">CMPREF BIT P0.5;比较器参考输入(反向输出端)</P>
<P style="TEXT-INDENT: 30px">CMP1O BIT P0.6;比较器1输出</P>
<P style="TEXT-INDENT: 30px">ORG 0000H</P>
<P style="TEXT-INDENT: 30px">LJMP MAIN;至主程序</P>
<P style="TEXT-INDENT: 30px">ORG 0063H</P>
<P style="TEXT-INDENT: 30px">LJMP CMP1;至比较器1中断子程序</P>
<P style="TEXT-INDENT: 30px">ORG 0080H</P>
<P style="TEXT-INDENT: 30px">MAIN:. ;主程序例行操作,自检、初始化等</P>
<P style="TEXT-INDENT: 30px">.</P>
<P style="TEXT-INDENT: 30px">.</P>
<P style="TEXT-INDENT: 30px">MOV
PT0AD,#30H,禁止CIN1A和CMPREF上的数字输入功能,使能比较器</P>
<P style="TEXT-INDENT: 30px">ANL P0M2,#0CFH</P>
<P style="TEXT-INDENT: 30px">ORL P0M1,#30H;开启比较器1并进行如下设置</P>
<P style="TEXT-INDENT: 30px">MOV
CMP1,#24H;正向输入为CIN1A,反向输入为CMPREF,结果输出到CMP1O</P>
<P style="TEXT-INDENT: 30px">MOV R2,#5;延时</P>
<P style="TEXT-INDENT: 30px">DELAY:DJNZ R2,DELAY</P>
<P style="TEXT-INDENT: 30px">ANL CMP1,#0FEH;清除比较器1的中断标志</P>
<P style="TEXT-INDENT: 30px">SETB EC1;使能比较器1中断,保持当前中断优先权</P>
<P style="TEXT-INDENT: 30px">SETB EA ;开中断</P>
<P style="TEXT-INDENT: 30px">. ;主程序其他内容</P>
<P style="TEXT-INDENT: 30px">.</P>
<P style="TEXT-INDENT: 30px">.</P>
<P style="TEXT-INDENT: 30px">CMP1:MOV A,CMP1;只响应下降沿引起的中断</P>
<P style="TEXT-INDENT: 30px">JB ACC.1,CMP1E</P>
<P style="TEXT-INDENT: 30px">. ;比较器1中断子程序,执行相关操作</P>
<P style="TEXT-INDENT: 30px">.</P>
<P style="TEXT-INDENT: 30px">.</P>
<P style="TEXT-INDENT: 30px">CMP1E:ANL CMP1,#0FEH;清除比较器1的中断标志</P>
<P style="TEXT-INDENT: 30px">RETI ;中断结束,返回</P>
<P style="TEXT-INDENT: 30px">2.多路独立模拟信号的监测</P>
<P
style="TEXT-INDENT: 30px">P87LPC76X系列单片机虽能有2个模拟比较器,可以输入4路模拟信号,但只有一个公共的反向输入端,这意味着各路模拟信号必须与同一个参考电压进行比较。如果各路模拟信号的监测电压互不相同,只能通过调节各路信号的分压系数的方法实现多路信号监测。如果选用1.28V的内部参考电压,可以简化外部电路。下面以一个示例说明多路独立模拟信号的监测方法。</P>
<P
style="TEXT-INDENT: 30px">有4路模拟信号须要监测,条件为:当信号A超过8V时,LED1点亮;当信号B超过2V时,LED2点亮;当信号C不足4V时,LED3点亮;当信号D不足5V时,LED4点亮。</P>
<P
style="TEXT-INDENT: 30px">电路设计,硬件电路如图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。<BR><IMG
height=425 hspace=10 src="——模拟比较器的应用(一).files/6b.gif" width=548
vspace=10 border=0><BR> <SPAN
class=main1>各路分压电阻计算:公共参考电压为1.28V,取R2=R4=R6=R8=1k<FONT
face=Arial>Ω</FONT>。</P>
<P style="TEXT-INDENT: 30px">R1=[(8/1.28)-1]R2=5.25k<FONT
face=Arial>Ω</FONT>,选用7.5k<FONT face=Arial>Ω</FONT>可调电阻。</P>
<P style="TEXT-INDENT: 30px">R3=[(2/1.28)-1]R4=0.56k<FONT
face=Arial>Ω</FONT>,选用750<FONT face=Arial>Ω</FONT>可调电阻。</P>
<P style="TEXT-INDENT: 30px">R5=[(4/1.28)-1]R6=2.13k<FONT
face=Arial>Ω</FONT>,选用3.3k<FONT face=Arial>Ω</FONT>可调电阻。</P>
<P style="TEXT-INDENT: 30px">R7=[(5/1.28)-1]R8=2.90k<FONT
face=Arial>Ω</FONT>,选用3.3k<FONT face=Arial>Ω</FONT>可调电阻。</P>
<P
style="TEXT-INDENT: 30px">由分压系数计算出来的电阻值一般都不是标称值,即使正好是标称值也不能直接采用,因为内部参考电压1.28V有10%的误差。因此,每路信号均接入一个可调电阻,通过实际调整达到预定的监测条件。</P>
<P
style="TEXT-INDENT: 30px">程序设计:主程序初始化过程中将P0口设置为4路模拟输入和4路开漏输出,以便检测4路模拟信号和控制4路LED。由于检测过程很简单,耗时也不多,可以设计成一个检测子程序,既可以在主程序中调用,也可以在定时中断子程序中调用。</P>
<P style="TEXT-INDENT: 30px">CMP1 DATA 0ACH;比较器1控制寄存器</P>
<P style="TEXT-INDENT: 30px">CMP2 DATA 0ADH;比较器2控制寄存器</P>
<P style="TEXT-INDENT: 30px">P0M1 DATA 84H;P0方式寄存器1</P>
<P style="TEXT-INDENT: 30px">P0M2 DATA 0F6H;P0数据输入禁能</P>
<P style="TEXT-INDENT: 30px">LED1 BIT P0.0;A路信号指示(低电平有效)</P>
<P style="TEXT-INDENT: 30px">LED2 BIT P0.5;B路信号指示(低电平有效)</P>
<P style="TEXT-INDENT: 30px">LED3 BIT P0.6;C路信号指示(低电平有效)</P>
<P style="TEXT-INDENT: 30px">LED4 BIT P0.7;D路信号指示(低电平有效)</P>
<P style="TEXT-INDENT: 30px">ORG 0000H</P>
<P style="TEXT-INDENT: 30px">LJMP MAIN;至主程序</P>
<P style="TEXT-INDENT: 30px">ORG 0080H</P>
<P style="TEXT-INDENT: 30px">MAIN:. ;主程序例行操作:自检、初始化等</P>
<P style="TEXT-INDENT: 30px">.</P>
<P style="TEXT-INDENT: 30px">.</P>
<P style="TEXT-INDENT: 30px">MOV PT0AD,#1EH;禁止4路模拟信号输入端上的数字输入功能</P>
<P style="TEXT-INDENT: 30px">MOV
P0M1,#0FFH;P0口设置为4路模拟输入端,4路开漏输出端</P>
<P style="TEXT-INDENT: 30px">MOV P0M2,#0E1H</P>
<P style="TEXT-INDENT: 30px">. ;主程序其他内容</P>
<P style="TEXT-INDENT: 30px">.</P>
<P style="TEXT-INDENT: 30px">.</P>
<P style="TEXT-INDENT: 30px">LOOP:LCALL TEST</P>
<P style="TEXT-INDENT: 30px">. ;主程序其他内容</P>
<P style="TEXT-INDENT: 30px">.</P>
<P style="TEXT-INDENT: 30px">LJMP LOOP</P>
<P style="TEXT-INDENT: 30px">TEST:MOV CMP2,#0;关闭比较器2</P>
<P style="TEXT-INDENT: 30px">MOV
CMP1,#28H;使能比较器1,选通CIN1A,选用内部参考电压</P>
<P style="TEXT-INDENT: 30px">MOV R2,#5</P>
<P style="TEXT-INDENT: 30px">TEST1:DJNZ R2,TEST1;延时</P>
<P style="TEXT-INDENT: 30px">MOV A,CMP1</P>
<P style="TEXT-INDENT: 30px">MOV C,ACC.1;取信号A的检测结果</P>
<P style="TEXT-INDENT: 30px">CPL C</P>
<P style="TEXT-INDENT: 30px">MOV LED1,C;控制LED1</P>
<P style="TEXT-INDENT: 30px">MOV
CMP1,#38H;使能比较器1,选通CIN1B,选用内部参考电压</P>
<P style="TEXT-INDENT: 30px">MOV R2,#5</P>
<P style="TEXT-INDENT: 30px">TEST2:DJNZ R2,TEST2,延时</P>
<P style="TEXT-INDENT: 30px">MOV A,CMP1</P>
<P style="TEXT-INDENT: 30px">MOV C,ACC.1;取信号B的检测结果</P>
<P style="TEXT-INDENT: 30px">CPL C</P>
<P style="TEXT-INDENT: 30px">MOV LED2,C;控制LED2</P>
<P style="TEXT-INDENT: 30px">MOV CMP1,#0;关闭比较器1</P>
<P style="TEXT-INDENT: 30px">MOV
CMP2,#28H;使能比较器2,选通CIN2A,选用内部参考电压</P>
<P style="TEXT-INDENT: 30px">MOV R2,#5</P>
<P style="TEXT-INDENT: 30px">TEST3:DJNZ R2,TEST3;延时</P>
<P style="TEXT-INDENT: 30px">MOV A,CMP2</P>
<P style="TEXT-INDENT: 30px">MOV C,ACC.1;取信号C的检测结果</P>
<P style="TEXT-INDENT: 30px">MOV LED3,C;控制LED3</P>
<P style="TEXT-INDENT: 30px">MOV
CMP2,#38H;使能比较器2,选通CIN2B,选用内部参考电压</P>
<P style="TEXT-INDENT: 30px">MOV R2,#5</P>
<P style="TEXT-INDENT: 30px">TEST4:DJNZ R2,TEST4;延时</P>
<P style="TEXT-INDENT: 30px">MOV A,CMP2</P>
<P style="TEXT-INDENT: 30px">MOV C,ACC.1;取信号D的检测结果</P>
<P style="TEXT-INDENT: 30px">MOV LED4,C;控制LED4</P>
<P style="TEXT-INDENT: 30px">RET</P>
<P style="TEXT-INDENT: 30px">3.一路模拟信号的多条件监测</P>
<P
style="TEXT-INDENT: 30px">在很多情况下,我们检测的模拟信号中只有路,但检测的条件不止一个。最常见的情况是对一个模拟信号同时进行上下限检测,超过上限要报警,低于下限也要报警,并分别采取不同的措施。我们以一个简单的例子来说明设计方法。</P>
<P
style="TEXT-INDENT: 30px">有一个模拟信号,电压在0~9V之间变化,正常值的范围是4~6V。有一个执行机构,它动作时可以使模拟信号慢慢升高;停止动作时,模拟信号会慢慢衰减。要求用模拟比较器设计一个简单的自动控制系统,使该模拟信号的幅度变化基本上保持在正常范围之内。</P>
<P
style="TEXT-INDENT: 30px">该系统虽然只有一个模拟信号,但有两个检测条件,我们可以把这个信号分成两路,每路检测一个条件。利用前一节介绍的方法,很容易得到图3所示电路。R1和R2对信号进行分压,输入到比较器1的CIN1A(P0.4)端口,用来进行上限检测;另一路R3和R4对信号进行分压,输入到比较器1的CIN1B(P0.3)端口,用来进行下限检测。比较器采用内部1.28V的参考电压。LED1用于上限超限报警(用P0.6控制);LED2用于下限超限报警。用P0.0输出执行机构的控制信号OUT,低电平动作,高电平停止。<BR><IMG
height=341 hspace=10 src="——模拟比较器的应用(一).files/6c.gif" width=549
vspace=10 border=0><BR></SPAN> <SPAN
class=main1>各路分压电阻计算:公共参考电压为1.28V,取R2=R4=1k<FONT
face=Arial>Ω</FONT>。</P>
<P style="TEXT-INDENT: 30px">R1=[(6/1.28)-1]R2=3.69k<FONT
face=Arial>Ω</FONT>;选用4.7k<FONT face=Arial>Ω</FONT>可调电阻。</P>
<P style="TEXT-INDENT: 30px">R3=[(4/1.28)-1]R4=2.13k<FONT
face=Arial>Ω</FONT>;选用3.3k<FONT face=Arial>Ω</FONT>可调电阻。</P>
<P
style="TEXT-INDENT: 30px">系统运行时,如果信号低于下限,则点亮LED2,进行下限超限报警,并输出低电平,启动执行机构;如果信号高于上限,则点亮LED1,进行上限在正常范围之内,则熄灭两个LED,维持执行机构的工作状态不变。在实际调试中,因为系统具有惯性,如果严格按照规定条件设置上限和下限,控制的效果反而不好,系统必然经常超限。如果上限检测条件适度低于6V(如5.8V),下限检测条件适度高于4V(如4.2V),执行机构就可以提前采取动作,使系统不至于超限。这时,LED1和LED2点亮,说明系统将要超限。</P>
<P
style="TEXT-INDENT: 30px">程序设计:主程序初始化过程中将P0口设置为2路模拟输入和6路开漏输出,以便进行上限检测和下限检测,控制2路LED和1路执行机构。由于检测过程很简单,耗时也不多,可以设计成1个检测子程序,既可以在主程序中调用,也可以在定时中断子程序中调用。</P>
<P style="TEXT-INDENT: 30px">CMP1 DATA 0ACH;比较器1控制寄存器</P>
<P style="TEXT-INDENT: 30px">P0M1 DATA 84H;P0方式寄存器1</P>
<P style="TEXT-INDENT: 30px">P0M2 DATA 85H;P0方式寄存器2</P>
<P style="TEXT-INDENT: 30px">PT0AD DATA 0F6H;P0数据输入禁能</P>
<P style="TEXT-INDENT: 30px">LED1 BIT P0.6;上限超限报警(低电平有效)</P>
<P style="TEXT-INDENT: 30px">LED2 BIT P0.0;执行机构控制输出(低电平有效)</P>
<P style="TEXT-INDENT: 30px">FLAG DATA 20H;标志字节</P>
<P style="TEXT-INDENT: 30px">UP BIT FLAG.0;上限控制结果</P>
<P style="TEXT-INDENT: 30px">DOWN BIT FLAG.1;下限检测结果</P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -