1、 毕业设计 题 目: 学院名称: 班 级: 学生姓名: 学 号: 指导教师: 教师职称: 20 年 06 月13 一:概述 1.1选题背景和意义 电
2、源为保障系统的安全性与稳定性都起到有至关重要的作用,本篇我们主要研究恒流源。而恒流电源由于它体积特别小、损耗相对低、而效率较高、还有它简洁的电路都比较受欢迎,在我们平时用的计算机设备、通信设备,仪器仪表上面,还有航空航天上面通信设备等都需要恒流源系统。近年来电子信息的产业是发展相当快的,恒流电源也更多的被运用到我们生活中,因此,对恒流电源的研究就显得更有意义以及价值。 数控恒流源技术是一种对实践性要求很高的工程技术,它存在与各个行业中,我们在日常会经常看到。电源技术还和电气电子、控制理论等一些其它科学领域相互交叉融合,促进了现在信息技术和电源技术的发展。这也预示着在系统上面对电源技术的要求更
3、高。普通的电源系统在工作时候容易产生误差,这样会对整个系统的精确度产生影响,更严重的是会带来很多严重的后果。世界各国为了解决这个问题便对电源产品制定了不同要求和一系列产品精度标准,只要达到要求达到标准后才可以进入市场。经济全球化的发展让电源产品流通更加方便,但是必须满足国际标准才可以有通行证。数控电源发展的比较晚,从八十年代才开始,那个时候电力电子的理论就开始建立。电力电子理论为今后的电源产品的发展奠定了很好的理论基础,随之,数控电流源技术得到了快速蓬勃的发展。但是市场上的很多产品还是输出精度低,带负载能力较差,体积相对大等缺点。当然这也给了数控电流源的发展指明方向就是不断完善上面的缺点不足。
4、数控直流电流源对精度的要求会越来越高。单片机,新的控制理论,这些都为精确数控电源的发展提供基础。从组成上,数控电流源分为器件、主电路和控制电路三部分。 在这个课题中我们主要分析的是基于单片机的数控直流恒流源系统的设计,电源是能够向负载提供恒定的电流。因为恒流电源的在日常生活中应用范围比较广泛,在很多地方都是不可缺少的。比如我们平时用充电器给蓄电池充电的时候,当蓄电池端电压逐渐升高的时候,充电电流就会慢慢的减少。我们保证以电流不变充电,这时候就必须随时提高充电器的输出电压,这样劳动的强度和生产效率都会大打折扣,但是如果我们现在采用恒流源输电呢,就可以完全弥补其不足。当我们对电阻器阻值的
5、测量和分级时候,只要电流越稳定,那么我们就能使测量越准确。它还可以给放大电路提供偏流,或者作为有源负载等等。所以在差动放大电路中我们会经常看到它的应用。 1.2国内外研究现状、发展动态 现状:在我们的国家,我们的电源技术以电力电子技术作为核心,从二十世纪六十 年代就开始形成,在几十年的发展中,对系统效率的要求更高和对功耗的要求更低还有 通信设备技术的更新这些都推动了我国电源行业中的直流/直流转换器迈向更高的灵活性与智能化,电源产业也因此得到了快速的发展。在电源产业规模的的快速发展的同时,国家自然科学基金也提供的较大的帮助和以推动不断的创新,使我国电力电子技术的发展从吸收消化和一般跟踪发
6、展从而迈向前沿的跟踪和基础的创新,我们国家也生产中了电源产业一些难度较大和国际先进水平相比的一些产品以及较多的具有代表性的研究成果以及产品。我们国家做出了很多努力来促进电源行业的发展。虽然发展快速但是我国电源产业和世界上一些发达额国家做比较,我们就会发现其实还是存在较大的差距呢。 随着技术的进步与发展,人们对数控恒定电流器件的需求越来越高。曾经的恒流源器件正在被快速发展的恒流源系统所替代。体积更小、精度更高、稳定性更好是未来恒流源的发展方向与拽求。因为我们研究分析恒流源系统的设计组成是很有现实意义的。相对与传统的智能电源模块,数字化智能电源模块减少了生产过程中的不确定因素和人
7、为参与的环节从而减少了误差弥补了传统电源模块的不足,从而使电源模块中更加可靠、更具备智能化和产品一致性,这样极大的提高了生产的效率和生产的产品的可维护性。 二:总体方案的设计 2.1 设计任务 输入交流电压200~240V,50Hz;输出直流电压≤6.5V。 1、输出电流范围:0.04A~9.83A; 2、可设置并显示输出电流给定值,要求输出电流与给定值偏差的绝对值≤0.05; 3、利用proteus软件对整体电路进行仿真验证。 2.2 设计思路 设计思路是:这个系统是485总线控制的数控恒流源系统,包括多个数控恒流源的电压和电流监控及控制。以单片机为主控制器,电脑
8、输入信号后,由转换装置将Rs232接线转为Rs485总线。Rs485接线分别接模版一,模块二等模块。单片机接受到485传的数字信号,经过D/A转换输出模拟量,控制信号的变化。上位机PC端对恒流源进行实时监控,通过单片机PIC16F877A的A/D输入端接口,实时把模拟量转化为数字量,再经单片机分析处理反映给上位机,在上位机上通过数字量形式展现出来,从而构成稳定的恒流源。 2.3 总体方案的设计 在系统的总设计方案里面,我们会用到有单片机PIC16F877a模块,D/A转换模块。,V/I转换等,最终确定的系统框图如图2.1所示 : :
9、 图2.1 系统框图 此方案采用电脑控制改变输入信号的方法来改变电流的大小。利用DAC0832在单片机程序控制下提供可变的基准电压,电压经过V/I转换电路,压控恒流源系统最后得到电流通过单片机PIC16F877A的A/D转换接口将输出电流反馈至单片机进行比较,调整DAC0832的输入电压,从而达到数控的目的。 三:硬件模块的设计 系统的成功与否很大程度上在与硬件模块的设计,我们分别分析以下模块 3.1 稳压电源电路的设计 这个系统中有单片机PIC16F877a,DAC0832,OP07等这些
10、器件都需要稳压电源。但由于我们是在运用Proteus仿真,所以对于此模块我们可以用软件自带的励磁电压替代。 3.2 恒流源电路的设计 恒流源的设计我们采用运放和场效应管的压控恒流源。这个电路较简单,稳定性较高。电路由光耦合三极管,运算放大器OP07、大功率场效应管IRFP150N、采样电阻R1等组成。输入的模拟信号通过光耦合三极管会输入一定的电压值,在这个电路中,调整管采用大功率场效应管IRFP150N工作于饱和区时,漏电流Id近似可以看作电压U10控制的电流,而场效应管的漏极电流和源极电流近似相等,所以可以看作为是珊极电压控制着源极电流的变化,通过测量采样电阻R1两端的电压值
11、就可以断定是达到了恒流的效果。电路如图3.1所示: 图3.1 压控恒流源原理图 3.3 采样电压、电流电路的设计 在该电路中,采用OP07的求差电路测量负载的两端电压值输出模拟信号U8,输出的模拟信号再经OP07的放大电路使输出电压变为(R14+R13)/R13倍的电压,然后再将模拟信号连接单片机PIC16F877A的模拟信号接口RA0端,同时再将值返回给输入信号做比较。如下图3.1所示: 图3.1 负载电流、电压测量电路 3.4 D/A和A/D
12、转换器模块 单片机与外部数据连接分别由A/D模块和D/A模块,所以这两个模块的选择与使用非常重要。 3.4.1.D/A转换器 D/A转换器可以将从单片机输入的数字信号转化为容易比较直观测量的模拟信号。DAC0832与微处理器兼容,并且是8分辨率的D/A转换集成芯片。接口简单,价格较低这些都是它的优点。DAC0832广泛的应用在单片机系统中。8位输入锁存器、8位DAC寄存器、8位D/A转换电路及转换控制电路共同构成D/A转换器。如下图3.2所示: 图3.2 D/A转换器图 D
13、0~D7引脚是8位的数据输入线,TTL电平(5V等价于逻辑“1”,0V等价于逻辑“0”),在本系统中,这8个引脚作为单片机的信号输入线; ILE引脚:高电平有效,数据锁存允许控制信号输入线,在本系统中与单片机的RA2引脚连接; CS引脚:片选信号输入线,在本系统中做接地处理,低电平有效; WR1:这个是数据锁存器写选通输入线。在本系统中ILE、CS、WR1均做接地处理; XFER:数据传输控制信号输入线,低电平有效,负脉冲(脉宽应大于500ns)有效; WR2:这个引脚是DAC寄存器选通输入线,负脉冲有效。在本系统中将WR2、XFER做接地处理。 IOUT1:电流1输出端,其值随D
14、AC寄存器的内容变化而线性变化; IOUT2:电流输出端2,其值与IOUT1值之和为一常数; Rfb:这个引脚是反馈信号输入线,改变Rfb端外接电阻值可调整转换满量程精度; Vcc:电源输入端,Vcc的范围为+5V~+15V; * VREF:基准电压输入线,VREF的范围为-10V~+10V; * AGND:模拟信号地; * DGND:数字信号地。 3.4.2 A/D转换器 由于我们用的是单片机PIC16F877A,而此单片机上面有RA0,RA1等模拟信号输入端,因此我们不需要再用其他A/D转换模块。 3.4.3 D/A与单片机连接电路 在
15、这个电路中,单片机的RD的8个引脚全接D/A0832的8个串行并行输入口,给VCC施加5V的电压,CS,WR1,GND均做接地处理。ILE引脚接单片机RA2引脚作为单片机的参考电压输出。整体D/A0832与单片机PIC16F877A连接电路如下图3.3所示。 图3.3 D/A与单片机图 3.5 PIC16F877A控制模块 在恒流源系统的设计中,我们本次选用功能强大的PIC16F877A单片机作为控制器。 3.5.1 PIC16F877A主要功能的简单介绍 PIC16F877A单片机它的功能比较的齐全。它有33个I/O引脚,A有6
16、个,B有8个,C有8个,D有8个,E有三个引脚。它内部的功能可以做A/D转换器、模拟比较器,带比较和捕捉功能的定时器/计数器等等。它的每个引脚基本都有2到三个功能。在这个本次设计中,我们会用到它的A/D转换功能,实用性比较高。 在这次设计中我们主要用到的PIC16F877A系统配置引脚有: VDD:正电源端。VSS:接地端。 OSCI/CLKIN:时钟振荡器晶体连接端1/外部时钟源输入端。 OSC2/CLKOUT:时钟振荡器晶体连接端2外部时钟源输出端。 主复位引脚.MCLRNPP:人工复位输入端(低电平有效)/编程电压输入端。 RA0到RA3,RE1,RE2:模拟信号输入
17、端。 RD0到RD7:并行口与其它微处理器连接端口。 RC6,RC7:分别作为串行通信的发送和接收数据端口。 RC4,RC5:分别作为SPI数据输入,输出。 除此晶振CLOCK=4MHZ。 3.5.2 PIC16F877A与485总线连接电路 RS485的传输距离比较远,从几米大至几千米,它的抑制共模干扰能力特别强,与232比较,485的串口通讯可以一对多,在本次设计中,一个上位机可以发信号给多个下位机进行控制,而上位机与下位机之间的通讯就是通过485线连接的。其中上位机通过485总线与单片机进行连接的原理如图3.4所示: 图3.4
18、D/A转换器与485连接图 3.6 输出电流测试图样 我们需要的软件有peotues,虚拟串口助手。将程序文件写入单片机,然后将虚拟串口导入到peotues软件内。然后开始仿真运行。这时候可以看到整个电图处于工作状态。在虚拟串口中按照485通讯格式输入字符串AA 41 00 04 55。点击执行可以看到单片机系统显示6.96A的电流。改变输入的字符串输出电流也会改变它们的误差大约在0.03左右。如下图: 未输入字符串之前: 输入字符串: 输入字符串之后显示的电流值: 3.7 上位机的测试 在上位机页面
19、左边显示的是电流设置值,是输入的电流信号。右边显示的是实时变化显示的输出电流。由于我们所选的D/A转换器为0832,其精度达不到,会产生一些误差,导致输入与输出值有稍微的偏差。如下图: 假如我们输入的电流值是5A,上位机页面所得到的图样为: 电路图纸上面显示的电流为: 当改变外界电阻RVI大小时候。就会对输出的电流信号产生影响,上位机会实时的采集显示输出电流的变化值。 四:软件设计 数控的核心部分就是软件设计了,是决定是否实现恒流源的重要因素,在本篇的设计中,我们采用C语言编程设计,运用mplab ide 软件进行编译。 4.1 程序说明 软件部分需
20、要解决的主要难点是上位机输入的预置电流值转换为误差放大器的高精度基准电压,并跟踪显示。在本次设计中我们采用C语言,对PIC16F877A进行编程以实现各种功能。 软件实现的功能是: 1.电流给定值的设置 2.测量输出电流值 3.控制DAC0832工作 编程是个复杂的步骤,不断的仿真研究后,具体程序见附录二。 4.2 程序流程图 软件总体流程图如下图4.1所示。 图4.1 软件总体流程图 协议为0X01为本机地址,0X41为修改电流的功能,后面两个字节为电
21、流设定值。最后以0X55为一帧的结尾。按照流程图的思路编程,程序运用mplab ide 软件进行编译,在符合要求后写入单片机不断的进行仿真调试,直至达到设计要求。 总 结 本次毕业设计是对数控恒流源系统的设计研究,选取的是上位机,下位机两大模块共同构建而成。其中最重要的就是下位机中的单片机模块,DA模块,压控恒流源模块的选取。在此次设计中还是遇到了不小的困难。 查阅网上的资料时候比较零碎繁琐,很多专业术语还都了解不了。在指导老师的帮助下才逐渐熟悉了正个电路的构建与功能应用。在上位机
22、的设计和软件的设计上面都遇到了很大的困难,让作为本科毕业生的我明显感到自己所具备知识的欠缺。 本次毕业设计,使得我对数控恒流源系统有了更加深刻的认识,对其原理更加清楚。当然,在做毕业设计的过程中也明白了自身的不足之处,也学到了很多东西,包括对Proteus的使用和对文献资料的查阅有了一定的提高,我相信这也将对我即将踏出校园进入工作岗位有很大的帮助。 致 谢 通过这次毕业设计让我学到了很多东西,写论文的资料要靠自己从图书馆和网上进行查阅,很好的锻炼了我的自学以及搜集
23、信息的能力。在这里,我更应该感谢我的导师徐峰老师,一位特别亲切的指导老师,一路陪我走来,当我有问题的时候,都会认真详细的为我指导,有些问题甚至将了好多遍,直到我听懂为止。在和同学们的交流中我也学到了很多知识。在跨出校门进入工作岗位后,我会更加努力的学习,以便取得更大的进步。 参 考 文 献 [1] 李广弟,朱月秀,冷祖祁.。单片机基础。 [2] 马忠梅,籍顺心,张凯,马岩。单片机的C语言应用程序设计。 [3] 清华大学电子学教研组,阎石(主编)。数字电子技术基础。 [4] 邱关源(原著),罗先觉(修订)。电路分析。 [5] 曾
24、波.数控恒流源[J].电子世界,第九期。 [6] 骆震波.直流数控电流源的设计与实现。 [7] 今日电子,2008年电源增刊,2008.111~113。 全国大学生电子设计竞赛组委会.2005年全国大学生电子设计竞赛试题。 附录: //----------------------------------------------------------------- // 名称: MODBUS总线通信仿真(从机程序) //----------------------------
25、
// 说明: 本例运行时,从机接收主机命令,然后将执行再把数据通过485回发给主机.
//
//-----------------------------------------------------------------
#define _XTAL_FREQ 4000000
#define INT8U unsigned char
#define INT16U unsigned int
#define INT32U unsigned long
#include
26、e
27、F&DEBUG_ON&CP_OFF); volatile INT8U recv_Data[5];//={10,11,12,13,14,15,16,17,18,19,20}; //串口接收数据缓冲区(11字节) volatile INT8U DATA[2];//={21,22,23,24,25,26,27,28}; //采集信号数据和接收进行比对 volatile INT8U recv_idx = 0; //串口接收数据缓冲区索引 volatile INT8U CMD=0; //测试 /*上位机命令:要求从机返回相关数据的自定义命令
28、码(范围65~66), 65表示设置电路,66表示采集*/ volatile INT16U count=0,test=0; //时间TIMER0定时1秒不够,要count补充,当count>3662时超过一分钟 //count=15时表示1秒 //volatile INT16U count1=0,count2=0; static INT8U CRC=0x55; //8位CRC校验码 //--------------------------------------------------
29、 //#define CLRWDT() asm("clrwdt") //#define LED_Recv RB6 //主机接收指示灯 //#define LED_Send RB7 //主机发送指示灯 #define RDE_485 RC5 //RS485通信控制端高位允许发送/低位允许接收 #define sl_Addr 1 //定义485从机地址,可根据要求修改,每个芯片不一样 //19200波特率每
30、字符时间为: 1/19200*(1+8+2) ≈ 572us //帧 间: 3.5个字符时间为: 572 * (3.5 + 1) ≈ 2574us //字节间: 1.5个字符时间为: 572 * (1.5 + 1) ≈ 1430us #define FRAME_SPAN 2574 //相临帧之间的间隔时间 #define BYTE_SPAN 1430 //帧内字节之间的间隔时间 bit F_T1, T_BYTE, T_FRAME, Recv_OK;//相关标识位 #define delayus
31、x) \
{ \
INT16U i; \
for(i=0;i 32、
#define Send_Byte(x) \
{ \
RDE_485 = 1; \
TXREG = x; while (TRMT == 0); \
asm("NOP");asm("NOP");asm("NOP"); \
asm("NOP");asm("NOP");asm("NOP"); \
asm("NOP");asm("NOP");asm("NOP"); \
}
// 33、
// 宏定义: 设置TIMER1的定时初值并设相关标志位
//-----------------------------------------------------------------
#define Set_TIMER1(x) \
{ \
TMR1H = (65536 - x) >> 8; \
TMR1L = (65 34、536 - x) & 0x0F; \
TMR1IF = T_BYTE = T_FRAME = 0; \
F_T1 = (x == FRAME_SPAN) ? 1 : 0; \
if (F_T1) recv_idx = 0; \
}
extern void Process_User();
//-----------------------------------------------------------------
// 延时定义用延时程序 15=1s
//------------------------------- 35、
void delay(unsigned int x)
{
TMR0=0;count=0;T0IF=0;
while(count 36、
void Serial_port_init()
{
SYNC = 0; //选择异步通信模式
BRGH = 1; //选择高速波特率发生模式
TXEN = 1; //允许发送数据
SPBRG = _XTAL_FREQ/16/19200 - 1; //设置波特率为19200
SPEN = 1; 37、 //串行通信端口打开
CREN = 1; //使能连续接收串行数据
}
//-----------------------------------------------------------------
// 外设初始化(定时器,485等)
//-----------------------------------------------------------------
void Per_Initialize()
{
ADCON0=0X01;ADCON1=0X8E;//只打开R 38、A0作为AD采集,采集结果高6位为0
ADIF=0;
TRISA0=1;TRISA2=0;
CMCON=0X07;
RDE_485=1;//后来修改
//设置D口作为数据输出控制0832
TRISD=0;
PORTD=0;
//open=0;
TRISC7=TRISC6=1;//TX,RX的数据口方向配置
TRISC5=0;//485口数据方向为输出
TRISC4=0;//进行485虚拟仿真时需要
//配置定时器TIME0
T0CS=0;PSA=0;PS2=1;PS1=1;PS0=1;//前256分频给TIME 39、R0
//T0CS=0;PSA=1;PS2=1;PS1=1;PS0=1;//前256分频给看门狗
//T2CON=0X3F;PR2=230;TMR2IE=0;TMR2IF=0;//启动计数器T2
Serial_port_init();
RDE_485=1;//允许发送,禁止接收
RC4=0;//测试时用
//这儿可进行相关端口初始化自己设置
//端口设置初始化完毕
RCIE=1;//允许串口接收中断
TMR1IE=1;//允许时间TIMER1溢出中断
PEIE=1;//外围中断
GIE=1;//全局中断
RDE_485= 40、0;//允许接收,禁止发送
RC4=1;//测试时用
TMR1ON=1;//启动TIMER1
delayus(2);
Set_TIMER1(FRAME_SPAN);
Recv_OK=0;
}
void Process_User()//自己定义程序进行相关事务处理
{
INT8U i;
if(recv_Data[1]==65)//表示设置电流
{
PORTD=recv_Data[3];
ADIF=0;
GO_DONE=1;
while(ADIF==0);
//ADIF=0;
DATA[0]=ADRE 41、SH;
DATA[1]=ADRESL;
//test=(DATA[0]<<8)|DATA[1];
Send_Byte(sl_Addr);//发送从机地址
Send_Byte(recv_Data[1]);//发送指令
for(i=0;i<2;i++)
Send_Byte(DATA[i]);//发送采集的数据
Send_Byte(CRC);//发送校验码
}
else if(recv_Data[1]==66)//表示数据采集
{
ADIF=0;
GO_DONE=1;
while(ADIF==0 42、);
//ADIF=0;
DATA[0]=ADRESH;
DATA[1]=ADRESL;
Send_Byte(sl_Addr);//发送从机地址
Send_Byte(recv_Data[1]);//发送指令
for(i=0;i<2;i++)
{
Send_Byte(DATA[i]);//发送采集的数据
}
Send_Byte(CRC);//发送校验码
}
}
//---------------------------------------------------- 43、
// 主程序
//-----------------------------------------------------------------
void main()
{
RA2=1;
Per_Initialize(); //外设初始化
RA2=1;
PORTE=PORTE;//因为是施密特触发器
while(1)
{
//---------------------------------------------------------
//如果从 44、机接收主数据成功则继续下面的处理
if(Recv_OK&&recv_Data[1]==65)
{
GIE=0;
Recv_OK=0;
//数据校验时需要
if((recv_Data[0]==sl_Addr)&&(recv_Data[4]==CRC))
{
RDE_485=1;//允许发送,禁止接收
RC4=0;//测试时用
//delayus(60);//延时1ms
Pro 45、cess_User();//用户自己处理数据可根据需求编写
RDE_485=0;//允许接收,禁止发送
RC4=1;//测试时使用
}
GIE=1;//开中断
}
else if(Recv_OK&&recv_Data[1]==66)
{
GIE=0;
Recv_OK=0;
//数据校验时需要
if((recv_Data[0]==sl_Addr)&&(recv_Data[4]==CR 46、C))
{
RDE_485=1;//允许发送,禁止接收
RC4=0;//测试时用
//delayus(60);//延时1ms
Process_User();//用户自己处理数据可根据需求编写
RDE_485=0;//允许接收,禁止发送
RC4=1;//测试时使用
}
GIE=1;//开中断
}
}
}
//---------------------------- 47、
// 主机定时中断及485接收中断服务程序
//-----------------------------------------------------------------
void interrupt ISR()
{
INT8U R;
//CLRWDT();
//----------------------TIMER1定时器溢出中断--------------------
if (TMR1IF)
{ TMR1IF = 0;
//F 48、T1: 标识TIMER1定时器当前用于实现帧间隔时间定时还时字节间隔时间定时
//F_T1 = 0时,将帧间隔时间(3.5字符)到达设为假,字节间隔时间到达设为真
//F_T1 = 1时,将帧间隔时间(3.5字符)到达设为真,字节间隔时间到达设为假
if(F_T1==0){T_FRAME=0;T_BYTE=1;}
else {T_FRAME=1;T_BYTE=0;}
}
//-------------------------串口接收中断----------------------- 49、
if (RCIF)
{
// LED_Recv = ~LED_Recv; //主机接收指示灯闪烁
R = RCREG; //从串口(来自485)读取一字节
RCIF = 0; //清标志位(此行可省略)
Recv_OK = 0; //先暂时设接收成功标志为假
//---- 50、
//如果当前要接收的是第0字节
if (recv_idx == 0)
{
if((T_FRAME==0)||((R!=0)&&(R!=sl_Addr)))
{
Set_TIMER1(FRAME_SPAN);
}
else
{
recv_Data[recv_idx++]=R;






