第1章 前言1.1研究背景及意义电源技术尤其是数控电源技术是一门实践性很强的工程技术,服务于各行各业。当今电源技术融合了电气、电子、系统集成、控制理论、材料等诸多学科领域。直流稳压电源是电子技术常用的仪器设备之一,广泛的应用于教学、科研等领域,是电子实验员、电子设计人员及电路开发部门进行实验操作和 研究不可缺少的电子仪器。在电子电路中,通常都需要电压稳定的直流电源来供电。而整个稳压过程是由电源变压器、整流、滤波、稳压等四部分组成。然而这种传统的直流稳压电源功能简单、不好控制、可靠性低、干扰大、精度低且体积大、复杂度高。普通的直流稳压电源品种有很多,但均存在以下两个问题:输出电压是通过粗调(波段开关)及细调(电位器)来调节。这样,当输出电压需要精确输出,或需要在一个小范围内改变时,困难就较大。另外,随着使用时间的增加,波段开关及电位器难免接触不良,对输出会有影响。稳压方式均是采用串联型稳压电路,对过载进行限流或截流型保护,电路构成复杂,稳压精度也不高。在家用电器和其他各类电子设备中,通常都需要电压稳定的直流电源供电。但在实际生活中,都是有220V的交流电网供电。这就需要通过变压、整流、滤波、稳压电路将交流电转换成稳定的直流电。滤波器用于滤去整流输出电压中的纹波,一般传统电路由滤波扼流圈和电容器组成,若由晶体管滤波器来替代,则可缩小直流电源的体积,减轻其重量,且晶体管滤波直流电源不需直流稳压器就能用作家用电器的电源,这既降低了家用电器的成本,有缩小了其体积,使家用电器小型化。传统的直流稳压电源通常采用电位器和波段开关来实现电压的调节,并有电压表指示电压值的大小。因此,电压的调整精度不高,读数欠直观,电位器也易磨损。而基于单片机控制的直流稳压电源能较好地解决以上传统稳压电源的不足。
随着科学技术的不断发展,特别是计算机技术的突飞猛进,现代工业应用的工控产品均需要有低纹波、宽调整范围的高压电源,而在一些高能物理领域,更是急需电脑或单片机控制的低纹波、宽调整范围的电源。
1.2国内外研究现状从十九世纪90年代末起,随着对系统更高效率和更低功耗的需求,电信与数据通讯设备的技术更新推动电源行业中交流/直流电源行业正面临着新的挑战,即如何在现有系统加入嵌入式电源智能系统和数字控制。随着科学技术的迅速发展,人们对物质需求也越来越高,特别是一些高新技术产品。如今随着直流电源技术的飞跃发展,整流系统有一千的分立元件和集成电路控制发展为微机控制,从而使直流电源智能化,具有遥控测、遥信、遥控的三控功能,基本实现了直流电源的无人值守。并且,当今科技快速发展过程中,模块化是直流电源的发展趋势,并联运行是电源产品大容量话的一个有效手段,可以通过设计N+1冗电源系统,实现容量扩展,提高电源系统的可靠性、可用性,缩短维修、维护时间,从而使企业产生更大的效益。如:扬州鼎华公司近些年来结合美国Sorensen Amrel等公司的先进技术,成功开发了单机最大功率120KW智能模块电源,可以并联32台(可扩展到64台),使最大输出功率可以达到7600KW以上。智能模块电源采用电流型控制模式,集中式散热技术,实时多任务监控,具有高效、高可靠、超低辐射,维护快捷等优点,迹象结构紧凑,防腐与散热也作了多方面的加强。它的应用将会克服大功率电源的制造、运输及维修等困难。而且和传统可控硅电源相比节电20%-30%节能优势,奠定了它将是未来大功率直流电源的首选。
1.3课题的主要内容系统设计的目的是要用微处理器来替代传统直流稳压电源中手动旋转电位器,实现输出电压在电源量程范围内步进可调,精度要求高。实现的途径很多,可以用DAC的模拟输出控制电源的基准电压或分压电阻,或者用其它更有效地方法,因此如何选择简单有效地方法是本课题余姚解决的首要问题。
数控直流稳压电源要实现电压的键盘化控制,同时要具备输出、过压过流保护及数组存贮与预置等功能。另外,根据要求电源还应该可以通过按键选择一些特殊的功能。如何有效地实现这些功能也是本课题所需研究解决的问题。
输出最大电压:25V
输出最大电流:2.5A
电压步进:0.1V
电压分辨率:0.02V
1.4论文的总体结构第一部分简要介绍课题的背景、意义、国内外研究现状,介绍本文的主要研究内容,包括实现的目标、功能的完备和性能指标。
第二部分提出了数控直流电源的总的设计思路和实现方案,以及相关系统实现的功能,选择了一种基于51单片机系统的数控直流电源的方案,并对该方案运用的基本知识和使用的器件作出扼要的介绍。
第三部分模块化阐述了基于51单片机数控直流电源的系统整体结构和设计框图,包括数据单片机控制模块、稳压控制模块、电压/电流采样模块、电源模块及键盘模块。
第四部分主要阐述了数控直流电源的软件系统的设计思路和软件设计流程。
第五部分对数控直流稳压电源的性能参数进行测量与评估,以及对误差进行分析。
第六部分针对本数控直流电源给出了本课题的 ,并对其发展前景进行了展望。
第2章 方案与设计基础知识2.1方案设计与论证根据设计的要求:
- 最高输出电压25V,最大输出电流2.5A。
- 电压步进0.1V。
- 纹波系数尽可能小,输出稳定。
- 有限按键操作方便,LCD显示界面。
特色及基本技术路线:
- 低成本解决方案。
- 直观的实验效果。
- 经典理论验证平台先硬件后软件,先局部后整体。
我设计出以下方案:
用D/A和运算放大器做电流源,即采用D/A输出调节晶体管的偏置电流(电压);使用电压/电流采样电路,通过A/D转换实现闭环控制。能有效的缩短调节时间,进一步提高输出精度。设计方案,其主要有微控制器模块、稳压控制模块、电压/电流采样模块、显示模块、键盘模块、电源模块五部分构成。液晶屏显示电路,该系统使用LCD1602液晶显示屏,可以清晰地显示分别组成显示电路的十位、个位、小数点位,同时还能显示英文名称和电压/电流单位。
方案原理示意图见图2-1:
图2-1
2.2主控单片机(MCU)2.2.1 AT89S51简介 AT89S51是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。
AT89S51具有如下特点:40个引脚,4k Bytes Flash片内程序存储器,128 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。
此外,AT89S51设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。
2.2.2 主要特征及引脚说明 1.主要特性:
• 8031 CPU与MCS-51 兼容
• 4K字节可编程FLASH存储器(寿命:1000写/擦循环)
• 全静态工作:0Hz-24KHz
• 三级程序存储器保密锁定
• 128*8位内部RAM
• 32条可编程I/O线
• 两个16位定时器/计数器
• 6个中断源
• 可编程串行通道
• 低功耗的闲置和掉电模式
• 片内振荡器和时钟电路
2.管脚说明:
VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3.0 RXD(串行输入口)
P3.1 TXD(串行输出口)
P3.2 /INT0(外部中断0)
P3.3 /INT1(外部中断1)
P3.4 T0(记时器0外部输入)
P3.5 T1(记时器1外部输入)
P3.6 /WR(外部数据存储器写选通)
P3.7 /RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。
2.3液晶显示屏(1602)2.3.1 LCD1602简介LCD1602可以在LCD显示屏上完整显示32个英文字符和日文等一些字符,适合显示英文文字信息量较小的地方。可以应用在计算器、频率计、信号发生器、时钟等产品上。
- 显示容量:16*2个字符
- 芯片工作电压:4.5-5.5V
- 工作电流2MA(5.0V)部包括背光电流
- 模块最佳工作电压为5V
- 字符尺寸:2.95*4.35(WXH)mm
- 带有英文和日文字库,使用方便
2.3.2引脚接口说明
2.4固定三端稳压器2.4.1固定三端稳压器简介 三端稳压器,主要有两种,一种输出电压是固定的,称为固定输出三端稳压器,另一种输出电压是可调的,称为可调输出三端稳压器,其基本原理相同,均采用串联型稳压电路。在线性集成稳压器中,由于三端稳压器只有三个引出端子,具有外接元件少,使用方便,性能稳定,价格低廉等优点,因而得到广泛应用。
2.4.2固定三端稳压器的类别 三端稳压器的通用产品有78系列(下电源)和79系列(负电源),输出电压由具体型号中的后面两个数字代表,有5V,6V,8V,9V,12V,15V,18V,24V等档次。输出电流以78(或79)后面加字母来区分L表示0.1;AM表示0.5A,无字母表示1.5A,如78L05表求5V 0.1A。
1、使用注意事项:
在使用时必须注意:(VI)和(Vo)之间的关系,以7805为例,该三端稳压器的固定输出电压是5V,而输入电压至少大于7V,这样输入/输出之间有2-3V及以上的压差。使调整管保证工作在放大区。但压差取得大时,又会增加集成块的功耗,所以,两者应兼顾,即保证在最大负载电流时调整管不进入饱和,又不致于功耗偏大。
另外一般在三端稳压器的输入输出端接一个二极管,用来防止输入端短路时,输出端存储的电荷通过稳压器,而损坏器件。
2、用途:
一般稳压管和稳压三级管的用途是一样的,都用于控制板电路的稳压.以防止电压过高烧毁电路.
2.4.3三端稳压器(78、79系列)管脚序号判断技巧 在78**、79**系列三端稳压器中最常应用的是TO-220和TO-202两种封装。这两种封装的图形以及引脚序号、引脚功能如附图所示。
图中的引脚号标注方法是按照引脚电位从高到底的顺序标注的。这样标注便于记忆。引脚①为最高电位,③脚为最低电位,②脚居中。从图中可以看出,不论正压还是负压,②脚均为输出端。对于78**正压系列,输入是最高电位,自然是①脚,地端为最低电位,即③脚,如附图所示。对与79**负压系列,输入为最低电位,自然是③脚,而地端为最高电位,即①脚,如附图所示。

