数控稳压电源设计报告专业班级:电子1101班姓名:肖潇学号:1130010201232014年5月12日摘要直流稳压电源是电子技术领域的常用仪器设备之一,能在电网电压产生波动或发生负载发生变化时提供稳定的直流输出电压。
常规的直流稳压电源由电源变压器、整流、滤波和稳压电路等部分组成,大多采用串联反馈式稳压原理,通过调节输出取样支路中的电位器来改变输出电压值。
由于电位器阻值变化的非线性和调节范围限制,普通直流稳压电源的输出电压精度不高。
随着使用时间的增加,由于粗调的波段开关和用于细调的电位器的接触不良也会对输出电压产生较大影响,且调节较为繁琐。
针对常规直流稳压电源的上述缺点,设计了一款数控可调直流稳压电源,其额定输出电压0-30V可调,额定输出电流0-4A可调,其输出电压精度高且稳定性强,参数设置操作简单,带有掉电数据保护、过热保护、过流保护、过压保护功能,还可以实时检测并显示实际的电压/电流输出值。
关键词:数控;稳压电源;A/D转换;D/A转换;过流保护一、设计任务设计制作具有一定电压范围和功能的数控电源。
二、设计要求基本要求:a 输出电压:范围 0~15V ,步进 0.1V,纹波不大于10mvb输出电流: 500mAc 输出电压由数码显示d 用”+”.”-”键控制输出电压进行增/减调整发挥部分:a 自动扫描输出电压b 扩展输出三角波等电压种类c 输出电压可预置在0~15V之间的任意值三、系统方案论证与选择根据题目要求,本设计的系统可以划分为如下十个部分:辅助电源部分、单片机控制部分、D/A转换部分、A/D转换部分、电压基准部分、电压电流反馈调节部分、输出显示部分、输入调节设定部分、过热保护部分、过流保护部分。
系统方框图如下:A/D转换电压/电流取样及放大编码器/按键温度采样散热器(风扇散热)误差比较放大输出双层硬件过流保护单片机D/A转换液晶显示过热保护220V输入变压器降压(绕组切换)整流滤波稳压电路辅助电源稳压电路3.1 系统的基本方案在本设计中,为了尽可能提高实验成品各方面的性能指标,对几个比较重要的模块分别进行了几种不同的设计方案论证,并选取最优方案。
3.1.1 单片机的选取方案一:选用PIC、或AVR等作为控制核心;这些单片机资源比较丰富,可以实现复杂的逻辑功能,功能强大,完全可以实现对本系统的控制。
但对于本题目而言,其优势资源无法得以体现,且成本稍高。
方案二:采用片STC公司的STC12C5A系列单片机,该系列单片机外设资源丰富,IO口比传统单片机多,并且由于其功耗低、体积小、技术成熟和成本低等优点,比较适用于本系统。
本设计中,最终选择方案二,采用STC12C5A60S2单片机。
3.1.2 变压器的选择系统需要多路辅助电源,单片机STC12C5A60S2、数模转换器TLV5618、电压基准源REF5020等均需要5V的电压为之供电;散热器、继电器等均需要12V的电压为之供电;运放还需要双电源±12V供电。
方案一:采用普通变压器来给电路供电,变压器输出直接整流滤波然后分别稳压到所需电压给系统各个模块供电,但是这样会导致低压稳压芯片压差较大,效率非常低,容易烧毁稳压片。
主电源输出时,如果要输出较低的电压也会导致电路效率极低,发热严重,对散热器有较高要求。
此方案优点是普通变压器价格便宜易于购买。
方案二:采用多抽头变压器,对于各路辅助电源采用对应电压的抽头输出进行整流滤波稳压,这样提高了辅助电源模块的工作效率,降低了发热量。
主电源输出也采用多抽头,根据设定输出电压控制继电器切换到不同抽头来将稳压电路的输入输出压差降到比较小,这样提高了电源的效率,降低了发热量,增加了电路可靠性。
但是此方案需要订做专用变压器,且成本较高。
本设计中,最终选择方案二,采用多抽头变压器。
3.1.3 D/A转换器的选取方案一:采用DAC0832作为D/A转换器。
它是采用CMOS工艺制成的单片直流输出型8位数模转换器,有两路输出,它价格低廉,接口简单,但是它需要占用单片机较多的IO口,并且对于本系统其位数也显得不够。
方案二:采用TLC5618芯片作为D/A转换器。
它是具有串行接口的12位数模转换器,其输出为电压型,有两路输出。
只需要通过3根串行总线就可以完成对它的控制,但是其控制程序稍微复杂一些,价格也较高。
本设计中,最终选择方案二,采用TLV5618芯片作为D/A转换器。
3.1.4 A/D转换器的选取方案一:采用单片机自带A/D转换器。
单片机自带的是10位A/D转换器,有8个输入通道,其A/D转换速度可以达到几十千赫兹。
此方案优点是不增加额外成本,控制也更简单,但是由于其不能外接基准电压,其精度相对较差。
方案二:采用AD7705作为A/D转换器。
AD7705是16位双通道差分输入A/D,在输入范围内它可以检测电路任意两点间的电压,不需要复杂的采样电路,其缺点是A/D转换速度较慢,仅几十赫兹。
本设计中,最终选择方案二,采用AD7705芯片作为A/D转换器。
3.1.5 电压基准芯片的选取方案一:采用TL431作为电压基准芯片。
TL431最小可以输出2.5V电压,精度有8位,但是其温飘较大,容易受温度影响。
其价格比较便宜。
方案二:采用REF5020作为电压基准芯片。
REF5020是TI公司生产的12位的电压基准芯片,输出2.048V,温飘很小,在本设计中它很适合作为A/D、D/A 芯片的电压基准。
本设计中,最终选择方案二,采用REF5020芯片作为电压基准。
3.1.6 显示器件的选取方案一:采用LED数码管显示。
使用多个数码管动态显示,由于显示的内容较多,过多的增加数码管的个数显然不可行,并且比较占用单片机资源。
方案二: 采用LCD12864液晶显示。
可以显示英文及数字,利用单片机来驱动液晶显示模块,设计简单,显示信息量较多,且容易控制。
但是其成本较高。
方案三:采用2.4英寸TFT彩色液晶屏显示。
该屏幕分辨率320*240,可以显示图片、动画等,它对单片机速度要求比较高,占用IO口较多,控制程序相对复杂,用STC12C5A60S2只能显示一些文字自字符等静态画面,但是其价格较低,显示效果很好。
本设计中,最终选择方案三,采用2.4英寸TFT彩色液晶屏作为显示器件。
3.1.7 功率控制方案的选取方案一:选用三极管来实现功率控制,它是电流控制型器件。
在该设计中,由于驱动电路工作频率较高,若采用三极管实现功率控制,会需要较大的驱动电流。
方案二:选用场效应管来实现功率控制,它是电压控制型器件。
其功率比三极管更大,驱动电路也比较简单,响应速度快,比较适合用于大功率的场合。
本设计中,最终选择方案二,采用IRFP450场效应管来实现功率控制。
3.2 系统的最终方案经过仔细分析和论证,决定了系统各模块的最终方案如下:主要器件:(1)单片机:STC12C5A60S2(2)变压器:多抽头变压器(3)D/A转换器:TLV5618(4)A/D转换器:AD7705(5)电压基准芯片:REF5020(6)显示器件:2.4英寸TFT彩色液晶(7)功率管:IRFP450其它主要器件:OPA2227运放,OPA2228运放,EC11编码器,五脚继电器,LM35温度传感器,CPU散热器,78/79系列稳压芯片四、系统硬件设计与实现4.1.1系统硬件的基本组成基于单片机STC12C5A60S2设计的高精度数控直流稳压电源,数控部分采用双路12位高精度D/A转换器 TLV5618控制稳压电路的输出电压和输出电流; 采用16位高精度 A / D 转换器AD7705测量输出电压和输出电流; 采用EC11带按键编码器作为电压电流的设定装置;采用2.4英寸TFT彩色液晶屏显示设定的电压电流和实际输出电压电流;电源以电压串联负反馈稳压电路为基础来进行稳压和恒流输出。
4.2.1 电压串联负反馈稳压电路(稳压、恒流/过流保护)4.2.2 电压取样及放大电路电流取样及放大电路原理与该电路一样。
4.2.3 变压器绕组切换电路4.2.4 辅助电源电路4.2.5 电源整流滤波电路4.2.6 编码器驱动电路4.2.7 电压基准源电路4.2.8 A/D转换及D/A转换电路4.2.9 单片机最小系统4.2.10 温度采集电路五、系统软件设计5.1 程序流程图六、系统性能测试6.1 电压设定精度以及检测精度 检测电压 设置电压(V) 实测电压(V) 设置相对误差 检测相对误差 (V) 0.092 0.099 0.092 0.00% 7.61% 0.192 0.196 0.193 0.52% 1.55% 0.292 0.302 0.293 0.34% 3.07% 0.392 0.408 0.394 0.51% 3.55% 0.492 0.494 0.494 0.41% 0.00% 0.592 0.595 0.593 0.17% 0.34% 0.692 0.704 0.692 0.00% 1.73% 0.792 0.804 0.793 0.13% 1.39% 0.792 0.801 0.793 0.13% 1.01% 0.892 0.893 0.892 0.00% 0.11% 0.992 0.996 0.993 0.10% 0.30% 1.092 1.097 1.091 -0.09% 0.55% 2.012 2.016 2.007 -0.25% 0.45% 3.012 3.013 3.010 -0.07% 0.10% 4.012 4.013 4.009 -0.07% 0.10% 5.012 5.009 5.010 -0.04% -0.02% 6.012 6.016 6.013 0.02% 0.05% 7.012 7.017 7.015 0.04% 0.03% 8.012 8.022 8.024 0.15% -0.02% 9.000 8.999 8.998 -0.02% 0.01% 10.00 9.992 9.999 -0.01% -0.07% 12.00 12.010 12.060 0.50% -0.41% 14.00 14.000 14.009 0.06% -0.06% 16.01 16.000 16.010 0.00% -0.06% 18.01 18.010 18.017 0.04% -0.04% 20.01 20.000 20.009 0.00% -0.04% 25.00 25.000 25.005 0.02% -0.02% 30.00 30.000 30.015 0.05% -0.05% 35.01 34.990 35.011 0.00% -0.06% 40.01 40.010 40.020 0.02% -0.02%6.2 电流设定精度以及检测精度设置电流 (A) 0.021 0.051 0.101 0.202 0.302 0.403 0.503 0.603 0.704 0.804 0.9 1 1.1 1.201 1.301 1.402 1.502 1.602 1.703 1.803 1.904 2.004 2.2 2.401 2.602 2.802 3.003 3.204 3.4 3.601 3.801 4.002 4.203 4.404检测电流 (A) 0.026 0.057 0.104 0.206 0.306 0.405 0.505 0.604 0.706 0.805 0.902 1.002 1.104 1.203 1.304 1.404 1.504 1.604 1.705 1.804 1.906 2.007 2.201 2.401 2.605 2.802 3.005 3.206 3.403 3.604 3.805 4.005 4.203 4.402实测电流 (A) 0.023 0.053 0.102 0.203 0.302 0.403 0.502 0.602 0.704 0.803 0.899 1 1.101 1.201 1.302 1.402 1.503 1.604 1.704 1.805 1.905 2.007 2.202 2.402 2.606 2.806 3.007 3.208 3.407 3.606 3.806 4.006 4.205 4.406设置相对误差 检测相对误差 9.52% 3.92% 0.99% 0.50% 0.00% 0.00% -0.20% -0.17% 0.00% -0.12% -0.11% 0.00% 0.09% 0.00% 0.08% 0.00% 0.07% 0.12% 0.06% 0.11% 0.05% 0.15% 0.09% 0.04% 0.15% 0.14% 0.13% 0.12% 0.21% 0.14% 0.13% 0.10% 0.05% 0.05% 13.04% 7.55% 1.96% 1.48% 1.32% 0.50% 0.60% 0.33% 0.28% 0.25% 0.33% 0.20% 0.27% 0.17% 0.15% 0.14% 0.07% 0.00% 0.06% -0.06% 0.05% 0.00% -0.05% -0.04% -0.04% -0.14% -0.07% -0.06% -0.12% -0.06% -0.03% -0.02% -0.05% -0.09%6.3 稳压系数 设置电压(V) 负载电流(A) 负载电压(V) 0.00 5.011 5.012 1.00 5.005 4.23 4.987 0.00 10.000 10.000 1.60 9.991 4.00 9.976 0.00 20.009 20.010 1.90 19.996 4.23 19.983 0.00 30.015 30.000 2.10 29.994 4.23 29.989 6.4 纹波稳压系数 0.48%0.24%0.09%0.04%输出 空载 30V/4A稳压模式 恒流模式 纹波<1mV 纹波<1mV 纹波<8mV 纹波<3mV七、参考文献[1] 邱关源,罗先觉,电路(第五版) ,高等教育出版社,2006.5 [2] 铃木雅臣(日) ,晶体管电路设计(下) ,科学出版社,2004 [3] 陶桓奇,张小华,彭其圣,模拟电子技术,华中科技大学出版社,2007.3 [4] 佘新平,数字电子技术(第二版) ,华中科技大学出版社,2009.8 [5] 郭天祥,51 单片机 C 语言教程,电子工业出版社,2009.1 [6] 高吉祥,唐朝京,全国大学生电子设计竞赛电子仪器仪表设计,电子工业出 版社,2007.8 [7] 黄智伟,全国大学生电子设计竞赛系统设计(第 2 版) ,北京航空航天大学 出版社,2011.2 [8] 黄智伟, 全国大学生电子设计竞赛常用电路模块制作,北京航空航天大学出 版社,2011.1 [9] Stephen prata(美),C primer plus(第五版)中文版,人民邮电出版社, 2005.2 [10] 高飞飞,高文才,C 语言程序开发范例宝典(第 2 版) ,人民邮电出版社, 2012.6 [11] / IC 资料网 [12] / 21IC 中国电子网八、附录8.1 调整输出板原理图成换已换成8.2 控制板原理图8.3 部分程序代码 #include<stc12c5a.h> #include<stdio.h> #include<intrins.h> #include"AD7705.H" #include"TLV5618.H" #include"STCAD.H" #include"LCD_driver.h" #include"EEPROM.H" #include"delay.h" int I=196,U=2; float ADI,ADV,ADV1,ADV2,ADV3,ADI1,ADI2,ADI3,Temp,U_U; uchar buffer[14]={0},nU,nI; uchar Step=1,Step_flag=0,U_RL=14; uchar IU_Step[2]={1,1}; uint time=0,time_key=0,Ref=0,time_AD=0,time0=0,time1=0,time2=0,time3=0; uint i1=0,i2=0,i3=0,U_buffer[15]={0},I_buffer[15]={0}; bit t_flag=0,IU_flag=0,AD_delay=0,AD_flag=0; void Timer0Init(void) { AUXR &= 0x7F; // TMOD &= 0xF0; // TMOD |= 0x01; // TL0 = 0x5D; TH0 = 0xFD; TF0 = 0; TR0 = 1; ET0=1; EA=1; } void Timer0() interrupt { TL0 = 0x5D; TH0 = 0xFD; time++; //// // // //1 // //if(OK==0)t_flag=1; else if(OK==1) { t_flag=0; if(time_key<=20)_nop_();else if(time_key<=400)Step_flag++; else if(time_key>400) { IU_Step[IU_flag]=Step_flag; IU_flag=~IU_flag; Step_flag=IU_Step[IU_flag]; } time_key=0; } if(Step_flag>=3)Step_flag=0;} void Timer1() interrupt 3 { TL1 = 0x36; TH1 = 0xF7; time_AD++; time0++; time1++; time2++; time3++; if(time_AD>=100)AD_delay=1,time_AD=0; if(t_flag)time_key++; if(IU_flag==0) { if(Step_flag==0)Step=1; else if(Step_flag==1)Step=5; else if(Step_flag==2)Step=50; } if(IU_flag) { if(Step_flag==0)Step=1; else if(Step_flag==1)Step=2; else if(Step_flag==2)Step=20; }}void Timer1Init(void) { AUXR &= 0xBF; TMOD &= 0x0F; TMOD |= 0x10; TL1 = 0x36; TH1 = 0xF7; TF1 = 0; TR1 = 1; ET1=1; }//1ms@27.000MHzvoid INT00() interrupt 0 { if(P37==0) { if(IU_flag==0)U+=Step; else if(IU_flag)I+=Step; } if(P37==1) { if(IU_flag==0)U-=Step; else if(IU_flag)I-=Step; } if(I>=880)I=880; if(I<=0)I=0; if(U>=2000)U=2000; if(U<=0)U=0;} void main() {P4SW |= 0x70; LCD_Init(); Timer0Init(); Timer1Init(); DA_Init(); rset_ad();AD_Init();EX0=1;IT0=1;EA=1;P3M1=0x00;P3M0=0x21;FS = 0;RL1 = 0;RL2 = 0;RL3 = 0;RL4 = 0;ON = 0;Step_flag = IU_Step[IU_flag];// Pant(0xff,0xff); //Pant(0xf8,0x00); //// Pant(0X07,0xE0); //// Pant(0x00,0x1f); //Pant(0x00,0x00); //LCD_CS =0; //ChineseChar(20,10,2,colors[2],colors[4],1); // ChineseChar(38+14,10,2,colors[2],colors[4],2); // ChineseChar(38+46,10,2,colors[2],colors[4],3); // ChineseChar(70+46,10,2,colors[2],colors[4],4); // ChineseChar(102+46,10,2,colors[2],colors[4],5); //ChineseChar(134+46,10,2,colors[2],colors[4],6); //U = Read_EEPROM(0x00);I = Read_EEPROM(0x02);Temp = result(3);sprintf(buffer,"Temp:%.1f'C ",Temp);LCD_ShowString(0,50,M,colors[7],colors[4],buffer);U_RL = ((U<<1)/100+2)>>1;if(U==0)U_RL=0;if(U_RL>=0x0f)U_RL=0x0f;P1 = (P1&0x0F)|(U_RL<<4);write_da_U(U);write_da_I(I);sprintf(buffer,"SetI:%.3fA",(float)I*0.005+0.0210+0.018*(float)I/ 880);LCD_ShowString(0,150,M,colors[5],colors[4],buffer);nI=sprintf(buffer," %.3fA",Step*0.005);LCD_ShowString(240-nI*M,296,M,colors[5],colors[4],buffer);while(1){if(IU_flag==0){U_RL = ((U<<1)/100+2)>>1;if(U==0)U_RL=0;if(U_RL>=0x0f)U_RL=0x0f;P1 = (P1&0x0F)|(U_RL<<4);write_da_I(I);write_da_U(U);if(U<400)U_U = (float)U*0.02+0.052;else if(U<550)U_U = (float)U*0.02+0.06;else if(U<719)U_U = (float)U*0.02+0.065;else if(U<1200)U_U = (float)U*0.02+0.071;else if(U<1500)U_U = (float)U*0.02+0.083;else if(U<1585)U_U = (float)U*0.02+0.10;else U_U = (float)U*0.02+0.11;if(U_U<10.000)sprintf(buffer,"SetU:%.3fV ",U_U);else sprintf(buffer,"SetU:%.2fV ",U_U);LCD_ShowString(0,100,M,colors[1],colors[4],buffer);nU=sprintf(buffer," %.2fV",Step*0.02);LCD_ShowString(240-nU*M,296,M,colors[1],colors[4],buffer);}if(IU_flag){write_da_U(U);write_da_I(I);sprintf(buffer,"SetI:%.3fA",(float)I*0.005+0.0210+0.018*(f loat)I/880);LCD_ShowString(0,150,M,colors[5],colors[4],buffer);nI=sprintf(buffer," %.3fA",Step*0.005);LCD_ShowString(240-nI*M,296,M,colors[5],colors[4],buffer); }if((AD_delay==1)&&(AD_flag==0)){U_buffer[i1]=AD_V(1);i1++;if(i1==10)i1 = 0;AD_delay=0;time_AD=0;AD_flag = 1;}if((AD_delay==1)&&(AD_flag==1)){I_buffer[i2]=AD_V(2);i2++;if(i2==10)i2 = 0;AD_delay=0;time_AD=0;AD_flag = 0;}if(time0>=200){time0=0;for(i3=0;i3<10;i3++)ADV += U_buffer[i3];ADV1=ADV;ADV2=ADV1;ADV3=ADV2;ADV = (ADV1+ADV2/2.0+ADV3/4.0)/1.75;ADV /= 10.0;ADV = ADV*20.00*2.048/65536.000+0.009;if(ADV<10)sprintf(buffer,"OutU:%.3fV ",ADV);else sprintf(buffer,"OutU:%.2fV ",ADV);LCD_ShowString(0,200,M,colors[1],colors[4],buffer);ADV = 0;}if(time3>=200){time3=0;for(i3=0;i3<10;i3++)ADI += I_buffer[i3];ADI1=ADI;ADI2=ADI1;ADI3=ADI2;ADI = (ADI1+ADI2/2.0+ADI3/4.0)/1.75;ADI /= 10.0;ADI = ADI*5.025*2.048/65536.000;sprintf(buffer,"OutI:%.3fA ",ADI);LCD_ShowString(0,250,M,colors[5],colors[4],buffer);ADI = 0;}if(time1>=1000){time1=0;Temp = result(3);sprintf(buffer,"Temp:%.1f'C ",Temp);LCD_ShowString(0,50,M,colors[7],colors[4],buffer);if(Temp>=33.0)FS = 1;else if(Temp<=28)FS = 0;Write_EEPROM(0x00,U,I);}}}。