电子技术基础
课程设计
题目名称:数控直流恒流源的设计
指导教师: 汪金刚
学生班级: 电气7班
学 号: 20134099
学生姓名: 李骄阳
评语:
成绩:
重庆大学电气工程学院
2015年7月3日
目录
1、设计任务................................................................................................................... 4
2、设计方案................................................................................................................... 5
2.1功能分解及设计思路...................................................................................... 6
2.2 各模块设计..................................................................................................... 7
2.2.1 单片机处理模块................................................................................... 7
2.2.2 液晶显示模块....................................................................................... 8
2.2.3 D/A转换模块........................................................................................ 8
2.2.4 独立按键模块....................................................................................... 8
2.2.5 压控恒流源模块................................................................................... 9
2.3 总体设计电路.......................................................................................... 9
3、程序设计................................................................................................................. 10
4、总结......................................................................................................................... 11
4.1 电路的优缺点............................................................................................... 11
4.2课题的核心及价值...................................................................................... 11
4.3改进意见和展望........................................................................................... 11
5、收获与体会............................................................................................................. 12
6、参考文献................................................................................................................. 12
附录:单片机程序....................................................................................................... 13
数控直流恒流源的设计
摘要
本小组经历构思、修改、设计、仿真、调试的过程,实现了数控直流恒流源的构建。该系统通过51单片机、AD5320模块、LCD1602液晶屏、OP-07运算放大器、IRF640场效应管等原件的集成,以单片机AT89S52为核心,加以外围DA转换电路和恒流源电路,实现了数控直流恒流源的基本要求。该系统的基本功能如下:1、通过按键精确控制输出电流大小,范围200mA-2000mA 2、具有1mA、10 mA、100 mA三种步进电流值3、将设定电流显示在液晶屏上以供参考4、预先设定电流值,使恒流源直接输出给定电流。
关键字:单片机,恒流源,DAC,数控电路设计
1、设计任务
设计并制作数控直流电流源。输入交流200~240V,50Hz;输出直流电压≤10V。其原理示意图如下所示。
技术指标
(1)输出电流范围:200mA~2000mA;
(2)可设置并显示输出电流给定值,要求输出电流与给定值偏差的绝对
值≤给定值的1%+10 mA;
(3)具有“+”、“-”步进调整功能,步进≤10mA;
(4)改变负载电阻,输出电压在10V以内变化时,要求输出电流变化的
绝对值≤输出电流值的1%+10 mA;
(5)纹波电流≤2mA;
(6)自制电源。
2、设计方案
2.1功能分解及设计思路
本数控直流恒流源的设计方案要实现的主要功能主要分解为以下三个方面:
(1)输出给定范围内恒流电流,且输出电流不随负载变化。
(2)设置并显示输出电流给定值。
(3)具有输出电流步进调整功能。
。
以上功能的实现,都是以单片机为核心,在单片机系统实现的输入输出和显示功能的基础上,由单片机的内置逻辑和运算功能,加上一定的外围电路得以实现。
针对以上的三个功能,采用模块化的设计思想,我们的整体系统由单片机处理模块、D/A转换模块、LCD1602显示模块、恒流源模块等模块组成,以实现给定功能。总体框架如下图。
下面分别叙述这些模块。
2.2 各模块设计
2.2.1 单片机处理模块
本方案使用了AT89S52单片机,其具有如下功能:
1、拥有灵巧的8位CPU和在系统可编程Flash
2、晶片内部具时钟振荡器(传统最高工作频率可至 12MHz)
3、内部程序存储器(ROM)为 8KB
4、内部数据存储器(RAM)为 256字节
5、32 个可编程I/O 口线
6、8 个中断向量源
7、三个 16 位定时器/计数器
8、三级加密程序存储器
9、全双工UART串行通道
其功耗低、性能高、功能丰富、性价比高,完全满足方案实现的需要。其最小电路如上图表示。
2.2.2 液晶显示模块
本设计采用LCD1602作为设定电流的显示,其优点是显示清晰、省电、使用方便。LCD使用了单片机P0端口,其属于漏极开路输出,为提供显示所需电压,采用了1K排阻作为其上拉电阻。
2.2.3 D/A转换模块
由于要求输出步进值为1mA的电流,本设计采用了12位串行DA芯片AD5320,将设定电流的数字信号值通过D/A转换变为电压值,以便后续恒流电路使用。
2.2.4 独立按键模块
本设计使用了9个独立按键,实现恢复、步进、设置、确认等功能,以设定及改变输出电流值。
2.2.5 压控恒流源模块
压控恒流源是系统的重要组成部分,它的功能是用电压来控制电流的变化,由于系统对输出电流大小和精度的要求比较高,所以选好压控恒流源电路显得特别重要。
本设计使用高精度运放OP-27(或OP-07)作为电压跟随器,运放输入端连接D/A模块输出端,配合大功率三极管IRF640,通过控制运放输入电压大小,进而利用场效应管的特性控制电流,实现了2A电流恒流功能。
电路中电阻R3为1Ω采样电阻R3,RL 为负载电阻,R2为限流电阻。
2.3 总体设计电路
3、程序设计
本设计使用的单片机程序通过C51语言进行编写, 程序流程图如下:
具体程序见附录。
4、总结
4.1 电路的优缺点
本设计能够较为圆满地实现数控恒流电源,操作者只需要按下相应按键即可进行电流设定修改等操作;采用了液晶显示屏,显示效果清晰直观;使用12位DA芯片,实现了1mA步进,能够精确调节电流;使用了单片机进行设计,电路结构简单直观。
但是,一些细节可能存在缺陷,例如大电流通过元件产生的热效应,可能会使电阻值不稳定,恒流不精确。
4.2课题的核心及价值
本课题主要研究的是基于单片机的数控直流恒流源的设计,恒流源是能够向负载提供恒定电流的电源,因此恒流源的应用范围非常广泛,并且在许多情况下是必不可少的。例如在用通常的充电器对蓄电池充电时,随着蓄电池端电压的逐渐升高,充电电流就会逐渐减少。为了保证恒流源充电,必须随时提高充电器的输出电压,但采用恒流源充电后就可以不必调整其输出电压,从而使劳动力降低,生产效率得到提高。恒流源还被广泛用于测量电路中,例如电阻器阻值的测量与分级,电缆电阻的测量等,且电流越稳定测量越准确。它既可以为各种放大电路提供偏流以稳定静态工作点又可以作为其有源负载。以提高放大倍数,并且在差动放大电路,脉冲产生电路中得到广泛运用。除此以外线性扫描锯齿波的获得,有线通信远供电源,电泳,电解,电镀等化学加工装置电源,电子束加工机,离子注入机等电子光学设备中的供电源也都必须应用恒流源。
4.3改进意见和展望
本次实验因为要求中并未设计到要用AD和反馈机制,为简化实验设计,我们就没有那部分,如果说要改进的话,我们觉得那部分是最值得添加的。因为AD转换器将采样电阻上的电压转换成数字信号反馈给单片机,单片机可将此反馈信号与预置值比较,根据两者间的差值调整输出信号大小,从而形成反馈调节,提高输出电流的精度。
5、收获与体会
通过这次电子设计,加深了对课程概念的理解,扩展了知识面。在电子方面,我熟悉了常用电子器件类别,如电容、电阻、二极管等型号、规格、性能、使用范围及基本测试方法。
本实验实现的功能比较少,但要求用单片机,而我们并没有学习单片机,虽然队友因为电子竞赛对单片机有一定了解,但还是遇到了不少麻烦,通过查看资料,各种改进,才得到了最后的仿真图。因为我对单片机并不是很了解,所以基本都是按照队友思路走的,所以我俩基本没有分歧。我们从一开始就分模块进行设计,同时也在将不同的功能模块连入主电路,通过在网上搜索近似电路、 查找元器件功能表,用proteus对各分块电路进行仿真,一个一个突破问题,保证分支部分不出错误,最后,我们不断修正电路中出现的一些小错误和不完美的地方,设计出较为稳定的恒流源。
通过这次实践认识到了自己的不足,也锻炼了自己解决问题和善于思考的能力,更加深刻理解了每个元器件的功能。有些设计理论上可行,但是仿真出来的结果并非如此,真正的电子设计是需要我掌握每一个细节的,而并非像考试那样做对一部分就能得一部分的分,而是需要一种全局的、整体的观念来处理问题,所以,设计电路需要尽心,不能得过且过。理论联系实践,并在实践中检验理论才是学习的最高层次。
本来这次焊接比较简单,但由于实验室没有相应的元器件,我们自行在淘宝上购买的元器件有一些问题,导致焊接十分复杂,就没有焊接了,希望老师谅解。
6、参考文献
【1】唐治德.数字电子技术基础[M].1.北京科学出版社.2009
【2】夏鸣风.数字电子技术实验[M].1.重庆电气工程学院.20##-2
【3】孔超、张玮.51单片机典型应用开发.1.中国铁道出版社.20##-5
附录:单片机程序
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit reset=P1^0; //按键
sbit plus1=P1^1;
sbit minus1=P1^2;
sbit plus10=P1^3;
sbit minus10=P1^4;
sbit plus100=P3^2;
sbit minus100=P3^3;
sbit set=P1^5;
sbit confirm=P1^6;
sbit lcdrs=P2^3; //LCD1602
sbit lcde=P2^4;
sbit dasync=P2^0; //DA转换
sbit dasclk=P2^1;
sbit dadin=P2^2;
uchar code dis1[] = {" SET mA "};
uchar number[4];
uint q; //加减步进值
uint adata,data1; //DA转换值,设定电流值
/************************延时1ms******************************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/************************D/A转换******************************/
void da_conver(uint dignum)
{
uint dig=0;
uchar k=0;
dasync=1;
_nop_();_nop_();
dasync=0;
for(k=0;k<16;k++)
{
dasclk=1;
dig=dignum&0x8000;
if(dig) dadin=1;
else dadin=0;
dasclk=0;
_nop_();_nop_();
dignum<<=1;
}
dasync=1;
_nop_();_nop_();
}
/************************LCD1602写数据******************************/
void write_data(uchar adata)
{
lcdrs=1;
P0=adata;
delay(1);
lcde=1;
delay(1);
lcde=0;
}
/************************LCD1602写地址******************************/
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay(1);
lcde=1;
delay(1);
lcde=0;
}
/************************LCD1602初始化******************************/
void init()
{
lcde=0;
write_com(0x18); //8位数据端口,1行显示,5*7点阵
write_com(0x0f); //开显示,显示光标,光标闪烁
write_com(0x01); //清屏
write_com(0x80); //设定地址指针在第一行第一个位置
}
/************************数据显示******************************/
void xianshi()
{
int j;
write_com(0x0c); //开显示,不显示光标,光标不闪烁
number[0]=(data1/1000)%10; //数据按位拆分
number[1]=(data1/100)%10;
number[2]=(data1/10)%10;
number[3]=(data1/1)%10;
write_com(0x80+0x09);
for(j=0;j<4;j++)
write_data(number[j]+0x30);
write_data('m');
write_data('A');
write_data(' ');
}
/************************数据处理******************************/
void chuli()
{
float data2=0.0;
write_com(0x80+0x07);
write_data(' ');
xianshi();
data2=data1/2500.0*4095;
adata=(int)data2;
da_conver(adata);
delay(100);
}
/************************显示字母******************************/
void print(uchar *str)
{
while(*str!='\0')
{
write_data(*str);
delay(5);
str++;
}
}
/************************清除******************************/
void clear()
{
uint num;
write_com(0x80+0x09);
for(num=1;num<5;num++)
write_data(' ');
}
/************************确认******************************/
void queren()
{
float data2=0.0;
write_com(0x0c);
delay(5);
data2=data1/2500.0*4095;
adata=(int)data2;
da_conver(adata);
}
/************************加******************************/
void jia()
{
if(data1+q<=2000) data1=data1+q;
else data1=2000;
write_com(0x0c);
xianshi();
delay(5);
}
/************************减******************************/
void jian()
{
if(data1-q>200) data1=data1-q;
else data1=200;
write_com(0x0c);
xianshi();
delay(5);
}
/************************设置******************************/
void shezhi()
{
clear();
write_com(0x80+0x07);
write_data('=');
while(1)
{
write_com(0x80+0x09);
if(plus1==0)
{
delay(130);
if(plus1==0) q=1,jia();
}
if(plus10==0)
{
delay(130);
if(plus10==0) q=10,jia();
}
if(plus100==0)
{
delay(130);
if(plus100==0) q=100,jia();
}
if(minus1==0)
{
delay(130);
if(minus1==0) q=1,jian();
}
if(minus10==0)
{
delay(130);
if(minus10==0) q=10,jian();
}
if(minus100==0)
{
delay(130);
if(minus100==0) q=100,jian();
}
if(confirm==0)
{
delay(130);
if(confirm==0) break;
}
}
}
/************************恢复******************************/
void huifu()
{
data1=200;
xianshi();
}
/************************主函数******************************/
void main()
{
init();
print(dis1);
data1=200;
xianshi();
while(1)
{
chuli();
if(reset==0) huifu();
if(confirm==0) queren();
if(set==0) shezhi();
if(plus1==0)
{
delay(20);
if(plus1==0) q=1,jia();
}
if(plus10==0)
{
delay(20);
if(plus10==0) q=10,jia();
}
if(plus100==0)
{
delay(20);
if(plus100==0) q=100,jia();
}
if(minus1==0)
{
delay(20);
if(minus1==0) q=1,jian();
}
if(minus10==0)
{
delay(20);
if(minus10==0) q=10,jian();
}
if(minus100==0)
{
delay(20);
if(minus100==0) q=100,jian();
}
}
}