用万用表判断三端稳压器的方法与三极管的判断方法相同,三端稳压器相当于大功率三极管。
此外,还应注意,散热片总是和最低电位的第③脚相连。这样在78**系列中,散热片和地相连接,而在79**系列中,散热片却和输入端相连接。
2.5通用型低功耗集成四运放LM324LM324是四运放集成电路,它采用14脚双列直插塑料封装,外形如图2所示。它的内部包含四组形式完全相同的运算放大器,除电源共用外,四组运放相互独立。每一组运算放大器可用图1所示的符号来表示,它有5个引出脚,其中“+”、“-”为两个信号输入端,“V+”、“V-”为正、负电源端,“Vo”为输出端。两个信号输入端中,Vi-(-)为反相输入端,表示运放输出端Vo的信号与该输入端的位相反;Vi+(+)为同相输入端,表示运放输出端Vo的信号与该输入端的相位相同。
2.5.1 LM324四运放的特点:1.短路保护输出
2.真差动输入级
3.可单电源工作:3V-32V
4.低偏置电流:最大100nA(LM324A)
5.每封装含四个运算放大器
6.具有内部补偿的功能
7.共模范围扩展到负电源
8.行业标准的引脚排列
9.输入端具有静电保护功能
2.5.2 LM324四运放的应用 由于LM324四运放电路具有电源电压范围宽,静态功耗小,可单电源使用,价格低廉等优点,因此被广泛应用在各种电路中。
反相交流放大器
电路见附图。此放大器可代替晶体管进行交流放大,可用于扩音机前置放大等。电路无需调试。放大器采用单电源供电,由R1、R2组成1/2V+偏置,C1是消振电容。
放大器电压放大倍数Av仅由外接电阻Ri、Rf决定:Av=-Rf/Ri。负号表示输出信号与输入信号相位相反。按图中所给数值,Av=-10。此电路输入电阻为Ri。一般情况下先取Ri与信号源内阻相等,然后根据要求的放大倍数在选定Rf。Co和Ci为耦合电容。
同相交流放大器
见附图。同相交流放大器的特点是输入阻抗高。其中的R1、R2组成1/2V+分压电路,通过R3对运放进行偏置。电路的电压放大倍数Av也仅由外接电阻决定:Av=1+Rf/R4,电路输入电阻为R3。R4的阻值范围为几千欧姆到几十千欧姆。
比较器
当去掉运放的反馈电阻时,或者说反馈电阻趋于无穷大时(即开环状态),理论上认为运放的开环放大倍数也为无穷大(实际上是很大,如LM324运放开环放大倍数为100dB,既10万倍)。此时运放便形成一个电压比较器,其输出如不是高电平(V+),就是低电平(V-或接地)。当正输入端电压高于负输入端电压时,运放输出低电平。
附图中使用两个运放组成一个电压上下限比较器,电阻R1、R1ˊ组成分压电路,为运放A1设定比较电平U1;电阻R2、R2ˊ组成分压电路,为运放A2设定比较电平U2。输入电压U1同时加到A1的正输入端和A2的负输入端之间,当Ui >U1时,运放A1输出高电平;当Ui 时,运放A2输出高电平。运放A1、A2只要有一个输出高电平,晶体管BG1就会导通,发光二极管LED就 会点亮。若选择U1>U2,则当输入电压Ui越出[U2,U1]区间范围时,LED点亮,这便是一个电压双限指示器。若选择U2 > U1,则当输入电压在[U2,U1]区间范围时,LED点亮,这是一个“窗口”电压指示器。此电路与各类传感器配合使用,稍加变通,便可用于各种物理量的双限检测、短路、断路报警等。
2.6 数模转换芯片DAC0832芯片内有两级输入寄存器,使DAC0832具备双缓冲、单缓冲和直通三种输入方式,以便适于各种电路的需要(如要求多路D/A异步输入、同步转换等)。D/A转换结果采用电流形式输出。要是需要相应的模拟信号,可通过一个高输入阻抗的线性运算放大器实现这个供功能。
该片逻辑输入满足TTL电压电平范围,可直接与TTL电路或微机电路相接,下面是芯片电路原理图:
DAC0832引脚图和内部结构电路图
DAC0832引脚功能说明:
DI0~DI7:数据输入线,TLL电平。
ILE:数据锁存允许控制信号输入线,高电平有效。
CS:片选信号输入线,低电平有效。
WR1:为输入寄存器的写选通信号。
XFER:数据传送控制信号输入线,低电平有效。
WR2:为DAC寄存器写选通输入线。
Iout1:电流输出线。当输入全为1时Iout1最大。
Iout2: 电流输出线。其值与Iout1之和为一常数。
Rfb:反馈信号输入线,芯片内部有反馈电阻.
Vcc:电源输入线 (+5v~+15v)
Vref:基准电压输入线 (-10v~+10v)
AGND:模拟地,摸拟信号和基准电源的参考地.
DGND:数字地,两种地线在基准电源处共地比较好.
2.7模数转换芯片2.7.1 ADC0804简介ADC0804型8位全MOS A/D转换器。它是中速廉价型产品之一。片内有三态数据输出锁存器,与微处理器兼容,输入方式为单通道,转换时间约为100µs。它的非线形误差为±1LSB。电源电压为单一+5V。
2.7.2 ADC0804的引脚及其功能

