广州周立功单片机发展有限公司Tel:(020)873097638730977Fax:38730925转换器的输入范围所以它的量程切换基本上是信号衰减倍数切换的过程二自动量程基本控制流程自动量程转换由初设量程开始逐级比较直至选出最合适提量程为止自动量程转换的操作流程如上图所示继电器或其它控制开关从闭合转变为断开或从断开转变为闭合有一个短暂的过程所以在每次改变量程之后要延时一定的时间然后再进行正式的测量和判断为了避免在两种量程的交叉点上可能出现的跳动还应考虑低量程的超量程比较值和高量程的欠量程比较值之间有一定的重叠范围三简单的电压量程控制自动量程开始测量程序欠量程?超量程?结束最低量程?最高量程?NN降量程处理升量程处理YYNNY过载报警显示Y广州周立功单片机发展有限公司Tel:(020)873097638730977Fax:38730925=Vin*1S2单独合上Vout=Vin*(R2+R3+R4)/(R1+R2+R3+R4)S3单独合上Vout=Vin*(R3+R4)/(R1+R2+R3+R4)S4单独合上Vout=Vin*(R4)/(R1+R2+R3+R4)选择R1R2R3R4由式中可以看出Vout在一定范围时电阻网络衰减程度越大其可输入电压Vin范越大只要把R1R2R3R4的参数选好然后由S1S2S3S4选择测量电压输出端即完成量程选择例如表头DVM输入电压为05伏设DVM输入阻抗无穷大要求测量电压量程有5V50V100V250V档输入电阻1M则有R4510000002502000020KR351000000100R450K20K30KR25100000050R4R3100K20K30K50KR11000000R4R3R21000K20K30K50K900K自动量程控制描述RANGE为当前量程变量VT为测量电压变量S1S4为量程档S1S4开关对应的量程档N2N4为量对应量程档的欠量程值RANGES4/*预选250伏档进行电压测量*/LOOP:VTVout/*进行电压测量*/SWITCHRANGE/*根据当前量程进行调整*/{CASES4:IF(VTN4)RANGE--;/*欠量程量程降一档*/IF(VT5V)OUTTEST;/*最高量程时Vout5V,超负载*/BREAK;CASES3:IF(VTN3)RANGE--;IF(VT5V)RANGE++;/*超本档量程量程升一档*/BREAK;CASES2:IF(VTN2)RANGE--;广州周立功单片机发展有限公司Tel:(020)873097638730977Fax:38730925(VT5V)RANGE++;BREAK;CASES1:IF(VT5V)RANGE++;}GOTOLOOP;开关的选择采用继电器切换优点是导通阻抗小开路阻抗大但其动作速度慢也容易老化四自动量程电压表原理图由于断电器存在着体积大动作速度慢驱动电流大等缺点通常用运算放大技术来实现自动量程切换机制先把输入电压进行衰减不管输入测量电压多大都是通过同一阻抗网络进行分压最终结果是大电压时分得的电压较大反之则较小然后通过运算放大电路将此电压信号放大选择不同的放大倍数使输出电压在DVM的测量范围内从实现不同量程的电压测量广州周立功单片机发展有限公司Tel:(020)873097638730977Fax:38730925=(5/N)*20(N为放大倍数)MC14051选通0最大量程范围0通道83V1通道50V2通道20V3通道5V广州周立功单片机发展有限公司Tel:(020)873097638730977Fax:38730925程序清单/*文件名DVM.C自动量程直流电压测量采用模块化编程主模块主要负责调度和接口各模块对应于相应硬件或相应功能*/#includeReg764.h#defineucharunsignedchar#defineuintunsignedint/*DVM.C模块的全局变量*/ucharrange;/*定义量程控制变量即运放放大倍数参数*//*DVM_DISP.C模块的函数和变量声明*/externvoidDISP_Fill(ucharc);/*全部填充函数*/externbitDISP_Coding();/*显示缓冲区译*/externvoidDISP_Send();/*发送显示缓冲区的数据*/externuchardisp_ram[5];/*显示缓冲区*/开始显示器自检AD控制通道自检置量程初值AD转换测量转换并显示自动量程判断超载报警提示若不是最低量程则隆一级量程是最高量程升量程一级欠量程超量程NY广州周立功单片机发展有限公司Tel:(020)873097638730977Fax:38730925*状态发光二极管使用的寄存器*/externbitL1;/*对应于各状态发光二极管*/externbitL2;externbitL3;externbitL4;externbitL5;externbitL6;/*DVM_ADC.C模块的函数和变量声明*/externbitADC_HChk();/*AD通道自检AD控制输出通道*/externucharADC_AdcN();/*AD转换进行10次AD转换返回去极值平均滤波值*/externbitADC_ORange();/*检测是否超量程*//*函数短延时MAIN_DelayS(uchari)功能延时i*310us*/voidMAIN_DelayS(uchari){ucharj;for(;i0;i--)for(j=0;j100;j++);}/*函数长软件延时MAIN_DelayL(uchari)功能进行延时i*20.3ms*/voidMAIN_DelayL(uchari){ucharl;uintj;for(l=0;li;l++)/*1us机器周期时一次有20.355ms*/for(j=0;j4000;j++);}/*函数切换量程描述量程有04共五档输入量程i应在04之间硬件操作对应于P0.1P0.2P0.3*/APPL_Range(){range=range&0x07;/*rage不能大于7,否则会破坏其它IO*/广州周立功单片机发展有限公司Tel:(020)873097638730977Fax:38730925(range4)range=0;/*量程选择错误复位为0档*/P0=P0&0xf8;/*将其值放入P0.1P0.2P0.3*/P0=P0|range;L1=1;L2=1;L3=1;L4=1;switch(range)/*指示当前量程*/{case3:L4=0;break;case2:L4=0;L3=0;break;case1:L4=0;L3=0;L2=0;break;case0:L4=0;L3=0;L2=0;L1=0;break;}}/*函数APPL_Dcv()描述电压测量对测量量实行自动量程切换*/voidAPPL_Dcv(){ucharad;floatmuli;/*ad为AD转换结果muli为运算所要倍数*/bitrange_ok;/*量程合适标志为1时表示量程合适*/disp_staled=0xff;/*状态灯全灭*//*选择最高量程83V为默认量程*/range=0;muli=16.33;range_ok=0;/*测量电压*/while(1){floatvin;uintbak;if(range_ok==0)APPL_Range();/*量程末合适输出量程控制信号*/L6=0;/*状态灯L6亮表示当前是测电压*/range_ok=1;ad=ADC_AdcN();/*进行AD转换*//*Vin=((ad/255)*VCC/N)*20;ad为AD转换值N为运放电路放大倍数*//*设muli=(Vcc/5)*(20/N)则Vin=(ad/51)*muli*/vin=(float)ad/51;/*运算显示数据1/255*5=1/51*/广州周立功单片机发展有限公司Tel:(020)873097638730977Fax:38730925=vin*muli;if(vin10){disp_ram[1]=vin/10;bak=vin;disp_ram[2]=bak%10;bak=vin*10;disp_ram[3]=bak%10;DISP_Coding();disp_ram[2]&=0x7f;/*置小数点位*/disp_ram[0]=0xff;}else{bak=vin;disp_ram[1]=bak%10;bak=vin*10;disp_ram[2]=bak%10;bak=vin*100;disp_ram[3]=bak%10;DISP_Coding();disp_ram[1]&=0x7f;/*置小数点位*/disp_ram[0]=0xff;}DISP_Send();/*显示输出*//*判断超量程*/if(ad==0&&ADC_ORange()==1){range_ok=0;if(range0)range--;/*超量程未到100V档升量程*/else{/*若超过100V,显示溢出*/disp_staled=0xff;disp_ram[0]=0xa3;/*显示'out-',表示溢出*/disp_ram[1]=0xe3;disp_ram[2]=0x87;disp_ram[3]=0xbf;DISP_Send();}}/*判断是否可降低量程*/else{广州周立功单片机发展有限公司Tel:(020)873097638730977Fax:38730925(range){case0:if(ad0x85){range++;range_ok=0;}/*小于50伏?*/elsemuli=16.33;break;case1:if(ad0x55){range++;range_ok=0;}/*小于20伏?*/els