数字电子系统的数控直流稳压电源设计本系统以AT89C51 单片机作为系统的核心,由D/A数字模拟转换模块、按键、LED串口显示模块等模块组成一个数控电源。
该系统实现了输出电压:范围 2 ~+20 .0 V,步进0.1V,纹波小于100mV;输出电流:1000mA;输出电压值由数码管显示;由“+”、“-”两键控制输出电压步进增减。
输入模块的按键按下之后,单片机有一个输入,单片机将输入的数字一方面给显示模块,让它们在数码管中显示出来;另一部分输给DAC0832,让它转化为模拟量电流输出,通过运算放大器将这模拟量转化为相应的电压,这电压经过放大后控制LM317的控制端,从而实现输出电压的控制。
关键词:AT89C51 单片机, 数控电源, D/A, 直流电源在现代家庭中各种电器的不断出现,并要求着各种不同值的电源出现,使得家庭购买不同值的电源。
数字化的也更加贴近人们的生活,因为它更加的直观,易被接受,大家都开始追求数字化的各类电子产品。
数控直流电源有着直观,易操作,各种电压集一身,输出精度和稳定性都较高等优点,所以越来越受广大人们的喜爱。
以后家里的电视遥控,电动玩具等都可以共用一个电源。
设计要求设计并制作有一定输出电压调节范围和功能的数控直流稳压电源,基本要求如下:1、输出直流电压调节范围2~20V,步进值为0.1V2、稳压系数小于0.2,纹波电压小于100mv;3、输出电流为1000mA;输出电压值用数码管显示,由“+”“-”两键分别控制输出电压步进增和减。
1.2 方案论证分析本题,根据设计要求先确定了本系统的整体设计原理框图1-1.采用8位的数字/模拟转换芯片DAC0832是本系统是基于51单片机的数控电源的设计,8位的单片机,而MX7541是12位数字输入的,因此须用锁存器。
而此数控电源要求单步0.1V,2~20V,DAC0832完全可以达到,故选择常用的DAC0832。
可调稳压芯片:根据设计要求输出电压范围2~+20.0V,输出电流1000mA,本文选择了LM317T三端可调稳压芯片。
按键控制模块:由于本数控电源需要用的按键不多,要实现步进为0.1V的设计要求,只需用一个“+”和一个“-”按键,另外再加两个按键用于实现固定电压输出,按键时可直接输出相应电压。
4个按键就可实现本题的设计要求,本文采用一般的电平判键按钮。
显示模块:此系统显示的只是最终电源输出的十位、个位和十分位电压值,只需显示出三个数字,选用数码管显示,用普通的数码管显示简单的数字、符号、字母。
第2章设计原理本系统选用的模块包括:单片机系统,D/A转换模块,LED显示模块,直流电源模块。
2.1 单片机模块系统扩展时,ALE用于控制地址锁存器锁存P0口输出的低8位地址,从而实现数据与低位地址的复用。
P1口的P1.0,P1.1,P1.2,P1.3和键盘相连,作为整个系统的输入部分。
其中和P1.0相接的是+5V电源的数字输入键,和P1.1相接的是+12V电压的数字输入键。
和P1.2,P1.3相接的分别是“+”,“—”号键。
P1口和DAC0832的输入相接,作为D/A模块的输入。
图2-2 按键输入图其中S1、S2为固定电压的输入,分别是+5V和+12V电压的输入按钮,S3、S4分别为+,—键,对电压值进行加和减计算。
/WR和/RD分别接到两数码管的公共端COM1和COM2。
2.2D/A模块2.2.1D/A电路简介采用DAC0832,DAC0832是一种常用的8位的数字/模拟转换芯片。
DAC0832及其外围电路本系统是基于单片机的数控电源的设计,而MX7541 是12 位数字输入的,因此须用锁存器。
而此数控电源要求单步0.1V,2~20 .0V只需区分190个点,DAC0832完全可以达到,故选择常用的DAC0832。
当其与单片机进行相连时,电路也简单,只需把单片机的数据线与DAC0832的输入端直接相连即可,程序也很简单,只需向其送数据即可。
DAC0832的管脚图如图2-3。
图2-3 DAC0832管脚图管脚的具体名称和用法:D0 ~D7:数字量输入端;CS:片选信号,低电平有效;ILE:数据锁存允许信号,高电平有效;WR:第1写信号,低电平有效;12WR :第2写信号,低电平有效;XFER :数据传送控制信号,低电平有效;1OUT I :电流输出端1; 2OUT I :电流输出端2;FB R :反馈电阻端;REF V :基准电压,基电压范围为-10V~ +10V ;GND :数字地; AGND :模拟地 。
单片机与DAC0832的接口可按二级缓冲器方式、单缓冲器方式和直通方式联接。
如上图4的联接方式是直通方式联接方式。
由OUT1脚输出的为一个模拟电流值,经过运算放大器后为一个电压值,这电压值输入到后面的运算放大部分,作为后面部分的输入。
2.2.3 D/A 转换的计算D/A 转换器(DAC )输入的是数字量,经转换输出的是模拟量。
DAC 的技术指标很多,如:分辨率、满刻度误差、线性度、绝对精度、相对精度、建立时间、输入/输出特性等。
分辨率:DAC 的分辨率反映了它的输出模拟电压的最小变化量。
其定义为输出满刻度电压与 n2的比值,其中 n 为DAC 的位数。
如:8位DAC 的满刻度输出电压为5V ,则其分辨率为:)(2565258V =10位DAC 的分辨率为:)(102452510V =可见,DAC 的位数越高,分辨率越小。
建立时间:是描述DAC 转换速度快慢的参数。
其定义为从输入数字量变化到输出达到终值误差正负1/2 LSB (最低有效位)所需的时间。
高速DAC 的建立时间可达1us 。
接口形式:在DAC 输入/输出特性之一。
包括输入数字量的形式,十六进制式BCD ,输入是否带有锁存器等。
DAC0832为8位D/A 转换器。
单电源供电,范围为+5V ~ +15V ,基准电压范围为 V 10±。
电流的建立时间为1us 。
CMOS 工艺功耗20 mw 。
输入设有两级缓冲锁存器。
电压的计算方式。
设计要求数控电压步进为0.1V ,因此要准确选择D/A 的参考电压 REF V ,如上图用一个精密电阻进行调节,计算方法如下:n VVref =256n VVref =256,数字量取0 ~ 256,n 取16, REF V 取0.8V ,即数字量每步进16,模拟量0.003125V ,要达到步进0.1V ,必须放大2倍,用运放即可。
运算放大器的原理如下图。
图2-5 运算放大电路输出的电压V ,再从Vi 输入,经过电容C10滤波再输入,⎪⎩⎪⎨⎧==-=-=+---034V V R V V R V V I O i ,34R V R V Oi -=⇒,iO V R R V 43-=⇒,输出的V o 值的大小为输入Vi 的 43R R -倍,只需调节可调电阻R3的阻值达到所需的电压放大倍数即可,输出的电压V o 通过电压跟随,再用于控制LM317T 的输出。
2.3 LED 数码管显示模块2.3.1 数码管显示简介动态扫描 方法是用其接口电路把所有显示器的8个笔画字段(a —g 和dp )同名端连在一起,而每个显示器的公共极COM 各自独立的接受I/O 线控制。
CPU 向字段输出端口输出字型码时,所有显示器接受到相同的字型码,但究竟使用哪个显示,则取决于公共极COM 端,而这一端是由/WR 和/RD 控制的,由单片机决定何时显示哪一位。
动态扫描用分时的方法去轮流控制各个显示的COM 端,时各个显示器轮流亮。
在轮流点亮扫描过程中,每为显示器的点亮时间极为短暂,但由于人的视觉暂留现象及发光二极管的于辉效应,给人的印象就时一组稳定的显示数据。
2.4 直流电源2.4.1 直流供电电源制作原理由于本系统的许多的电源电压都是由+5V 的电源供电,且D/A 模块中要用到+12V ,—12V 的电源,所以这要制作这些不同值的电源,涉及到的各类芯片有7805,7812,7912。
首先制作电路中的+12V ,-12V 的电源,这要用到三端固定稳压芯片,一个整流,滤波过程。
电路如图2-7。
图2-7 +12 V和-12V电源的制作图+5V的电源制作和+12的电源制作的原理和电路图一样,只需将电路的7812换成7805即可。
2.4.2 输出电源工作原理输出电源的原理图和上面的恒定电源的制作原理基本一样,电路图如下。
图2-8 输出电源电路图220V市电经变压器变压(降压),二极管桥式整流,电容滤波后送入LM317第三脚(输入端),第二脚输出稳压的直流电压。
第一脚为调整端,调整端电压Ui与输出端电压Uo之间为1.25的基准电压。
输出的基本公式为:U0=1.25+Ui第3章软件部分3.2 程序框图图3-1 数控电源程序流程图第4章仿真结果数据分析本系统的设计电路相对简单,硬件制作基本完成,我用Proteus 7.5 SP3 ISIS 7 Professional软件已仿真出来,效果非常的好。
已经在输出的精度和稳定性基本达到要求,输出的电压范围为2--20v,步进为0.1v,又预设两个定值电压+12v和+5v。
实验结果为下表。
表4-1 仿真数据结果“—”键时,单步变化0.1V的精度也基本符合要求。
[1]王港元.电工电子实践指导[M].江西科学技术出版社[2]陈明荧.8051 单片机课程设计实训教程[M].清华大学出版社.[3]郁慧娣.微机系统及其接口技术[M].南京东南大学出版社,1999 年.[4]谢嘉茥,宣月清,冯军.电子线路-非线性部分[M].高等教育出版社,2000 年.[5]何立民.单片机高级教程[M].北京航空航天大学出版社,2003 年.[6]王毓银.数字电路逻辑设计[M].高等教育出版社.[7]马忠梅,籍顺心.单片机的C语言应用程序设计[M].北京航空航天大学出版社.2001.5.[8]邱涛.基于51单片机的数控电源设计[M].华强电子世界网,2005.6.[9]具有8K系统内可编程Flash的8位微控制器ATmega48/V ATmega88/V./downloads/avr/atmega48_88_168.pdf[10]徐龙祥,朱熀秋,刘正埙.高速数据采集与处理系统[M].南京航空航天大学学报,2000 V ol.32 No.1 P.119-123.[11]孙建广,檀润华等.基于I^2C串行总线的大功率开关电源数字控制[M].河北工业大学学报,2000年29卷#include <reg52.h>#define uchar unsigned char#define uint unsigned intunsigned char code ziku[20]={0xc0,0xf9,0xa4,0xb0,0x99, //0,1,2,3,4,0x92,0x82,0xD8,0x80,0x90, //5,6,7,8,9,0x88,0x83,0xc6,0xa1,0x86, //A,B,C,D,E0x8e,0x7f,0xbf,0x89,0xff //F,.,-,H,NULL};//0 1 2 3 4 5 6 7 8 9 .uchar buff[2];uchar voltage;uchar ans;uchar x,y,z;sbit key16 = P1^0;sbit key8 = P1^1;sbit keyadd = P1^2;sbit keysub = P1^3;sbit OUT0 = P2^0;sbit OUT1 = P2^1;sbit OUT2 = P2^2;sbit OUT3 = P2^3;sbit OUT4 = P2^4;sbit OUT5 = P2^5;sbit OUT6 = P2^6;sbit OUT7 = P2^7;sbit L1 = P3^6;sbit L2 = P3^7;sbit L3 = P3^5;//----------------------------------------//函数名称: delay//功能描述:延时(N*8+6)μ//----------------------------------------void delay(uint N){uint i;for(i=0;i<N;i++){;}}/*函数名:getbuff 功能:将电压值转化为显示码存入buff*/ void getbuff(void){x = voltage/10;y = voltage%10;z = voltage/100;buff[1] = ziku[x];buff[0] = ziku[y];buff[2] = ziku[z];}/*函数名:display 功能:显示buff*/void display(void){L1 = 0;P0=buff[0];delay(200);L1 = 0.1;L2 = 0;P0=buff[1];delay(200);L2 = 0.1;L3 = 0;P0=buff[2];delay(200);L3 = 0.1;}/*函数名:key 功能:键盘扫描和设置*//*按下P1.0:输出12V 按下P1.1:输出5V *//*按下P1.2:输出加0.1V 按下P1.3:输出减0.1V */ void key(void){key16 = 1;key8 = 1;keyadd = 1;keysub = 1;if((P1&0x0f)!=0x0f) //有键按下{delay(200); //延时去抖动if ((ans=(P1&0x0f))!=0x0f){do{;}while((P1&0x0f)!=0x0f); // 等待键放松switch (ans){case 0x0e: voltage=10;break;case 0x0d: voltage=5;break;case 0x0b: if(voltage<20) voltage++;break;case 0x07: if(voltage>1) voltage--;break;default: break;}}}}/*函数名:DAC 功能:直通方式DA转换*/void DAC(void){uchar temp;temp = voltage*16-20;OUT0 = temp%2;temp = temp/2;OUT1 = temp%2;temp = temp/2;OUT2 = temp%2;temp = temp/2;OUT3 = temp%2;temp = temp/2;OUT4 = temp%2;temp = temp/2;OUT5 = temp%2;temp = temp/2;OUT6 = temp%2;temp = temp/2;OUT7 = temp%2; }void main(void){P0 = 0xff;P1 = 0xff;P2 = 0xff;P3 = 0xff;voltage=1;while(1){key();DAC();getbuff();display();}}。