、

、

(引脚1、2、3):是数字控制输入端,满足标准TTL逻辑电平。其中

和

用来控制A/D转换的启动信号。

、

用来读A/D转换的结果,当它们同时为低电平时,输出数据锁存器DB0~DB7各端上出现8位并行二进制数码。
CLK(引脚4)、CLKR(引脚19):ADC0801~0805片内有时钟电路,只要在外部“CLKR”和“CLK”两端外接一对电阻电容即可产生

转换所需要的时钟,其振荡频率为

≈

RC。其典型应用参数为:R=10kΩ,C=150pF,

≈640kHz,每秒钟可转换1万次。若采用外部时钟,则外部

可从CLK端送入,此时不接R、C。允许的时钟频率范围为100KHZ~1460KHZ。

(引脚5):转换结束信号输出端,输出电平高跳到低表示本次转换已经完成,可作为中断或查询信号。如果

和

端与

端相连,则ADC0804就处于自动循环转换状态。

(引脚6)和

(引脚7):被转换的电压信号从

和

输入,允许此信号是差动的或不共地的电压信号。如果输入电压

的变化范围从0V到

,则芯片的

端接地,输入电压加到

端。对于差动输入,输入电压可以从非零开始,即

到

。此时

端应接至等于

的恒定电压上,而输入电压

