双直流稳压电源

  • 格式:doc
  • 大小:64.50 KB
  • 文档页数:8

双直流稳压电源
组员:黄剑宇班富涛
辅导老师:韦忠善
摘要:文中设计一个简易的双直流稳压电源,通过单片机PWM 占空比的方式,改变PWM的占空比实现电压的线性变化,再通过滤波和运放组成的压控恒压源、差动放大器,实现电压的稳定性和0.5~3A过流保护电路。

通过单片机程序控制和开关切换,实现电压步进1V的的改变和过流报警。

制作表明,文中简易双直流稳电源完全达到题目要求的各项指标。

1.系统方案
设计测试仪的组成框图如下图1所示。

双直流稳压电源设计的核心包括:(1)设计合适的PWM--电压变换电路,电压输出电路,满足测量精度要求;(2)设计合理的
单片机程序,实现步进1V和数码管显示;(3)选用合适的元器件,精确显示线性电位器的阻值与角度的关系图形。

2.电路设计
PWM-电压转换电路。

2.1、PWM-电压转换电路图如下:
此电路包含正负15V基准电压、滤波电路、压控恒压源电路。

电阻R1、R2和电容C1 、C2构成滤波电路,将从单片机P3.0输出的PWM方波电压经滤波送给下一级电路。

U2、U3、Q1、Q2、Q3、Q4、R3、RV1、R5、R6分别组成正负两个恒压电路,Q1~Q4有电流放大作用。

RV1调整输出电压的大小,减小输出电压误差。

U2、U3组成正负两个恒压电路的电压输出是一样的。

通过程序控制,使单片机输出口P3.0以0.5V递增,得到0~5V 电压,经恒压电路放大两倍步进1V的形式,得到0~正负10V 的大电流电压。

过流保护电路
2.2、过流保护电路如下图:
过流保护电路正电压端的取样电阻R4,取得负载所得的电压,由U4组成的差动放大器放大电压10倍,因为输出的电压为1~10V,由安培定律U4输出的电压0.05~3V。

所以U6的比较器的RV2的调节范围为0.05~3V。

所以电流过大时由单片机控制报警信号同时输出也为0。

同理可得负电压端的电流保护电路。

软件设计
2.3软件设计
文中设计的微控制器采用ATS89C51单片机控制下主要完成四个功能:(1)按键控制单片机输出10等份的可调的PWM。

(2)数码管同步显示0~10V。

(3)过流保护电路报警。

各功能的程序流程图如下图所示。

测试及结论
2.4 基本要求测试
(1)测量精度测试:
对应0~10V的10个档位,分别用电表多次测量每一个档位。

得到测量值计算误差,最大误差为0.5%。

满足测量精度要求。

(2)数码管显示和过流报警:
数码管显示与电压值一样,正负可调过流保护电流0.5~3A,满足正负电源各自过流报警以及切断电源要求。

(3)结论:
通过测试,表明双直流稳压电源的各项功能和指标满足题目要求。

单片机程序
2.5单片机程序如下:
#include<at89x52.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; unsigned int number=0;
uchar DISNUM[]={0,0};
uchar N=0;
uchar CNT;
sbit SW=P1;
sbit OUT=P3^0;
sbit baojing=P1^4;
void Delay(int k) ;
void Keyboard(void);
void Display(uint N);
///////////////////////////////
main()
{
TMOD = 0x10; //00010000
TH1 =(65536-5000)/256;
TL1 =(65536-5000)%256;
ET1 =1;
EA =1;
TR1 =1;
///////////////////////////////
while(1)
{
Keyboard();
Display(number);
}
}
///////////////////////////////
void Delay(int k) //延时函数{
unsigned int i, j;
for (i=0;i<k;i++)
for (j=0;j<120;j++);
}
//////////////////////////////////
void T1Int()interrupt 3
{
TH1 =(65536-4992)/256;
TL1 =(65536-4992)%256;
CNT++;
if(CNT<=N) OUT=1;
else if((CNT>=N)&&(CNT<=10)) OUT=0;
if(CNT==10) CNT=0;
}
///////////////////////////
void Keyboard(void)
{
if((P1&0xff)!=0xff)
{
Delay(10);
if((P1&0xff)!=0xff)
{ CNT=0;
switch(P1&0xff)
{
case 0xfe:
N++;
number++;
if(N==11) {N=0;}
if(number==11) {number=0;}
break;
case 0xfd:
N--;
number--;
if(N==-1) {N=10;}
if(number==-1) {number=10;}
break;
case 0xfb:
N=0;
number=0;
if(N==0) {N=0;}
if(number==0) {number=0;}
if((N==0)&&(number==0)) {baojing=0;} break;
case 0xf7:
N=0;
number=0;
if(N==0) {N=0;}
if(number==0) {number=0;}
if((N==0)&&(number==0)) {baojing=0;} break;
default:break;
}
}
while((P1&0xff)!=0xff){ Display(number);}
}
}
/////////////////////////////////
void Display(uint N)
{
uchar i,k=0xfe;
DISNUM[0]=N/10;
DISNUM[1]=N%10;
for(i=0;i<2;i++)
{
P2=k;
P0=tab[DISNUM[i]];
Delay(2);
k=k<<1;
k=k|0x01;
}
}。