攀枝花学院本科毕业设计(论文)
数控式直流电流源
学生姓名:
学生学号: ************ 院(系): 电信学院 年级专业: 电子信息工程 指导教师: *** 助理指导教师:
二〇一一年六月
0
摘 要
一般地,将输出恒定的电流源称为恒流源,“恒流源”这个术语,原则上是指这样一种稳定电源:它输出的电流与外部影响无关即和负载改变大小无关。实际上,大多数恒流源是用电子电路实现的,而且仅当外部条件在一定的范围内变化时才能保持输出电流基本不变。
本系统以直流电流源为核心,ATS52单片机为主控制器,通过键盘来设置直流电源的输出电流,设置步进等级可达1mA,并可由LCD1602显示电流设定值和实际输出电流值。本系统由单片机程控设定数字信号,经过D/A转换器(TLC5615)输出模拟量,再经过运算放大器隔离放大,控制输出功率管的基极, 随着功率管基极电压的变化而输出不同的电流。单片机系统还兼顾对恒流源进行实时监控,输出电流经过电流/电压转换后,通过A/D转换芯片(TLC2543),实时把模拟量转化为数据量,再经单片机分析处理,通过数字量形式的反馈环节,使电流更加稳定,这样构成稳定的压控电流源。实际测试结果表明,本系统能有效应用于需要高稳定度的小功率恒流源的领域。
关键字: 数控直流恒流源,单片机,D/A转换器,A/D转换,电压/电流转换器
ABSTRACT
In this system the DC source is center and S52 version single chip microcomputer (SCM) is main controller, output current of DC power can be set by a keyboard which step level reaches 1mA, while the real output current and the set value can be displayed by LCD. In the system, the digitally programmable signal from SCM is converted to analog value by DAC (TLV5638), then the analog value which is isolated and amplified by operational amplifiers, is sent to the base electrode of power transistor, so an adjustable output current can be available with the base electrode voltage of power transistor. Using the keyboard to set the needed output current value, The SCM based on some specific algorithm to deal the certain settings for processing. Corresponding voltage output by the ADC output voltage-controlled current source circuit.On the other hand, The constant current source can be monitored by the SCM system real-timely, its work process is that output current is converted voltage, then its analog value is converted to digital value by ADC, finally the digital value as a feedback loop is processed by SCM so that output current is more stable, so a stable voltage-controlled constant current power is designed. The test results have showed that this system, compared with the traditional regulated current source, has easy to operate and features high output current stability.
Key words : Numerical control dc constant-current source,microcontroller,D/A converter,
A/D conversion
- 1 -
目 录
摘要 ABSTRACT 目录 第一章 绪论
第二章 系统总体设计及方案论证
2.1 系统简介 2.2 系统总体设计 2.3论证方案
2.3.1 主控器方案论证 2.3.2 供电电源方案论证 2.3.3 恒流源方案论证 2.3.4 DAC和ADC方案论证 2.3.5键盘方案论证 2.3.6 显示方案论证 第三章 系统的硬件设计
3.1 主控电路设计 3.2 供电电源设计
3.2.1主电源
3.2.2单片机电源(第二级电源) 3.2.3电源参数计算
3.3 恒流源电路设计 3.4 D/A和A/D转换电路设计 3.4.1 D/A和A/D转换器的介绍 3.4.2参数计算
3.5 电流检测电路设计 3.5.1电流检测原理介绍 3.5.2采样电阻的计算 3.6 键盘电路设计 3.7 显示电路设计 3.7.1 LCD1602的介绍
- 2 -
第四章 系统的软件设计
4.1 软件结构设计
4.1.1系统软件的结构 4.2.2总体流程
4.2 标测试和测试结果 4.3 程序设计
第五章 总结 参考文献
附录1 数控直流恒流源系统总体电路图附录2 数控直流恒流源系统程序设计
- 3 -
1 绪 论
随着电子技术的发展,数字电路应用领域的扩展,现今社会,产品智能化、数字化已成为人们追求的一种趋势,设备的性能,价格,发展空间等备受人们的关注,尤其对电子设备的精密度和稳定度最为关注。性能好的电子设备,首先离不开稳定的电源,电源稳定度越高,设备和外围条件越优越,那么设备的寿命更长。基于此,人们对数控恒定电流器件的需求越来越迫切.当今社会,数控恒压技术已经很成熟,但是恒流方面特别是数控恒流的技术才刚刚起步有待发展,高性能的数控恒流器件的开发和应用存在巨大的发展空间。
目前恒流电流源是科研、航天航空、半导体集成电路路生产领域以及计量领域中一种很重要的电子设备。随着技术的发展,对恒流电流源的稳定性、精度等要求越来越高,而传统的模拟恒流源由于模拟电路的复杂性,将越来越难满足高稳定性的应用场合。随着数字电子技术的发展,在计量领域、电量和非电量测量的仪表、工业控制系统中应用数控直流恒流源。数控直流恒流源与传统稳压电流源相比,具有操作方便、输出电流稳定度高的特点。
本设计基于单片机的数控直流电流源设计方案,给出了硬件组成及软件系统。本系统以单片机ATS51为核心部件,由键盘、显示、及D/A转换,V/I转换、功率放大等模块组成。虽然对于单片机的数控直流电流源的研究不再停留在理论研究的阶段,已经进入研发阶段但是其进一步改进的空间是巨大的,因此希望此课题的研究能对这方面提供技术支撑和理论参考。
- 4 -
2 数控直流恒流源系统描述
2.1 系统简介
本系统包括电源交换处理及分配模块、恒流源模板、单片机主控模板、键盘输入模块、LCD显示模块、模数转换(A/D)模块、数模转换(D/A)模块。在通过键盘设定好需要输出电流值后,单片机对设定值按照一定的算法进行处理。经D/A输出电压控制恒流源电路输出相应的电流值。单片机通过采样恒流源电路上串接的采样电阻的电压,计算出此时恒流源电路的输出电流值并与设定值进行比较,以控制D/A的输出从而实现对恒流源的输出电流进行调节,使输出电流能实时跟随设定值。
数控直流恒流源可以实现以下功能:
1.可手动设定输入电流值(范围为20mA~2A) 2.有输出电流值数字显示,输出电流范围为20mA~2A。 3.直接用220V市电供电。
4.输出电流恒定,改变负载电阻,输出电压在24V以内变化时,输出电流变化的绝对值≤输出电流值的0.1%=1mA。 5.纹波小,纹波电流≤0.2A。
6.步进电流值,步进的分辨率高,步进2mA。
7.输出电压范围为0~24V。
2.2 系统总体设计
数控直流恒流源的总体原理框图如图2-1所示。
键盘电路 ATS51 D/A 转 换 V/A放大 转 负 载 换及功率 单片机系统 显示电路 A/D 转 换 采 样 电 路
图2-1 数控直流恒流源的总体原理框图
- 5 -
包括主控器、供电电源、恒流源、键盘、显示、模数转换(A/D)模块、数模转换(D/A)
模块7个部分,图2-1中的负载是指恒流源的负载,不属于恒流源的系统组成。下面将介绍各个部分的总体设计与选型。
2.3方案论证
2.3.1 主控器
本题要求制作的直流电流源是数控式的,可以显示输出电流的给定值以及实际测量值,因此必然要结合微处理器,并且通过微处理器的控制作用对输出电流进行精确校正。常用的微处理器有80×86、单片机、数字信号处理器(DSP)或复杂可编程逻辑器件(CPLD)等。DSP实现起来相当复杂,超过了自己的知识范围。复杂可编程逻辑器件(CPLD)具有速度快的特点,但其实现较复杂,且做到友好的人机界面也不太容易。单片机实现较容易,并且具有一定的可编程能力,对于本题足以胜任。
单片机含有多种系列,如51系列单片机及AVR、PIC系列单片机。51单片机是美国Intel公司推出的一种高性能的8位单片机。因此,该系统采用单片机为核心的 51 系列单片机。此单片机的运算能力强,软件编程灵活,自由度大,能够实现对外围电路的智能控制。
2.3.2 供电电源
方案一:采用线性恒流电路,该方案具有噪声干扰小,电路简单,工作稳定的特点,但是由于功率器件工作于线性状态功率损耗大,发热较大,在满足设计要求时在极限条件下功率管的消耗功率接近20W。
方案二:采用开关恒流方式进行电流控制,由于功率管只工作于打开或者关闭状态,功率管损耗较低。发热量很小,但是由于开关管对强电流进行开关操作,干扰大大高于线性恒流源。
结论:本课题主要在于软件的仿真,仿真中对电源的要求不高,所以采用方案二。如果要做成实物可以单独在来设计高稳定的电源。
2.3.3 恒流源
恒流源的实现方式有多种,有运算放大器组成的恒流源,三极管组成的镜像电流源、运算放大器加达林顿管组成的恒流源等。 (1)运算放大器组成的恒流源
运算放大器组成的恒流源是利用了运算放大器的两个基本特性:虚短路和虚断路,其典型原理图如图2-2所示。
- 6 -
图2-2 运算放大器组成的恒流源典型原理图
(2)三极管组成的镜像电流源
由三极管组成的镜像电流源的典型电路图如图2-3所示。
图2-3 三极管组成的镜像电流源典型电路
(3)运算放大器加达林顿管组成的恒流源
运算放大器加达林顿管组成的恒流源的典型电路如图2-4所示。
- 7 -
图2-4 运算放大器加达林顿管组成的恒流源的典型电路
在本数控直流恒流源中,采用了运算放大器加达林顿管组成的恒流源电路,运算放大器采用TL084,加达林顿管采用TIP142,同时利用D/A转换器TLC5665作为电压输入控制。
2.3.4 DAC和ADC方案论证
数模转换和模数转换一般有串口和并口。但并口芯片所占的端口资源较多,对端口的利用率低,其优点是转换速度快。串口芯片由于接口简单,控制方便,系统稳定性好,得到广泛的应用。TLC2543和TLC5615都是采用串口的ADC和DAC芯片,在设计中利用上两种芯片不仅节约单片机端口资源,而且分辨率较高,能满足设计要求。所以本系统采用TLC2543和TLC5615串口芯片。
2.3.5 键盘
比较常用的键盘有两种,一种是矩阵式键盘,另一种是的键盘。下面将分别介绍矩阵式键盘和键盘。 (1)矩阵式键盘
矩阵式键盘的结构与工作原理:
在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图1所示。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,上图中,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列
- 8 -
线所接的I/O口则作为输入。这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。 (2)键盘
在按键较多时,占用的端口较多。 所以在本数控直流恒流源中,矩阵式。
2.3.6 显示
一般情况下,显示单元可以采用一般的数码管显示,因为数码管具有接线简单,成本低廉,配置简单灵活,编程容易,对外界环境要求较低,易于维护等特点。但是,考虑到普通数码管能够显示的信息量有限,并且一般情况下要显示较多的信息所占用的系统I/O资源较多。
在本系统中,考虑到显示的内容以及系统的实用性,采用液晶显示(LCD)。液晶显示具有功耗低、体积小、质量轻、无辐射危害、平面直角显示以及影响稳定不闪烁、画面效果好、分辨率高、抗干扰能力强等优点。点阵式LCD可以显示字符、数字等功能。 本系统采用的点阵式LCD型号为1602。
综合上述,数控直流恒流源的设备选型如表2-1所示。
表2-1 数控直流恒流源的设备选型
器 件 编 号 1 2 3 4 5 器 件 编 号 6 7 8
器 件 名 称 单片机 稳压器 运算放大器 达林顿管 D/A转换器 器 件 名 称 康铜丝 A/D转换器 点阵LCD 型 号 ATS52 LM7805,LM7815 LM358 TIP142 TLC5615 型 号 0.25 TLC2543 LCD1602
- 9 -
3 系统硬件设计
系统的总体硬件框图如图3-1所示,主要有ATS52单片机系统、LM358与TIP142组成的恒流源电路、D/A转换器、采样电阻与A/D转换器组成的电流检测电路、矩阵键盘、LCD组成的显示电路等。
图3-1 系统的总体硬件框图
3.1 主控电路设计
单片机各功能部件的运行都是以时钟频率为基准的,有条不紊地进行工作。因而时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定性。常用的时钟电路方式有两种:一种是内部时钟方式,一种是外部时钟方式,这里采用的是内部时钟方式,外接晶振。时钟电路由片外晶体、微调电容和单片机的内部电路组成。选取频率为11.0592MHz的晶振,微调电容是瓷片电容。
主控电路即为一个51系列单片机的最小系统,单片机选择了Atmel公司的ATS52,主控电路如图3-2所示。
- 10 -
图3-2 主控电路
3.2 供电电源设计 3.2.1 主电源
在本设计中,运放需±12V供电,单片机和A/D、D/A需5V供电,采用三端稳压器7808
构成一稳压电源,由于78及79系列稳压器最大输出电流只有1.5A,而题目要求输出电流范围是20mA~2000mA。为了给系统提供更大的电流,需外加功率管进行扩流或者加电阻进行扩流,电路如图3-3所示。输入电压由环形变压器和全波整流滤波电路产生。
- 11 -
图3-3上是运放供电电路
3.2.2 单片机电源(第二级电源)
图3-4上是单片机和D/A、D/A系统供电电源电路
3.2.3 电源参数计算
1对稳压器的参数计算:输出V0=+12v,I0=3A的稳压电路。
选择VD1、VD2、C1、C2和稳压器
稳压器选mc7808bt因为V0=8v,IO500mA,有mc7808bt可以查得其输入和输出的关系
0iimax,为:,所以应有uiuo5v,所以mc7808bt的输入引脚为13v,输出
uuuu8v 静态电流
IQ4.6mA。
- 12 -
C1、C2查稳压管使用手册得c10.33uf,c20.1uf d1n5231a为二极管稳压器稳压值为5v。 选择VD、R、VT管
VD选有图得ui1uiuzubeuz24140.79.3v的电路选VD为bzx79a10 uzR的选择:
10vuz为VD的稳压值,结合整流后
。
Rube/Iz,取IzIQ4.6mA,所以得到R152.17结合整流后的电路
R160。
VT的选择::正常工作时uceu1iui241410v集电极电流ic1A,
pcuceic10110w,VT承受的ucbuz9.3v所以选VT为a5t5059的NPN
其
pcm15w,icm1A,ucbo100v。
2整流滤波参数计算
工频输入为220v、50hz的交流电压,经过整流滤波后得到Ui1=24v采用全波整流所以次级电压应为U2=Ui1*1.2≈30v,由变压器性质U1/U2=310/30,取n1/n2=12/1
取滤波电容C3=0.33u、C4=0.1u,为了让整流后的电压纹波小选择大电容C5=2000u,C3、C4、C5的耐压值为70v和4个整流二极管为选择理想二极管。
3.3 恒流源电路设计
恒流源由运算放大器TL084以及达林顿管TIP142构成,如图3-5所示。其中,TIP142中的几个关键指示如下。
最大集电极——发射极电压:VCEOM = 100V。 最大集电极——基极电压:VCBM = 100V。 最大发射极——基极电压:VEBM = 5.0V.
最大集电极电流:稳态值,ICM = 10A;瞬时峰值,ICMP = 15A。 最大基极电流:IBM = 0.5V。 最大承受功率:PD = 125W。
从上述指标可以看出,TIP142可以满足整个系统的输出电流要求。
- 13 -
图3-5 恒流源电路
说明,图3—5中的2.5Ω电阻R10同时也为采样电阻,采用康铜丝绕制而成,在接下来的电流检测电路设计中将详细介绍。
3.4 D/A转换电路设计
3.4.1 D/A和A/D转换器介绍
TLC5615是一个串行1O位DAC芯片,性能比.早期电流型输出的DAC要好。只需要通过3根串行总线就可以完成1O位数据的串行输入,易于和工业标准的微处理器或微控制器(单片机)接口,适用于电池供电的测试仪表、移动电话,也适用于数字失调与增益调整以及工业控制场合。其主要特点如下: 1)单5v电源工作; 2)3线串行接口; 3)高阻抗基准输入端;
4)DAC输出的最大电压为2倍基准输入电压; 5)上电时内部自动复位;
6)微功耗,最大功耗为1.75rrrⅣ ; 7)转换速率快,更新率为1.21MHz;
- 14 -
TLC2543是12 b it串行A /D转换器, 使用开关电容逐次逼近技术完成A /D转换过程. 由于是串行输入结构, 能够节省51系列单片机的I/O资源. 其特点有: 1) 12 b it分辨率A /D转换器; 2) 在工作温度范围内10 L s转换时间; 3) 11个模拟输入通道; 4) 3路内置自测试方式; 5) 采样率为66 kb /s; 6) 线性误差+ 1LSB(max); 7) 有转换结束(EOC)输出; 8) 具有单、双极性输出; 9) 可编程的MSB或LSB前导; 10) 可编程的输出数据长度;
TLC5615组成的D/A转换器电路如图3-6所示。
图3-6 TLC5615组成的D/A转换电路
- 15 -
TLC2543组成的A/D转换器电路如图3-7所示。
- 16 -
- 17 -
TLC2543组成的A/D转换器电路如图3-8所示。
3.4.2 理论分析与参数计算
1.D/A芯片的选择计算
本题要求输出电流范围为20~2000mA(综合基本要求和发挥要求),步进1mA,也
即分辨率为1mA,根据式(3-5)得
Imax2000mAnloglog 11 (3-5) 2 2 I1mA所以n取10就可以了。
最小位数为10位,而为了给精度指标留有余地,A/D芯片我们选择12位的TLC2543,D/A芯片选择10位的TLC5615。
当TLC5615工作在单极0~5 V输出模式时,输出电压分辨率为5V2^100.00049V。由于本系统输出电流为0~2 A,所以只使用0000H~03DDH与输出的对应关系。TLC2543的分辨率为5V2^121.22 mV。
3.4.3 PID算法的介绍
本系统采用了离散增量PID算法,具体控制过程为:单片机经A/D芯片读出实际输出电流Ik,然后和设定电流Is相比较,得出差值Ek=Is-Ik,单片机根据Ek的正负大小调用PID方式计算出本次电流调用的增量⊿IK,然后根据前次D/A芯片输出电流Iq-1,计算出本次电流输出Iq。
- 18 -
3.5检测电路设计
3.5.1电流检测原理介绍
为了提高电流输出地精度,需要引入一个反馈回路,用来指示当前输出地电流大小,完成该功能的电路即为电流检测电路。利用A/D转换器采集采集采样电阻两端的电压值,从而测量输出电流,因此,对采样电阻的要求比较高,同时采样电阻上需要交流过的最大电流比较大(0A-2A),这样在采样电阻上的功耗比较高,就需要用受温度等外部因素影响比较小的电阻,在本系统中,采用了康铜丝作为采样电阻,即为图中的电阻R7。电流检测电路图所示,其中A/D转换器采用TLC2543,其是12位A/D转换器,低功耗,只需要单个+5V供电。
3.5.2 采样电阻的计算
稳流电源的电流取样,实质上是稳流电源输出的负载电流在其上产生的电压降,它的数值大小直接影响电流效率,越高,稳流电源的效率就越低,采样电阻上耗散的功率就越大,因此温升高,取样电阻的稳定性会变差,会使电源稳定性降低。有以下求取采样电阻的经验公式:
USI (3-6) RSIL为负载电流。取样电阻上的电压降不宜选值太高,我们取为0.5V,根据题目要求取2A,代入式(3-6),可得采样电阻取0.25。
3.6 键盘电路设计
键盘电路采用按键扫描的矩阵电路,在本系统中需要用到“0-9”、“确认”“取消”、“+”、“-”等14个按键,设计16个按键即可满足要求,键盘电路如图3-10所示。
- 19 -
+ — 7 8 9 +:实现步进电流为1MS的增加 -:实现步进电流为1MS的减少 0~9: 按键数字 清除:清除当前数值 确认:用户确认时,使当前键入数值送系统处理 4 5 6 1 2 3 清除 0 确认
图3-9 键盘电路
3.7 显示电路设计
3.7.1 LCD1602的介绍
显示采用的是点阵LCD,型号为LCD1602,1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如表1所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显
- 20 -
示出来,我们就能看到字母“A”。
显示电路如图3-10所示。
图3-10 点阵LCD显示电路
- 21 -
4 系统软件设计
4.1 软件结构设计
软件设计采用C语言,对S52进行编程实现各种功能。 软件设计的关键是对A/D、D/A转换器的控制。 软件实现的功能是: ⑴电流给定值的设置 ⑵测量输出电流值 ⑶控制TLC5615工作 ⑷控制TLC2543工作
⑸对反馈回单片机的电流值进行补偿处理 ⑹驱动液晶显示器显示电流设置值与测量值
4.1.1 系统软件的结构
数控直流恒流源的软件结构如图4-1所示,包括顶层文件、键盘管理、D/A转换处理、A/D转换处理、LCD显示管理5个部分。
图4-1 数控直流恒流源的软件结构
- 22 -
4.1.2 总体流程
数控直流恒流源的总体流程如图4-2所示。
初始化设定电流改变DAC输出检测实际电流比较设定电流和实际输出电流不相等通过控制DAC补偿相等需要需要重新设定电流值吗?不需要
图 4-2
- 23 -
4.2 指标测试和测试结果
TLC2543的采集
Keil调试数据。Buf为输出电流值
- 24 -
TLC5615的数字输入和对应输出模拟电压
由TLC5615的性质有VoutVrefCode212,Code是对应的二进制输入。
,Vref=2.5v。根据电压电流转换
12Code(V2)/2*Vref由上公式的得到out电路的三虚原理得到Vout等于放大器的正端和负端电压Un=Up=Vout。 图3-5 得到UnV采=R1*IO。由设计要求可以假设IO12Ii,所以UnV采=R1*Ii
所以可以得到Code(Vout2单位是安培A。
)/2*Vref=(2.5Ii212)/(2.52)=Ii512,注意Ii
- 25 -
电压电流转换对应
图4-1
假设TL084的正端为Up,负端为Un,由放大器的三虚原理,可以的得到Un=Up。如上图4-1电
压电流转换电路,得到R10上的电压为Un=Up,又因为R10=2.5,所以得到的电流值为下公式值
IoUp/R10Up/2.5。电流的输出电流和负载电阻R12无关,实现的电压电流的转化同负载无关
的要求。同时这个电路也可以实现20~2000MA电流值。
- 26 -
输入为0V是的电流和电压
输入电压为1.8v时电流
- 27 -
输入为2.4v时的电流
- 28 -
上为电流输入和下为输出电流
如图上和实验过程中得到的数据输入电流和输出电流的差值为1mA。在输入电流为1000mA时TLC5615得到的输出电压为
,R1= 2.5,所以转换电流为
上为电流输入和下为输出电流
- 29 -
和实际电压2.5v的差值为0.00488v。采样电压为
/2.5=999.684MA;实际在输入的为1000mA,
对应的实际电流误差为1000-999.684=0.316mA。
上为电流输入和下为输出电流
- 30 -
上为电流输入和下为输出电流
4.3 程序设计
见附录2
- 31 -
5 总结
在设计制作数控直流恒流源系统的过程中,我深切体会到,实践是理论运用的最好检验,培养了自己综合运用所学知识和技能分析和解决本专业的技术问题,建立正确的设计思想和工程设计的一般程序和方法,以及培养研发的能力,进而对学生进行工程实践能力的综合训练,为学生走向社会参与工程技术活动打下良好的基础。同时非常感谢刘衍平老师,在设计过程中对我的细心指导,特别是在程序算法上的指导,让算法的取舍更合理。
本次设计是对我们四年所学知识的一次综合性检测和考验,无论是动手能力还是理论知识运用能力都得到了提高,同时加深了我们对网络资源认识,大大提高了查阅资料的效率,使我们有充足的时间投入到电路设计当中。
本系统的研制主要应用到了电子技术、传感器与检测技术、自动控制系统、计算机控制技术、51单片机技术、C语言或汇编语言、电路等知识和技能,所设计的基于单片机程序控制的压控恒流源,达到了题目要求。进一步熟悉了设计所需要具有计算机和单片计算机软硬件开发条件的环境。
- 32 -
参考文献
[1] 陈伯时.电力拖动自动控制系统(第3版). 北京:机械工业出版社,2008.7 [2] 孙运旺.传感器技术与应用. 杭州:浙江大学出版社, 2006.9 [3] 林敏.计算机控制技术及工程应用. 北京:国防工业出版社, 2005.8
[4] 李群芳,张士军,黄 建.单片微型计算机与接口技术. 北京:电子工业出版社, 2007.8 [5] 胡汉才. 单片机原理与接口技术. 北京:清华大学出版社,2004.2
[6] 张毅,张宝芬,曹丽,彭黎辉.自动检测技术及仪表控制系统. 北京:化学工业出版社,2005.3
[7] 戴仙金. 51单片机及其C语言程序开发实例 . 北京:清华大学出版社,2008.2 [8] 谢自美. 电子线路设计和实验测试.武汉:华中科技大学出版社,2006.8 [9] 戴仙金. 51单片机及其C语言程序开发实例.北京:清华大学出版社,2008.2 [10] 王昊,谢文阁,杜艺. 线性集成电源应用电路设计.北京:清华大学出版社,2009.9 [11]陈晓忠,黄宁,赵晓霞. 单片机接口技术实用子程序.北京:人民邮电出版社,2010.5 [12]范立南,谢子殿. 单片机原理及应用教程,北京:北京大学出版社,2010.8 [13] 其他
- 33 -
附录1 总体原理图
- 34 -
- 35 -
附录2
#include #define uchar unsigned char #define uint unsigned int #define Vref 2.5 //tlc5615 sbit cs=P2^4; //片选 sbit clk=P2^3; //时钟 sbit din=P2^5; //SPI口 //tlc2543 sbit clock = P3^1; //输入、输出时钟端 sbit input = P2^7; //数据输入端 sbit output = P2^6; //数据输出端 sbit CS1 = P3^0; //片选端,负电平有效 //lcd sbit RS=P2^0; sbit RW=P2^1; sbit En=P2^2; //uchar code table[16]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};//数字 static uchar dis_buf[4]={0,0,0,0}; //显示缓存 uchar n,temp1; uchar key;//键顺序码 uchar key_cli=0;//数字键被按下的次 /**************************************** 函数声明 *****************************************/ keyscan(); void TLC56 (unsigned long dav); void delay56(); - 36 - void Write(uchar address,uchar dat); void delayms(unsigned int x); void jianz(uchar key) ; void ADCchu(unsigned long aa); void DispCharacter(uint x, uint y, uint data1); void LCDReset(); void ShortDelay(uchar i); void LongDelay(uint i); void SetRS(bit i); void SetRW(bit i); void SetE(bit i); void InitP0(bit i) ; void WriteInstruc(uint Instruc); uint Read_BF_AC(); void WriteData(uint data1); uint ReadData(void); bit StatusCheck(); void InitLCD(); void jianchu(uchar jianz,uint r); /***************************************** 键盘程序 *******************************************/ keyscan() { P1=0xef; if((P1&0x0f)!=0x0f) { ShortDelay(100);// 函数调用消抖动 if((P1&0x0f)!=0x0f) { temp1=P1; switch(temp1) { case 0xee: - 37 - key=0; break; case 0xed: key=4; break; case 0xeb: key=8; break; case 0xe7: key=12; break; } while((P1&0x0f)!=0x0f); jianz(key); //函数调用 } } P1=0xdf; if((P1&0x0f)!=0x0f) { ShortDelay(100);// 函数调用消抖动 if((P1&0x0f)!=0x0f) { temp1=P1; switch(temp1) { case 0xde: key=1; break; case 0xdd: key=5; break; case 0xdb: - 38 - key=9; break; case 0xd7: key=13; break; } while((P1&0x0f)!=0x0f); jianz(key); //函数调用 } } P1=0xbf; if((P1&0x0f)!=0x0f) { ShortDelay(100);// 函数调用消抖动 if((P1&0x0f)!=0x0f) { temp1=P1; switch(temp1) { case 0xbe: key=2; break; case 0xbd: key=6; break; case 0xbb: key=10; break; case 0xb7: key=14; break; - 39 - } while((P1&0x0f)!=0x0f); jianz(key);// 函数调用 } } P1=0x7f; if((P1&0x0f)!=0x0f) { ShortDelay(100);// 函数调用消抖动 if((P1&0x0f)!=0x0f) { temp1=P1; switch(temp1) { case 0x7e: key=3; break; case 0x7d: key=7; break; case 0x7b: key=11; break; case 0x77: key=15; break; } while((P1&0x0f)!=0x0f); jianz(key); } - 40 - } } /*************************************** 键盘按键功能函数 ***************************************/ void jianz(uchar key) { if(key<=9) { dis_buf[key_cli]=key; //得键值存储在其中 key_cli++; } if(key==12)//确定键送数 { unsigned long out_temp=0; //十六位 uint j,i; uchar dis_buf1[4]={0,0,0,0}; for(j=0;j<4;j++) dis_buf1[j]=dis_buf[j]; jianchu(dis_buf1[0],0); jianchu(dis_buf1[1],1); jianchu(dis_buf1[2],2); jianchu(dis_buf1[3],3); //键盘值处理中调用lcd显示 for(i=0;i //out_temp=2000-out_temp/2;//送5615口 //out_temp=out_temp/2; //数据的转换 TLC56((0x03dd-(2000-out_temp/2))); //(重点地方)数字信号从单片机来, 这里可以传键盘值和键盘联系 TLC5615DAC的键盘值 ShortDelay(1); //out_temp=out_temp*2*Vref; //数据的转换 //TLC56((out_temp)); //(重点地方)数字信号从单片机来,这里可以传键 //out_temp=out_temp/1024;//送5615口 盘值和键盘联系 TLC5615DAC的键盘值 - 41 - //ShortDelay(1); } if(key==13) //取消键 { uint j; uchar dis_buf2[4]={0,0,0,0}; for(j=0;j<4;j++) dis_buf[j]=dis_buf2[j] ; jianchu(dis_buf2[0],0); jianchu(dis_buf2[1],1); jianchu(dis_buf2[2],2); jianchu(dis_buf2[3],3); TLC56(0x0000); //(重点地方)数字信号从单片机来,这里可以传键盘值和 键盘联系 TLC5615DAC的键盘值 ShortDelay(1); } uint j; if(key==10) //步进+键 { uchar dis_buf3[4]; for(j=0;j<4;j++) { dis_buf3[j]=dis_buf[j];//是保护dis_buf[]中的数据 } n=3; //向前一两位来改变dis_buf的值 dis_buf3[n]=dis_buf3[n]+0x02; //步进值为0x02 if(dis_buf3[n]>=0x09) //输入值满十进位 { dis_buf3[n]=0; n=2; dis_buf3[n]=dis_buf3[n]+0x01; } for(j=0;j<4;j++) { dis_buf[j]=dis_buf3[j];//将修改后的值传到dis_buf[]中 - 42 - } if(key==11) //步进-键 { uint j; uchar dis_buf4[4]; for(j=0;j<4;j++) { jianchu(dis_buf3[0],0); jianchu(dis_buf3[1],1); jianchu(dis_buf3[2],2); jianchu(dis_buf3[3],3); } dis_buf4[j]=dis_buf[j]; } n=3; dis_buf4[n]=dis_buf4[n]-0x02; if(dis_buf4[n]<=0x01) { n=2; dis_buf4[n]=dis_buf4[n]-0x01; n=3; dis_buf4[n]=0x09; } } - 43 - for(j=0;j<4;j++) dis_buf[j]=dis_buf4[j]; jianchu(dis_buf4[1],1); jianchu(dis_buf4[2],2); jianchu(dis_buf4[3],3); jianchu(dis_buf4[0],0); } //LCD初始化 void InitLCD() { WriteInstruc(0x06); LCDReset(); // InputMode(0x06); //增量方式,不移位 WriteInstruc(0x0c) ; // DispControl(0x0c); WriteInstruc(0x38) ; // FunctionSet(0x38); //短延时函数:ShortDelay() void ShortDelay(uchar i) { //寄存器选择信号:SetRS() void SetRS(bit i) { //读写操作控制信号:SetRW() void SetRW(bit i) { //使能信号:SetE() void SetE(bit i) - 44 - //显示开,光标关,闪烁关 //8位,2行,5×7 } for(;i>0;i--) ; } if(i==1) RS = 1; else RS = 0; } if(i==1) RW = 1; else RW = 0; } { if(i==1) En = 1; else En = 0; } //IO输入输出控制 void InitP0(bit i) { if(i==1) P0 = 0xff; else P0 = 0x00; } //写指令函数:WriteInstruc() void WriteInstruc(uint Instruc) { while(StatusCheck()); InitP0(0); SetRS(0); SetRW(0); //ShortDelay(1); SetE(0); P0 = Instruc; //ShortDelay(1); SetE(1); ShortDelay(10); SetE(0); //ShortDelay(1); SetRW(1); SetRS(1); } //读BF以及AC的值函数:Read_BF_AC() uint Read_BF_AC() { uint temp; - 45 - InitP0(1); SetRS(0); SetRW(1); //ShortDelay(1); SetE(0); //ShortDelay(1); SetE(1); ShortDelay(1); temp = P0; ShortDelay(10); SetE(0); //ShortDelay(1); SetRW(0); SetRS(1); return(temp); } //写数据到RAM函数:WriteData() void WriteData(uint data1) { InitP0(0); SetRS(1); SetRW(0); //ShortDelay(1); SetE(0); P0 = data1; //ShortDelay(1); SetE(1); ShortDelay(10); SetE(0); //ShortDelay(1); SetRW(1); SetRS(0); } - 46 - //检测LCD控制器状态函数:StatusCheck() //返回一bit数:1 -- 忙;0 -- 闲 bit StatusCheck() { //在指定位置显示字符函数: DispCharacter() // x为行号,y为列号, // data为显示字符的码字数据 void DispCharacter(uint x, uint y, uint data1) { //LCD复位函数:LCDReset() void LCDReset() { WriteInstruc(0x01) ; WriteInstruc(0x02) ; /****************************************** LCD1062显示函数 *******************************************/ void jianchu(unsigned char jianz,uint r) //键盘值处理并显示 { return((bit)(Read_BF_AC() & 0x80)); } uint temp; while(StatusCheck()); //若LCD控制器忙,则等待 temp = y & 0x0f; x &= 0x01; if(x) temp |= 0x40; WriteInstruc(0x80|temp); WriteData(data1); } //设置显示位置 } if(r<4) { - 47 - switch(jianz) { case 0: case 1: DispCharacter(0,7+r, '1' ); break; case 2: DispCharacter(0,7+r, '2' ); break; case 3: DispCharacter(0,7+r, '3' ); break; case 4: DispCharacter(0,7+r, '4' ); break; case 5: case 6: DispCharacter(0,7+r, '5' ); break; DispCharacter(0,7+r, '6' ); break; DispCharacter(0,7+r, '7' ); break; case 8: DispCharacter(0,7+r, '8' ); break; case 9: DispCharacter(0,7+r, '9' ); break; } DispCharacter(0,7+r, '0' ); break; case 7: else switch(jianz) case 0: case 1: DispCharacter(1,3+r, '1' ); break; case 2: DispCharacter(1,3+r, '2' ); break; case 3: DispCharacter(1,3+r, '3' ); break; case 4: - 48 - DispCharacter(1,3+r, '0' ); break; } DispCharacter(1,3+r, '4' ); break; case 5: case 6: DispCharacter(1,3+r, '5' ); break; DispCharacter(1,3+r, '6' ); break; DispCharacter(1,3+r, '7' ); break; case 8: DispCharacter(1,3+r, '8' ); break; case 9: DispCharacter(1,3+r, '9' ); break; } case 7: /***************************************** TLC5615串口接收数据 *****************************************/ void TLC56 (unsigned long dav) { uchar i; dav<<=6; //数据移位使高位在前 cs=0; clk=0; for(i=0;i<12;i++) { din=(bit)(dav&0x8000); //位位发送 dav<<=1; clk=1; clk=0; ShortDelay(10); } cs=1; } /************************************************* - 49 - tlc2543采样程序 *************************************************/ //时延程序 //void delay(uchar N) //{ //while(N--); //} { unsigned long ad=0; uchar i; CON_WORD<<=4; //当控制字位0x00时是十二位转换 clock=0; CS1=0; for(i=0;i<12;i++) { if(output==1) //读取DATAOUT ad=ad|0x01; if(CON_WORD&0x80) //读取控制字到INPUT input=1; else input=0; clock=1; ShortDelay(10); clock=0; ShortDelay(10); CON_WORD<<=1; ad<<=1; } CS1=1; ad>>=1; ADCchu(ad); - 50 - //TLC2543转换程序 12位AD void TLC2543(uchar CON_WORD) //选择的通道,为0--10 } /*********************************** 处理TLC3543采样的值函数 ************************************/ void ADCchu(unsigned long aa)//将16位转换成4个字符存储个、十、百、千 { float fVoltage1; uchar buf[4]; fVoltage1=(float)aa/4096*5/2.5*1000; buf[0]=(uchar)(fVoltage1/1000); buf[1]=(uchar) ((fVoltage1-buf[0]*1000)/100); buf[2]=(uchar) ((fVoltage1-buf[0]*1000-buf[1]*100)/10); buf[3]=(uchar) ((fVoltage1-buf[0]*1000-buf[1]*100-buf[2]*10)); jianchu(buf[0],4); /**************************** 主函数 ****************************/ void main() { InitP0(0); // P2 = 0x00; jianchu(buf[1],5); jianchu(buf[2],6); jianchu(buf[3],7); } InitLCD(); //显示\"MA\" DispCharacter(0,14,'M'); DispCharacter(0,15,'A'); DispCharacter(1,14,'M'); - 51 - DispCharacter(1,15,'A'); DispCharacter(1,7,'0'); DispCharacter(1,8,'0'); DispCharacter(1,9,'0'); DispCharacter(1,10,'0'); DispCharacter(0,7,'0'); DispCharacter(0,8,'0'); DispCharacter(0,9,'0'); DispCharacter(0,10,'0'); while(1) { keyscan();//键盘扫描调jianz() TLC2543(0); //TLC ADC启动 调用ADCzhuan / } } - 52 -
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- 99spj.com 版权所有 湘ICP备2022005869号-5
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务