仍加到

端上。
AGND(引脚8)、DGND(引脚10):A/D转换器一般都有这两个引脚。模拟地AGND和数字地DGND分别设置引入端,使数字电路的地电流不影响模拟信号回路,一防止寄生耦合造成的干扰。
VREF/2(引脚9):参考电压VREF/2可以有外部电路供给,从“VREF/2”端直接送入,VREF/2端的电压值应是输入电压范围的二分之一。所以输出电压的范围可以通过调整VREF/2引脚处的电压加以改变,转换器的零点无需调整。
第3章 系统电路原理及硬件实现3.1系统总体框图系统的总体设计方案主要由微控制器模块、稳压控制模块、电压/电流采样模块、显示模块、键盘模块、电源模块五部分构成。
3.2系统模块电路设计3.2.1 单片机控制模块 MCU模块即为单片机部分,整个控制都是依靠单片机完成。从功能和价位以及本题目要求来看,我选择51系列AT89S51作为本方案的控制核心,P0口接液晶显示LCD1602作为输出数据显示传输,同时P25/P26/P27是液晶LCD控制端口;P3口接DAC0832作为输出数据传输;P20、P21、P22接三个独立按键作为输入数据传输;P36/P37接容量为2K的数据存储器24C02,可以实现掉电数据贮存和预置数据贮存;P1口接ADC0804作为输入/输出数据传输。如图所示:
3.2.2 稳压控制模块 通过键盘控制MCU产生8位数字信号(0-255),通过P3口送至8位数模转换芯片(DAC0832)转换成模拟电流信号,再经运放作I/U转换,得到控制稳压电源输出部分的基准电压;
3.2.3 电压与电流采样模块电压与电流采样模块是系统的重要组成部分,对ADC的说明:以输入电压为标准,如果输入电压大于设定的电压值,则减小DA输出电压一位数值,再采样比较,如此循环,直到输入的电压等于设定的电压值或者接近设定的电压值(有事不可能完全相等)。同理,如果输入电压小于设定的电压,则增大DA输出电压一位数值,再采样比较,如此循环,直到输入的电压等于设定的电压值或者接近设定的电压值。这样,就能达到闭环反馈的目的。
利用DAC0832控制的基准电压驱动功率管稳压输出,反馈部分是通过电阻R3,VR2将取样电压输入运放的反相端比较,VR2可作小范围调整;如图所示:
采用8位模数转换芯片(ADC0804)作为显示电流的模数转换器件,ADC0804的取样电压由串联在电源输出电路的电流取样电阻(0.1Ω)分压取得,并由运放按一定倍数放大后送至Vin(+),ADC0804把转换结果送至单片机的P1口,再由程序将数据处理后送LCD1602显示当前电流;
3.2.4 显示模块 显示的方式很多,主要分为两类:LED显示,LCD显示。前者显示高,制作成本低,适合做远距离显示,但由于其耗电较大,所以端口随显示的数据位数增加而增加。如果采用动态扫描方式显示,则占用CPU的时间,如果采用静态显示则需要加锁存器,耗费硬件制作时间,就该题目要求来说,需要设定电压显示,又与实际电压比较再显示,LCD显示更为清晰、直观,从上面诸多因素来看,采用LCD显示比较理想。LCD最常用的就是1602液晶模块。LCD1602可以在LCD显示屏上完整显示32个英文字符和日文等一些字符,适合显示英文文字信息量较小的地方,可以清晰显示出英文名称和电压/电流单位,电压(三位数字:十位、个位、小数位),电流(三位数字:个位,两位小数)。通过单片机编程控制第4脚RS数据/命令选择端,第5脚R/W读/写选择端,第6脚E使能信号,从而实现显示效果。它的显示运行原理如下:
读状态:输入:RS=0,RW=1,E=1;输出:D0~D7=状态字
写指令:输入:RS=0,RW=0,D0~D7=指令码,E=高脉冲;输出:无
读指令:输入:RS=1,RW=1,E=1;输出:D0~D7=数据
写数据:输入:RS=0,RW=0,D0~D7=数据,E=高脉冲;输出:无
如图所示:
3.2.5 键盘模块系统中键盘模块设计四个按键S1、S2、S3、S4,分别由单片机RST端、P20、P21、P21口输入。S1为复位键;S4为翻页按键,最近设置的电压大小保存在EEPROM里面,比如5个电压,按一下S2,电压变为下一个,省去了反复设置电压的麻烦;S3为电压+,S2为电压-,按一下S3,当前电压增加0.1V,按一下S2,当前电压减小0.1V。如图所示:
3.2.6 电源模块电源模块是让AC220V电源通过变压器降压,整流滤波后得到要调节电压输入端;降压为AC15V整流滤波后经过三端稳压7812、7912得到DC±12V电压为运算放大器供电;同时,又经过三端稳压7805、7905得到DC±5V为ADC0804、DAC0832D等芯片提供工作电源。如图所示:
3.3系统整体原理图系统整体原理图(见附录1)。
第4章 系统的软件设计4.1软件设计思路当系统上电,立即进行初始化,分别是端口初始化,D/A、A/D初始化,定时器初始化;然后系统默认电压,默认电流。基本思路:按键扫描 — D/A转换、电压/电流数值显示 — 读A/D转换并比较纠正电压/电流数值显示 — 按键扫描,按前述循环。
4.2系统软件流程4.2.1 主程序模块 流程图如图4-1所示,负责与个子程序模块的接口和检查键盘功能号。程序运行后,开始检测是否有键按下,若有则进入设定按键功能。液晶LCD1602直接显示CPU设定的数值,使CPU资源得到充分利用。同时系统不断采集外部数据,经过相关运算、分析,然后发出命令对实际值进行相应的修正,控制输出电压可调、稳定。
主程序流程图
第5章 系统测试与误差分析5.1系统测试5.1.1 软件测试1、测试软件
程序编辑器keil uvision2
程序烧制器STC-ISP V35
2、编译结果
在编制完C语言后,即keil uvision2界面下,进行了调试,根据提示,我找到了程序在编写上的错误,加以改正,再次惊醒调试。通过上述简单的测试,证明此次设计的程序基本上正确无误。然后,将烧录了程序的单片机AT89S51接到系统电路中,查看系统电路的运行情况;如果程序逻辑有问题可进一步修改,直到系统正常运行。
5.1.2 硬件测试1、电源部分提供整个电路所需各种电压(包括DAC芯片所需的基准稳压-5V和89S51的+5V),由电源变压器和整流滤波电路及两个辅助稳压输出构成,电源变压器的功率由需要输出的电流大小决定,确保有充足的功率余量。
2、电流取样电阻R1要选择大功率的电阻(5W或10W)。也可使用废旧万用表上拆下来的电阻线。检查电路连接无误后,即可试机。找一块数字表将其并联在输出电路上,按S1或S2设定一个电压,此时LCD1602第一行显示的电压可能会有误差,适当微调反馈电路的VR2,使其与数字表读数一致,再将数字表串联在电源的输出电路上,选择适当的电流档,接上一定的负载。此时,LCD1602第二行会显示出电流值,适当的调节VR3改变ADC0804参考电压,直至显示的电流值与万用表显示的电流值一致为止,校正完成后即可使用。
注意事项:电流取样电阻发热量大不能贴PCB板安装,应该将其适当升高再安装;运放TL084可用LM324代换,功率管建议用TO-3金属封装的2N3055,可用TIP3055或C3182等大功率NPN管代换,功率调整管工作时发热量较大,散热片要尽可能大些或采用CPU风扇散热。
5.1.3 系统整体测试1、测试工具
开关电源T-50系列
双踪示波器
数字万用表
表5-1 电压测试表
系统由于刚启动在电压方面不稳定,存在一定误差,但是单片机会对其进行控制,使系统再次稳定。
3、精度分析
绝对误差:ΔU=(0.2+0.1+…...+0.2+0.2)/12=0.11V
相对误差:γA=ΔU/U=(0.2/3.0+0.1/4.0+……+0.2/9.0+0.2/10)/12=1.8%
线性度:γL=ΔLmax/YFS=0.2/15=1.3%
灵敏度:K=0.1V
5.2误差分析从电路的原理框图可以看出,系统的误差来源于四个方面:
- DAC0832的量化误差。
- 基准电压温漂引入的误差。
- 三端稳压器的电路引起的误差。
- 其它器件和线路由于温漂、不稳定等原因引起的误差。
第6章 设计总结和展望6.1总结 经过几十天的艰苦奋战,我最终完成了毕业设计的基本要求。虽然过程是艰苦的,但最终成功的喜悦同样令我快乐!
此设计用D/A和运算放大器做电源,及采用D/A输出调节晶体管的偏值电流{电压}。采用此方案能有效地缩短调节时间,并能提高输出精度,经计算需要采用8位的D/A芯片。
为了争取时间,降低成本,我的解决方案是采用51单片机。改变电压的大小,当单片机通过闭环负反馈调节回路的A/D转换检测到电压达到设定值时,将再次对输出电压进行调制,直到输出电压达到设定值;电压值理论上是象形变化的,不会产生高次谐波,基本实现了任务书中的各项要求和目标,达到了此次毕业设计的预期目的。但更重要的是培养了我的动手能力,使我进一步了解毕业设计的基本知识,能零花和灵活运用毕业设计中的目标任务、计划、过程控制、总结反馈等各个环节所涉及的内容,并且具备了迅速接受新知识的能力,对新的挑战具有一定的适应能力。
- 收集相关资料。一方面利用学校图书馆资源,另一方面利用网上资源。
- 提高涉及效率,遇到不解的疑惑与老师、其他同学及时沟通,以迅速解决设计中遇到的问题。
- 尽早落实工作,剩下时间专心致志做好毕业设计。
- 同学之间相互学习、沟通、鼓励、支持。
本次设计过程中,对纹波也没有提出严格的要求,所以常用的稳压集成电路就可以满足要求。本设计输出的电压稳压精度高,可以用在对直流电压要求较高的设备上,或在实验室中当作实验电源使用。在本次设计的过程中,我发现很多的问题,给我的感觉就是很难,很不顺手,看似原理比较简单的电路,要动手把它给设计出来时很难的一件事,主要原因是我们没有经常动手设计过电路,还有资料的查找也是一大难题,这就要求我们在以后的学习中,应该注意到这一点,更重要的是我们要学会把从书本中学到的知识和实际的电路联系起来,这不论是对我们以后的就业还是学习,都会起到很大的促进和帮助,我相信,通过这次的毕业设计,在下一阶段的学习中我会更加努力,力争把功课学好,学精。同时,通过本次毕业设计,巩固了我们学习过的专业知识,也使我们把理论与实践从真正意义上相结合了起来;考验了我们借助互联网搜集、查阅相关文献资料,和组织材料的综合能力;从中可以自我测验,认识到自己哪方面有欠缺、不足,以便于在日后的学习中得到改进、提高。
6.2展望放眼今后,直流稳压电源今后的发展方向之一是以微处理器为核心的数控直流稳压电源,它将利用最新的计算机技术、网络技术及数字化技术,充分发挥微处理器强大的信息处理能力,使其突破传统直流稳压电源的概念,传统直流稳压电源的高稳定性输出仅是这种数控直流稳压电源其众多功能之一。它的功能包括:控制的智能化,即控制电路采用全数字化,控制手段用微处理器和单片机组成的软件控制方式,达到了较高的智能化程度,并且进一步提高了电路设备的可靠性;将随着微处理器和监控软件的引入,电源的自我监控能力普遍增强,可以实时地监控设备本身的各种运行参数和状态,预警功能和故障诊断功能,有效地实现了实验电源的无人值守;随着胡两旺技术应用日益普及和信息处理技术的不断发展,在管理上达到网络化,电源设备数据处理和通信能力,通过其智慧型人机界面,使网路技术人员可以随时监视电源设备运行状态,各项技术参数;具有远程开关机功能,使网络技术人员可定时开关电源。
随着科学技术的发展,直流稳压电源等仪表数字化、智能化、网络化将是发展方向。高精度数控直流稳压电源的研制对准了这个发展方向,加上计算机技术的迅速发展,使之具有非常广阔的发展空间。
附录1 系统整体原理图
附录2 系统源程序
单片机源程序如下:
- #include <reg52.h> //52系列头文件
- #define Disdata P0 //液晶数据端口
- #define uchar unsigned char //无符号字符8位
- #define uint unsigned int //无符号整数8位
- uint data dis[4]={0x00,0x00,0x00,0x00};//4个数据单元和一个
- uchar code table[]="OUTPUT: . V "; //定义初始上电液晶默认显示状态
- uchar code table1[]="designed by :";
- uchar code table3[]=" Li Xiaojun";
- uchar code table2[]="INPUT: . V ";
- sbit lcden=P2^7; //定义液晶使能端
- sbit lcdrs=P2^5; //定义液晶RS端
- sbit rw=P2 ^6; //定义液晶RW端
- sbit cs_ad=P2^4;
- sbit dout=P2^3;
- sbit clk=P2^2; //转换结束标志位
- sbit da_wr=P2^1;
- sbit da_cs=P2^0;
- sbit beep=P1^7;//蜂鸣器
- data int result;//测量变量暂存地址
- uchar num,num1,num2,num3,num4,num5;
- uchar shii,gei;
- uchar shuru;
- uchar dagg,dass;
- uchar key,temp;
- uchar cvc,mma,mmb;
- uchar ddf;
- uint ddt;
- //********延时函数************
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
-
- //*************
- void di()
- {
- beep=0;
- delay(100);
- beep=1;
- }void write_com(uchar com) //液晶写命令函数
- {
- lcdrs=0;
- P0=com;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void write_data(uchar date) //液晶写数据函数
- {
- lcdrs=1;
- P0=date;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void write_sg(uchar add,uchar date) //写整数位和小数位函数
- {
- uint shi,ge;
- shi=date/10; //分解出一个2位数的十位
- ge=date%10;
- write_com(0x80+0x40+add); //设置显示位置
- write_data(0x30+shi); //送去液晶显示十位
- write_data(0x30+ge); //送去液晶显示个位
- }
- //void write_da(uchar sps,uchar uru)
- //{ uchar yuy,rur;
- // yuy=uru;
- // rur=0;
- // write_com(0x80+sps); //设置显示位置
- //if(cvc==8)
- // {
- // write_data(0x30+yuy); //送去液晶显示十位
- // write_data(0x30+rur); //送去液晶显示个位
- // }
- /// else
- // write_data(0x30+rur); //送去液晶显示十位
- // write_data(0x30+yuy);
- //}void init()
- {
- shuru=0;
- rw=0;
- lcden=0;
- shii=0;
- gei=0;
- dagg=0;
- dass=0;
- write_com(0x38); //初始化1602液晶
- write_com(0x0c);
- write_com(0x06);
- write_com(0x01);
- write_com(0x80); //设置显示初始坐标 for(num2=0;num2<13;num2++)
- {
- write_data(table1[num2]);
- delay(5);
- }
- write_com(0x80+40);
- for(num3;num3<16;num3++)
- {
- write_data(table3[num3]);
- delay(5);
- }
- delay(3000);
-
- } //*******************************
- void scan1()
- {
- write_com(0x80);
- for(num1;num1<16;num1++)
- {
- write_data(table2[num1]);
- delay(5);
- }
- // write_da(8,dass);
- //write_da(11,dagg); write_com(0x80+0x40); //设置显示初始坐标
- for(num=0;num<16;num++)
- {
- write_data(table[num]);
- delay(5);
- }
- write_sg(8,shii);
- write_sg(11,gei);
-
- }
-
- //****TLC1549转换处理子函数********void test()
- {
-
- data uchar i;
-
- cs_ad=1; //禁止i/o clock
- cs_ad=0; //开启控制电路,使能data out和i/o clock
- result=0; //清转换变量
- for(i=0;i<10;i++) //采集10次 ,即10bit
- {
- clk=0;
- result*=2;
- if(dout) result++;
- clk=1;
- }
- delay(590);
- cs_ad=1; ;;;; //data out 返回到高阻状态而终止序列
- //****数据转换处理**********
- result=result*2;
- dis[2]=result/205; //计算整数位
- dis[3]=result%205; //余数暂存
- dis[3]=dis[3]*10; //计算小数第一位
- dis[1]=dis[3]/205;
- dis[3]=dis[3]%205;
- dis[3]=dis[3]*10; //计算小数第二位
- dis[0]=dis[3]/205;
- shii=dis[2];
- gei=dis[1]*10+dis[0];
- write_sg(8,shii);
- write_sg(11,gei);
-
- }
- //***********************
- void test_da()
- {
-
-
- ddf=mma+mmb*0.1-0.7;
- ddf=ddf*25.6;
- ddt=ddf;
- da_wr=0;
- da_cs=0;
- P3=ddt;
- delay(1);
- }//*************************
- void markey()
- {
-
- P1=0xfe;
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(10);
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0);
- {
- temp=P1;
- switch(temp)
- {
- case 0xee:
- if(cvc==0)
- {
- write_com(0x80+8);
- write_data(0x30+0);
- write_data(0x30+1);
- di();
- cvc++;
- key=1;
- mma=key;
- break;
- }
- else
- write_com(0x80+11);
- write_data(0x30+1);
- write_data(0x30+0);
- key=1;
- cvc=0;
- di();
- mmb=key;
- test_da();
- break;
- case 0xde:
- if(cvc==0)
- {
- write_com(0x80+8);
- write_data(0x30+0);
- write_data(0x30+2);
- di();
- cvc++;
- key=2;
- mma=key;
- break;
- }
- else
- write_com(0x80+11);
- write_data(0x30+2);
- write_data(0x30+0);
- key=2;
- cvc=0;
- di();
- mmb=key;
- test_da();
- break;
-
-
- case 0xbe:
- if(cvc==0)
- {
- write_com(0x80+8);
- write_data(0x30+0);
- write_data(0x30+3);
- di();
- cvc++;
- key=3;
- mma=key;
- break;
- }
- else
- write_com(0x80+11);
- write_data(0x30+3);
- write_data(0x30+0);
- key=3;
- cvc=0;
- di();
- mmb=key;
- test_da();
- break;
- }
- while(temp!=0xf0)
- {
- temp=P1;
- temp=temp&0xf0;
- }
-
- }
-
-
- } P1=0xfd;
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(10);
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0);
- {
- temp=P1;
- switch(temp)
- {
- case 0xed:
- if(cvc==0)
- {
- write_com(0x80+8);
- write_data(0x30+0);
- write_data(0x30+4);
- di();
- cvc++;
- key=4;
- mma=key;
- break;
- }
- else
- write_com(0x80+11);
- write_data(0x30+4);
- write_data(0x30+0);
- key=4;
- cvc=0;
- di();
- mmb=key;
- test_da();
- break;
- case 0xdd:
- if(cvc==0)
- {
- write_com(0x80+8);
- write_data(0x30+0);
- write_data(0x30+5);
- di();
- cvc++;
- key=5;
- mma=key;
- break;
- }
- else
- write_com(0x80+11);
- write_data(0x30+5);
- write_data(0x30+0);
- key=5;
- cvc=0;
- di();
- mmb=key;
- test_da();
- break;
- case 0xbd:
- if(cvc==0)
- {
- write_com(0x80+8);
- write_data(0x30+0);
- write_data(0x30+6);
- di();
- cvc++;
- key=6;
- mma=key;
- break;
- }
- else
- write_com(0x80+11);
- write_data(0x30+6);
- write_data(0x30+0);
- key=6;
- cvc=0;
- di();
- mmb=key;
- test_da();
- break;
- }
- while(temp!=0xf0)
- {
- temp=P1;
- temp=temp&0xf0;
- }
-
- }
- } P1=0xfb;
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(10);
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0);
- {
- temp=P1;
- switch(temp)
- {
- case 0xeb:
- if(cvc==0)
- {
- write_com(0x80+8);
- write_data(0x30+0);
- write_data(0x30+7);
- di();
- cvc++;
- key=7;
- mma=key;
- break;
- }
- else
- write_com(0x80+11);
- write_data(0x30+7);
- write_data(0x30+0);
- key=7;
- cvc=0;
- di();
- mmb=key;
- test_da();
- break;
- case 0xdb:
- if(cvc==0)
- {
- write_com(0x80+8);
- write_data(0x30+0);
- write_data(0x30+8);
- di();
- cvc++;
- key=8;
- mma=key;
- break;
- }
- else
- write_com(0x80+11);
- write_data(0x30+8);
- write_data(0x30+0);
- key=8;
- cvc=0;
- di();
- mmb=key;
- test_da();
- break;
- case 0xbb:
- if(cvc==0)
- {
- write_com(0x80+8);
- write_data(0x30+0);
- write_data(0x30+9);
- di();
- cvc++;
- key=9;
- mma=key;
- break;
- }
- else
- write_com(0x80+11);
- write_data(0x30+9);
- write_data(0x30+0);
- key=9;
- cvc=0;
- di();
- mmb=key;
- test_da();
- break;
-
- }
- while(temp!=0xf0)
- {
- temp=P1;
- temp=temp&0xf0;
- }
-
- }
-
- }
-
- P1=0xf7;
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(10);
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0);
- {
- temp=P1;
- switch(temp)
- {
- case 0xe7:
- if(cvc==0)
- {
- write_com(0x80+8);
- write_data(0x30+0);
- write_data(0x30+0);
- di();
- cvc++;
- key=0;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
基于51单片机数控直流电源的设计.docx
(330.6 KB, 下载次数: 206)