基于单片机的高精度直流电流表的设计与实现.doc
第二章 总体方案设计2.1数字电流表的工作原理用单片机及其扩展的外部电路先做成一个理想电压表3,图1中用G表示。由于通常所说的电流表是指灵敏电流计其量程太小,不能直接测量电流,仅用于检测有无电流和电流的方向,所以要想得到一个有多量程或量程较大的电流表需要将一个理想电压表改装而成。本设计是用一个内阻视为无穷大的电压表并联分流电阻而成的数字电流表。待测电流I随搬动开关K的位置而流过R1或R2,因而本电流表的两个量程就取决于G的满量程电压和R1、R2的阻值,记G的满量程电压为Ug,根据欧姆定律Ug=RgIg,若Ug和Rg已知则Ig就是电流表的满量程电流。2.2方案比较及方案选择方案一:选用内置AD转换器的单片机如MSP430系列作为核心处理器,实现本设计的需求,此方案的好处在于,所需芯片、外围电路较少,但对程序要求比较高。显示 单片机 MSP430信号输入信号放大方案二:方案二是选用ADC0809为转换芯片和单片机组成的系统,ADC0809是采样频率为8位的、以逐次逼近原理进行模数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换,它的输出为并行输出。且功耗低,工作温度范围广转换时间较快为100us,具有转换起停控制端。信号输入 MCUSTC89C52 单片机档位选择数码管显示信号放大A/D转换2.3方案选择通过比较两种方案,采用方案二ADC0809转换芯片来完成本次设计,他功耗低,模拟输入电压范围05V,不需零点和满刻度校准,换时间快,具有转换起停控制端,且并行输出单片机引脚也够,所以本次设计采用方案二。 2.4 功能要求1、数字电流表在平常工作环境中能良好工作2、能测020mA电流,至少能达0.1%的精度3、要求掌握I/V信号转换,A/D转换器的使用和数据采集系统的设计4、电流表能数字显示,且由单片机处理采集数据并驱动LED显示2.5计思路1、根据设计要求,选择STC89C52单片机作为核心控制器件。 2、A/D 转换采用ADC0809。与单片机的接口为P1口的高四位引脚。 3、采用数码管显示。4、又P0口输出显示数据 。第三章 单元模块设计3.1各单元模块功能介绍及电路设计3.1.1高共模抑制比放大电路如下图,由双运放组成的同相输入高共模抑制比放大电路,其闭环输出可表示为:为使共模输入为0,可令R1/R2=R4/R3,此时电路的差动闭环增益为Kd=1+R1/R2, U0=Kd(U1-U2); 下图即Kd=11,U0=11(U1-U2);第二级为同相放大电路,放大倍数可通过电位器调节。3.1.2数模转换模块ADC0809美国国家半导体公司生产的一种 8 位分辨率、双通道 A/D 转换芯片。由于它体积小,兼容性强,性价比高而深受单片机爱好者及企业欢迎,其目前已经有很高的普及率。3.1.3单片机周边电路复位电路与晶振电路(12Mhz),保证单片机正常运行3.1.4显示电路采用6位LED数码管显示,P0口为段选,P2口为位选,P0口有8个1K上拉电阻3.2电路参数的计算及元器件的选择3.2.1单片机STC89C52STC52 是美国ATMEL 公司生产的低电压,高性能CMOS 8 位单片机,片内含8k bytes 的可反复擦写的只读程序存 储器(PEROM)和256 bytes 的随机存取数据存储器(RAM ),器件采用ATMEL 公司的高密度、非易失性存储技术生产, 与标准MCS-51 指令系统及8052 产品引脚兼容,片内置通用8 位 央处理器(CPU)和Flash 存储单元,功能强大AT89C52 单片机适合于许多较为复杂控制应用场合。 主要性能参数 ·与MCS-51 产品指令和引脚完全兼容·8k 字节可 擦写Flash 闪速存储器 ·1000 次擦写周期 ·全静态操作:0Hz24MHz ·三级加密程序存储器 ·256 ×8 字节内部RAM ·32 个可编程I O 口线 ·3 个16 位定时计数器 ·8 个 断源 ·可编程串行UART 通道 ·低功耗空闲和掉电模式 功能特性概述 STC89C52 提供以下标准功能:8k 字节Flash 闪速存储器,256 字节内部RAM,32 I O 口线,3 个16位定时计数器,一个6 向量两级 断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,STC89C52 可降至0Hz 的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU 的工作,但允许RAM,定时计数器,串行通信口及中断系统继续工作。掉电方式保存RAM 中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。3.2.2 ADC0809 ADC0809 是带有8 位A/D 转换器、8 路多路开关以及微处理机兼容的控制逻辑的CMOS 组件。它是逐次逼近式A/D 转换器,可以和单片机直接接口。(1)ADC0809 的内部逻辑结构由下图可知,ADC0809 由一个8 路模拟开关、一个地址锁存与译码器、一个A/D 转换器和一个三态输出锁存器组成。多路开关可选通8 个模拟通道,允许8 路模拟量分时输入,共用A/D 转换器进行转换。三态输出锁器用于锁存A/D 转换完的数字量,当OE 端为高电平时,才可以从三态输出锁存器取走转换完的数据。(2) ADC0809 引脚结构ADC0809 各脚功能如下:D7-D0:8 位数字量输出引脚。IN0-IN7:8 位模拟量输入引脚。VCC:+5V 工作电压。GND:地。REF(+):参考电压正端。REF(-):参考电压负端。START:A/D 转换启动信号输入端。ALE:地址锁存允许信号输入端。(以上两种信号用于启动A/D 转换).EOC:转换结束信号输出引脚,开始转换时为低电平,当转换结束时为高电平。OE:输出允许控制端,用以打开三态数据输出锁存器。CLK:时钟信号输入端(一般为500KHz)。xiaoyllyA、B、C:地址输入线。ADC0809 对输入模拟量要求:信号单极性,电压范围是05V,若信号太小,必须进行放大;输入的模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需在输入前增加采样保持电路。地址输入和控制线:4 条ALE 为地址锁存允许输入线,高电平有效。当ALE 线为高电平时,地址锁存与译码器将A,B,C 三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进转换器进行转换。A,B 和C 为地址输入线,用于选通IN0IN7 上的一路模拟量输入。通道选择表如下表所示。C B A 选择的通道0 0 0 IN00 0 1 IN10 1 0 IN20 1 1 IN31 0 0 IN41 0 1 IN51 1 0 IN61 1 1 IN7数字量输出及控制线:11 条ST 为转换启动信号。当ST 上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D 转换;在转换期间,ST 应保持低电平。EOC 为转换结束信号。当EOC 为高电平时,表明转换结束;否则,表明正在进行A/D 转换。OE 为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。OE1,输出转换得到的数据;OE0,输出数据线呈高阻状态。D7D0 为数字量输出线。CLK 为时钟输入信号线。因ADC0809 的内部没有时钟电路,所需时钟信号必须由外界提供,通常使用频率为500KHZ,VREF(),VREF()为参考电压输入。3.2.3放大芯片UA741 741放大器为运算放大器中最常使用的一种,拥有反相向与非反相两输入,由输入端输入欲被放大的电流或电压信号,经放大后由输出端输出。放大器作用的最大特点为需要一对同样大小的正负电源,其值由正负12V至正负18V不等,而一般使用正负15的电压。UA741运算放大器的外型与管脚配置分别如下图。 图1:放大器外型 图2:放大器管脚 UA741运算放大器使用时需于7、4管脚供应一对同等大小的正负电源电压+Vdc与-Vdc,一旦于2、3管脚即两输入端间电压差存在,压差即会被放大于输出端,唯Op放大器具有的一特色其输出电压值决不会于正电源电压+Vdc或小于电源电压-Vdc,输入电压差经放大后若大于外接电源电压+Vdc至-Vdc之范围,其值会等于+Vdc或-Vdc,故一般运算放大器输出电压均具有下图的曲线。 图3:放大器输入输出与电源电压的关系运放类型:低功率放大器数目:1带宽:1MHz针脚数:8工作温度范围:0°C to +70°C封装类型:DIP器件标号:741器件标记:UA741增益带宽:1MHz工作温度最低:0°C工作温度最高:70°C放大器类型:低功耗温度范围:商用运放特点:高增益频率补偿运算额定电源电压: +15V3.2.4 LED显示LED显示电路的选择LED显示器是由N个LED显示块拼接成N位LED显示器。N个LED显示块有N跟位选线,根据显示方式的不同,位选线和段选线的连接方法也各不相同,段选线控制显示字符的字型,而位选线为各个LED显示块的公共端,它控制该LED显示位的亮、暗。LED显示器有静态显示和动态显示两种显示方式。(1)LED静态显示方式:LED显示器工作于静态显示方式时,各位的共阴极(或共阳极)连接在一起并接地(或+5V);每位的段选线(adp)分别与一个8位的锁存器输出相连。所以称为静态显示。各个LED的显示字符一经确定,相应锁存器的输出将维持不变,直到显示另一个字符为止。也正因此如此,静态显示器的亮度都较高。这种显示方式接口编程容易。付出的代价是占用口线较多,若用I/O接口,则要占用6个8位I/O口,若用锁存器接口,则要用6片74LS373芯片。如果显示器位数增多,则静态显示方式更是无法适应,因此在显示位数较多的情况下,一般都采用动态显示方式。(2)LED动态显示方式:在多位LED显示时,为了简化硬件电路,通常将所有位的段选线相应的并联在一起,有一个8位I/O口控制,形成段选线的多路复用。而各位的共阳极或共阴极分别由相应的I/O线控制,实现各位的分时选通。其中段选线占用一个8位I/O口,而位选线占用一个4位I/O口。由于各位的段选线并联,段码的输出对各位来说都是相同的,因此,同一时刻,如果各位位选线都处于选通状态的话,4位LED将显示相同的字符。若要各位LED能够显示出与本位相应的显示字符,就必须采用扫描显示方式,即在某一时刻,只让某一位的位选线状态,而其他各位的位选线处于关闭状态,同时,段选线上输出相应位要显示字节的段码。在确定LED不同位显示的时间间隔,不能太短,因为发光二极管从导通到发光有一定的延时,导通时间太短,发光太弱人眼无法看清。但也不能太长,因为毕竟要受限于临界闪烁频率,而且此时间越长,占用CPU时间也越多,另外,显示位增多,也将占用大量的CPU时间,因此动态显示实质是一牺牲CPU时间来换取元件的减少。所以,由于本系统涉及到6位显示输出,采用LED动态扫描显示方式。3.3各单元模块的联接3.3.1采样探针与放大电路3.3.2放大电路与AD芯片 ADC0809选用IN0作为为信号输入端。3.3.3ADC0809与80c52单片机连接ADC0809与单片机P1口连接。3.3.4单片机与LED数码管显示段选为P0口,位选为P2口第四章 软件设计程序均用keil4软件C语言编写。4.1系统程序设计总方案 根据模块的划分原则,将该程序划分初始化模块,A/D转换子程序和显示子程序,这三个程序模块构成了整个系统软件的主程序,如图5.1所示。 入口初始化调用A/D转换子程序判断档位调用显示程序出口图4.1 数字式直流电流表主程序框图4.2系统子程序设计4.2.1初始化程序所谓初始化,是对将要用到的MCS_51系列单片机内部部件或扩展芯片进行初始工作状态设定,初始化子程序的主要工作是设置定时器的工作模式,初值预置,开中断和打开定时器等。4.2.2 A/D转换子程序A/D转换子程序用来控制对输入的模块电流信号的采集测量,并将对应的数值存入相应的内存单元,其转换流程图如图4.2所示。 入口初始化启动转换A/D转换结束?输出转换结果出口图4.2 A/D转换流程图4.2.3显示子程序显示子程序采用动态扫描实现四位数码管的数值显示,在采用动态扫描显示方式时,要使得LED显示的比较均匀,又有足够的亮度,需要设置适当的扫描频率,当扫描频率在70HZ左右时,能够产生比较好的显示效果,一般可以采用间隔10ms对LED进行动态扫描一次,每一位LED的显示时间为1ms。在本设计中,为了简化硬件设计,主要采用软件定时的方式,即用定时器0溢出中断功能实现11s定时,通过软件延时程序来实现5ms的延时。其转换流程图如图5.3所示。显示程序入口取出单片机寄存器数据处理计算数据等待显示数据的显示码 数码管显示一位 延时4位显示完成?出口 图4.3 显示子程序流程图第五章 系统技术指标及精度和误差分析在+探针加上1.75v,在-探针加上1.5v,经过10欧电阻得出24.92mA误差小于0.08mA 设计总结在本次设计过程中遇到了不少问题,在同组同学的帮助下才顺利的完成了本次课程设计。设计对以前学过ADC的转换,也就是信号的离散化过程中,可能会使所得的数据与原来系统中的参数稍有不同。这一项不足完全可以由提高系统的数据采集单元的精度来弥补,很好地复现出原值。目前单片机技术在测控系统、智能仪表、机电一体化、家用电器等领域均得到了广泛的应用,极大地推动了电子产业的发展。2006年,单片机设计师也正式成为我国的一种新职业。鉴于单片机及嵌入式系统在工业领域和日常生活中的应用日趋广泛和深入,以及社会对单片机人才的大量需求,单片机已成为电子、计算机、信息、通信、电气、自动化、机电、数控等各工科专业学生必须要掌握的一门基本技术。4智能化微机测量和控制技术的迅速发展和广泛应用己经渗透到国民经济的各个部门。不但国防技术、航空、铁路 、冶金、化工等产业,就连在日常生活中也得到广泛的应用。在研究国内外有关智能仪器仪表最新科研成果的基础上,采用单片机作为测量仪器的主控制器,从软硬件方面出发设计出可与上位计算机进行通信的新型电流表系统参考文献1 吴金戌.8051单片机实践与应用.北京:清华大学出版社,20022 余锡存 单片机原理及接口技术 西安电子科技大学出版社 2000年3 龙脉工作室51单片机C语言应用开发技术大全 人民邮电出版社 08年9月4 余锡存 单片机原理及接口技术 西安电子科技大学出版社 2000年5 张国勋.缩短ICL7135A/D采样程序时间的一种方法,19936 潭浩强 C程序设计清华大学出版社 2003年附录附录I原理图附录II源程序#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar cmd;uint ge,shi,bai,qian,wan;sbit OE =P27;sbit CLK =P26;sbit EOC =P30;sbit SARTT =P31;sbit ADD1 =P35;sbit ADD2 =P36;sbit ADD3 =P37;uchar code dux=0x3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;uchar code wex=0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf;void delay(uchar i);void init()P1 =0x00;EA =1;TMOD =0x02; /设置定时器T0工作方式TH0 =216; /利用定时器T0产生CLK信号TL0 =216;TR0 =1; /启动定时器ET0 =1; /定时器溢出中断允许START =0;OE =0;void display() /数据处理ge=(cmd*195)%10;shi=(cmd*195)/10%10;bai=(cmd*195)/100%10;qian=(cmd*195)/1000%10;wan=(cmd*195)/10000%10;disled(wex1,duxwan);disled(wex2,duxqian);disled(wex3,0x80);disled(wex4,duxbai);disld(wex5,duxshi);disled(wex6,duxge);void disled(uchar we,uchar du) /显示 P2=we; delay(10); P0=du; delay(10);void AD()START =0;ADD1 =0; /选择IN0通道ADD2 =0;ADD3 =0;delay(10);START =1; /启动AD 转换delay(10);START =0;while(!EOC);OE =1; cmd =P1;OE =0; void t0(void) interrupt 1 using 0 /T0中断服务程序 CLK=CLK; void delay(uchar i) /延迟函数 uchar j while(i-) for(j=125;j>0;j-); void mian() inti(); while(1); AD(); cmd=P1; dispiay();