数控直流电流源完整版(电路+程序)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目名称:数控直流电流源
摘要:该数控直流电流源以精密压控电流源为核心、用单片机、DAC组成控制电路,引入“S类”反馈控制功率放大电路,实现超精密电流控制、具备精准的扩流能力、低失调、有步进、同时带有丰富扩展功能的精密电流源。
经过ADC采样,完成输出电流显示功能,并使输出范围覆盖0~2A,是理想的电流源解决方案。
关键词:精密电流源低失调S类功率放大器
Abstract:The direct current source of numerical control bases on accurate VCCS, using MCU and DAC as controller kernel, importing circuit of power amplification of type S with feedback control; achieves ultra accurate current control; has low offset and excellent capacity for current enlarging; has step by step motion. At the same time, it provides abundance extended functions. According to the ADC sampling, it carries out the function of displaying the current output, meanwhile it achieves a range of 0 to 2A. Above all, it is an ideal solution of current source.
Keyword: accurate current source , low offset , power amplification of type S
目录
1方案论证与比较 (3)
1.1精密压控电流源方案论证 (3)
1.2扩流模块方案论证 (3)
1.3电流检测方案论证 (4)
1.4功率输出级电源方案论证 (4)
1.5其它模块电源方案论证 (4)
2 系统设计 (5)
2.2单元电路设计 (6)
2.2.1 压控电流源单元电路设计 (6)
2.2.2S类功率放大器电路设计(理论推导和证明) (7)
2.2.3 数控电路设计 (10)
2.2.4 大功率电源模块 (11)
3 软件设计 (11)
4系统测试 (13)
4.1测试仪器 (13)
4.2测试方法 (13)
4.3测试数据 (14)
5 结论 (15)
参考文献: (15)
附录: (16)
附1:元器件明细表 (16)
附2:仪器设备清单 (16)
附3:电路图图纸 (16)
附4:程序清单 (19)
附5:使用说明 (24)
1方案论证与比较
本系统主要由精密的电流源模块、S类扩流模块、电流检测模块、数控模块、以及大功率的电源模块组成,如图1所示。
图1 系统模块图
针对各模块的功能要求,分别有以下一些不同的设计方案:
1.1 精密压控电流源方案论证
精密压控电流源是本数控电流源的关键之所在,针对设计要求和使用需求、结合设计思路,精密电流源模块必须具备以下指标:纹波小于2mA,误差小于0.1%,具有低的输出失调。
基于稳定性要求和以上考虑,电流源电路选择了经典的压控电流源电路,它负责与后级扩流模块连接,用电压控制后者,而使用电流反馈,这样可以保证有足够高的精度。
该部分采用了高性能、低温漂、低失调的运算放大器OP77和精密元件组成,保证性能指标的良好发挥。
1.2 扩流模块方案论证
方案一:传统的扩流方法,采用具有大功率输出能力的功率放大器,通过引入深度负反馈环路,使电路接成电压跟随的电流放大器,而起到扩流作用。
这种方案在电流源领域使用以久,是比较经典的接法。
但是该接法存在某些缺陷,首先它是作为电流放大电路,不可
避免的从前级取出电流,这种误差在小电流时影响甚微,但是电流一大,扩流电路对前级的影响就不可忽略,这是造成前级压控电流源误差的重要原因;另外,扩流电路仅仅是一个0dB电压增益的放大电路,深度负反馈是减少误差的方法之一,但不是最好的方案,这种电流放大器在高精度要求的场合还是具有较大误差的。
方案二:崭新的S类电流放大器。
为克服传统扩流电路在高精度、高稳定性要求下的缺陷,追求一种精度高、稳定性好、对前级影响小的扩流电路,受到S类功率放大器的启发,本设计率先把S类放大器优秀的电压跟随原理引入电流源电路之中。
该电路具有以下优点:一、理想的输入性能,即整个工作范围内都有极高的等效输入阻抗,优秀的性能使得前级电路工作于极度轻载的状态。
实践和测试都证明,该电路能有效地使前级电流源工作在近乎空载的工作状态,保证电路的性能不发生劣化。
二、超高的放大精度,即电流跟随模块的输出值和目标值之间的误差实测只有<-90dB,这样,输出电流就只取决于前级的精度,由电流放大器所引入的误差降低到可以忽略的程度。
事实说明,该电路是很有发展前景的。
综合考虑各种因素和基于以上分析,本设计最终选取了方案二
1.3 电流检测方案论证
在负载电阻与地之间接一个高精度、低温漂的1欧康铜电阻作为取样电阻,用AD转换器MAX1241测量电阻上的压降,MAX1241为12位串行A/D,精度优于1LSB,基准电压用2.048V,因此测量分辩率为0.5mA,精度可达1mA以下,可以满足题目对测量精度的要求。
1.4 功率输出级电源方案论证
方案一:使用开关电源。
开关电源的优点是效率高、体积小,适用于大功率的场合。
但是开关电源本身工作于高速开关状态,对周边的电路会产生严重的高频干扰,电源也会有较高的高频纹波,经分析认为其不适合用对精度要求高、稳定性好的场合。
方案二:使用环形变压器+∏形滤波电路。
优点是结构简单,用上大电容后,滤波效果明显,电源纹波小,不会产生高频干扰。
缺点是体积大、重量大。
综合以上两种方案,我们认为方案二可以提供更高质量电源,有利于制作出高精度、高纯度的电流源。
而体积、重量对于这种台式的设备居次要地位。
选用方案二。
1.5 其它模块电源方案论证
本电流源为数模结合系统,复杂的工作条件对电源供电的稳定性要求很高,电源具体的设计方案有二:
方案一:直接使用环形变压器为数模电路同时提供电源,但各自使用独立的稳压滤波电路供电。
这种方案电源设计比较简单,用独立的稳压电路能在一定程度上对各个电路提供相对稳定的电源,这种设计在负载较轻、输出波动不太大的电路里是非常实用的。
然而,本设计的电流工作范围较宽,在大电流负载的情况下,电源纹波串扰的影响显得相当严重。
此时,数模共用同一电源将制约系统精度的进一步提高。
方案二:为数字电路和模拟电路各自提供一个独立的变电、整流和滤波电路,实现数模电路的供电隔离。
因为电流源和功放电路的核心芯片对电源的要求跟数字电路对电源的要求不同,本设计只需针对电路对电源的特殊使用情况,适当使用滤波电路,便可保证输出量的
可靠、准确和恰到好处。
同理,专门为数字电路供电的电源也可为专门应用而量身订做,由于电源共用而引入的串扰降低到可以忽略的程度。
经过对比试验,发现方案二能保证DAC等芯片供电的纯净。
这种电源的改善,折合到输出端,而引起的电流源输出精度提高达一个数量级之多。
实测发现,受惠于这种电源设计思想,本设计的输出电流纹波已能降低到2000mA输出时优于0.18mA的优秀水准。
基于以上原因,本设计最终选择了方案二作为电路的供电方案。
2 系统设计
该系统由一个压控电流源及其扩流电路、数控电路和电源电路组成。
其基本原理如下:
1)由数控电路用D/A产生一个可控电压;
2)该可控电压输入到压控电流源上,再经S类功放的扩流作用,从而使电流源电路产生一个可控电流。
3) 数控电路每隔一段时间就检测一次取样电阻上的电压,并把电压值换算在电流值。
系统框架图如图2所示:
图2 系统框架图
2.2 单元电路设计
2.2.1 压控电流源单元电路设计
图3 压控电流源单元电路图
压控电流源的负反馈放大以一个精密运放OP77构成一个同相放大器,引入深度的电流负反馈,从而稳定输出到负载的电流。
运放正常工作于同相放大状态时,由运放虚短的原理可知:取样电阻上的电压:
U20 = U in
所以:
I20=U20/R20=U20/R20 (1)
又因OP77运放的输入电阻高达200M欧,运放的反相端输入电流可认为零。
所以有
I L=U in / R20 (2)
只要取样电阻R20使用高精度,低温漂电阻。
则负载电阻上的电流I L正比于Uin,可以用Uin精确的控制输出电流了。
实际上,因为OP77不是理想运放,同反相输入脚上有一定的电压差:
Ud=V os+V out /CMRR (3)
(其中V os为输入失调电压,CMRR为共模抑制比)
因为Vos<10uV , CMRR>140dB, 当V out=10V时,Ud < 11uV 该运放电路是一个极好
的电压跟随器。
因此,只要选用的扩流电路性能比较好,输出电流的精度完全取决于取样电阻的精度。
2.2.2S类功率放大器电路设计(理论推导和证明)
S类功放电路原理图如图4所示,其特点是用电压控制放大器与电流驱动放大器构成电桥,使电压控制放大器工作在无负载的状态(即输出电流为零) ,电压控制放大器工作于一个比较理想的状态。
,而后级则工作于一个压跟随器的状态,很容易做到很好的跟随作用。
而对于负载来说,前后级是并联输出的。
而负反馈是从负载上引出,引入到前级放大器上,因此,S类功放的质量取决于前级。
以下是S类功放电路性能分析和数据推导:
图4 S类功率放大器基本电路
(1)理想的输入性能:
S类功放电路的核心是一片带负载能力非常高的电流驱动放大器,它与负载R L之间通过电桥耦合。
假设放大器A2的开环增益(open loop gain)接近无穷大,那么A、B点之间的电位将会相同(极度接近),用公式表示为:
I2*R1=I3*R3 (4)
I0*R2=I4*R4 (5)
若A2的输入性能近似于理想运放的性能,即虚断(输入阻抗无穷大),则
I3=I4,
可得:
I2=(R2*R3)*I0/(R1*R4) (6)
又因为电桥平衡时有:
R2*R3 =R1*R4 (7)
所以
I2=I0
故此:
I1=0
根据以上推导,说明当S类功放电路正常工作以后,前级电路工作在空载状态,负载所需电流完全由后级的电流驱动放大器提供。
这样,电路对前级压控电流源的负载要求就不至于很高,大大简化了设计的难度,这也是本电路的特色之所在。
(2)超高的放大精度:
S类功率放大器的另一个特出优点就是电压跟踪的高度准确性,现根据该原理框图阐述如下:1、设某时刻前级放大器A1输出一电压信号,使A点电压升高,若此时B点电压没有升高,A、B两点之间的误差信号将作为差动信号输入到放大器A2的两输入端,如果A2的同反相输入端选择合适,A2输出电压将会升高。
因为A端被前级控制电压不变,A2的输出将迫使B点电压尽量接近于A点电压,同时使负载R L的端电压跟随着A点上升,完成了输出电压的跟随功能。
综上所述,只要选择高输入性能和强负载能力的后级功放芯片,输出的变化就完全由前级决定。
而前级工作在空载状态,其性能完全与负载的变化无关。
这样一来,设计前级时,可以撇开负载能力的考虑而直接使用高精度、低失调的运算放大器;而设计后级时,因为输出取决于前级,可以不必担心负载的加入会影响它的工作性能,其选择范围变得更宽。
S类功放电路的实际电路和参数选取如下图:基于S类功放电路的设计原则和以上设计思路,为保证该电路的可靠性和足够高的性能,该电路的核心芯片A2选用了美国国家半导体公司(NS)出品的高品质功放芯片LM3886,虽然该芯片原先的设计用途是作为音频放大器之用,但其各种电气性能非常完美,完全符合本设计的需求,并有足够的输出功率,故予以采用。
R12和R15电阻较小,作为输出电流的主要电路,所以选取了低温漂的康铜丝制作。
图5 S类功放电路原理图
LM3886具有相当优秀的性能,以下参数引用自NS的Datasheet,结合S类功率放大器的特点,用于说明扩流电路选择LM3886的原因:
1、电源抑制比高,故实际电路尽管没有使用稳压电源,而只用了一级π形滤波,但已是输出纹波优于0.2uV。
2、共模抑制比高、开环增益相当高,有近似于理想放大器的特性,输入性能良好:
3、输入噪音很低,可以忽略功放本身所引入的底噪:
4、高输入阻抗,低输入电流,有近似虚断的良好特性:
2.2.3 数控电路设计
数控电路单片机最小系统、D/A转换电路,A/D转换电路、4位LED、按键和指示灯组成。
为了减小数电电路的高频峰值电流对模电电路的干扰,这个模块内的数电电路和模电电路之间各自采用独立的稳压电路供电。
实践证明,这个供电方法可以很大程度降低D/A输出的纹波电压。
1.单片机最小系统采用一片A T89S52构成,其负责对A/D、D/A的控制,以及4位LED的显示,按键响应等工作。
图6 单片机基本电路
2.D/A电路以采用MAX531,使用其内部自带的2.048V基准源。
其电路原理图如图7所示。
D/A转换的分辨率为:
V D=V ref / (212) = 2048 / 4096=0.5mV (8)
加在1欧的取样电阻上是,就可以输出分辨率为0.5mA的电流。
A/D电路采用MAX1241,与MAX531使用同一个基准源。
因此,A/D的分辨率为
0.5mV,当取样电阻为1欧时,测量电流的分辨率为0.5mA。
因为MAX1241的转换精
度很高(达到1LSB),因此,该A/D电路完全可以满足题目的扩展要求2。
图7 ADC、DAC模块原理图
2.2.4 大功率电源模块
对于一个大功率、高精度、低纹波要求的电路来说,高质量的电源对其性能指标影响是非常明显的。
因此,我们必须使用一个低纹波电压、功率裕量大的电源。
为此,我们用一个
环形变压器整流输出+π形RC滤波之后给功率输出级供电。
其它电路模块则用线性稳压器件(LM317、LM337)稳压后供电。
3 软件设计
直流电流源的数字控制器采用ATMEL公司的AT89S52,因为在程序综不需要涉及精确实时操作,所以使用C语言进行软件编写,这样可以大大提高程序编写时的效率。
程序设计上使用一个定时器作为系统实时时钟,周期性的进行LED显示、按键扫描、AD转换、和显示内容的切换。
而主循环负责对按键进行处理。
主程序流程图如图8-1,定时中断程序如图8-2,按键检测程序如图8-3.
图8-1 主程序流程图
图8-2定时中断子程序
图8-3 按键检测子程序
4系统测试
4.1测试仪器
滑动电阻器(100欧、2A)、四位半万用表(VC9806+)、交流毫伏表(EM2171)4.2测试方法
系统测试以滑线电阻器(2A、100欧)为负载,测试分两个步骤:
步骤一:分别令输出电流为600mA、1400mA、2000mA,保持设定电流不变,改变负载电阻,使输出电压在10V以内变化时,用四位半万用表(VC9806+)测量输出电流,记录不同负载时的输出电流;
步骤二:将滑动变阻器滑到一合适阻值,从0mA到2000mA改变设定电流,用两个万用表(VC9806+)分别测量流经负载的电流值和负载上两端的电压值,用毫伏表(EM2171)测量纹波电压,记录每个设定值对应的数据。
4.3测试数据
(1)步骤一数据处理
步骤一测得数据如下:
由测量数据可得:
改变负载电阻,输出电压在10V以内变化时,输出0-2000mA电流时,电流表示数稳定不变,输出电流变化的绝对值小于输出电流值的0.1%+1mA。
(2)步骤二数据处理
步骤二测得数据如下:
由测量数据可得:
1)板内电流测量装置测量误差绝对值最大为:0.25%(即0.1%+2个字),测量误差绝对值<0.1%+3个字;
2)纹波电流为0.16mA,<0.2mA.
5 结论
本系统较好地完成了基本和发挥部分的要求。
电流源输出电流范围1~2047mA,步进1mA;自制的电流测量装置,测量误差的绝对值小于测量值的0.1%+2个字;改变负载使输出电压在10V以内变化时,输出电流稳定不变,纹波电流低于0.2mA。
参考文献:
1.陈伟华主编 . 电磁兼容使用手册. 北京:机械工业出版社,2000
2. 何立民. 单片机应用技术选编9 . 北京:北京航空大学出版社,2004
附录:
附1:元器件明细表
1、AT89S52 ×1
2、MAX1241 ×1
3、MAX531 ×1
4、四位LED数码管×1
5、LM3886 ×1
6、OP77 ×1
7、NE5532 ×2
8、LM337 ×1
9、LM317 ×1
10、7805 ×2
11、10000uF电容×4
12、环形变压器(120W、双28V,双15V)×1
13、康铜电阻丝
14、大功率合金电阻、水泥电阻
15、其它(普通电阻、电容、发光管等)
附2:仪器设备清单
1、万用表VC9806+ ×2
2、交流毫伏表EM2171
3、滑动变阻器(100欧2A)用作负载电阻
附3:电路图图纸
注:
附图一为控制板原理图图纸;
附图二为压控电流源板原理图图纸;
附图一:控制板原理图
附图二:压控电流源板板原理图
附4:程序清单
本系统所用程序清单如下:
//*****************************************************************************
//压控电流源
//Write by hjj 2005-9-9 16:00
//*****************************************************************************/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define Key_add 0x01;
#define Key_subb 0x02;
#define Key_switch 0x03;
#define time1 1200
//******************************管脚定义*************************************** sbit ADSCLK=P1^4;// 驱动时钟位
sbit ADCS=P1^5;//片选信号位
sbit ADDOUT=P1^6;//串行数据位
sbit DADIN=P1^0;//数据输入线
sbit DACLR=P1^1; //清零位
sbit DASCLK=P1^2; //时钟线
sbit DACS=P1^3; //片选位
sbit LED1=P2^7; //4位LED位选
sbit LED2=P2^6;
sbit LED3=P2^5;
sbit LED4=P2^4;
sbit K1=P2^0; //按键1,2,3
sbit K2=P2^1;
sbit K3=P2^2;
sbit L_mod_set=P3^4; //显示模式1,2指示灯
sbit L_mod_test=P3^5;
sbit L_step1=P3^3; //步进量指示灯
sbit L_step10=P3^6;
sbit L_step100=P3^7;
//***************************************************************************** unsigned char code dis[12]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0x7f};
//预置LED段码
unsigned char code dis2[12]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,0x7f}; //预置LED段码,带小数点
uchar KEY;
uint DAout,DA_step,ADin;
uint sys_time,dis_time;
uint ADC(); //AD转换子程序
void DAC(uint datas); //DA转换子程序
void key_scan(); //按键子程序
void t2_int() interrupt 5 using 1 //定时器2中断服务程序
{
static uint dis_buf;
static uchar c;
TF2=0;
sys_time++;
c++;c=c%4; //4位LED显示
switch (c)
{
case 0:
LED4=1;
P0=dis[dis_buf/1000];LED1=0;
break;
case 1:
LED1=1;
P0=dis[(dis_buf%1000)/100];LED2=0;
break;
case 2:
LED2=1;
P0=dis[(dis_buf%100)/10];LED3=0;
break;
case 3:
LED3=1;
P0=dis[dis_buf%10];LED4=0;
break;
}
if (sys_time%8==0)key_scan(); //整20ms则进行按键扫描
dis_time++;
if (dis_time%2400>=time1) //每隔3秒切换显示内容
{dis_buf=DAout>>1;L_mod_test=1;L_mod_set=0;}
else
{
dis_buf=ADin>>1;L_mod_test=0;L_mod_set=1;
if (sys_time%200==0)
ADin=ADC(); //每0.5秒进行一次AD转换
}
}
void init()
{
TH2=0xF6;
TL2=0x3c;
RCAP2H=0xf6;
RCAP2L=0x3c;
SCON=0x50;
TMOD=0x21;
TH1=254;
TL1=254;
TR2=1;TR1=1;
IE=0xa0;
DA_step=20;L_step10=0;
L_mod_set=0;dis_time=time1;
}
void main()
{
init();
DAC(0);
while (1)
{
switch (KEY) //按键服务
{
case 1: //按下了“+”键则DA输出增加
dis_time=time1;
KEY=0;DAout=DAout+DA_step;
if(DAout>4095)DAout=4095;
DAC(DAout);
break;
case 2: //按下了“-”键则DA输出减小
dis_time=time1;
KEY=0;DAout=DAout-DA_step;
if(DAout>4095)DAout=0;
DAC(DAout);
break;
case 3: //按下了“步进量切换”键则改变每次按下“+”、“-”键时的步进电流
KEY=0;
if (DA_step==2){DA_step=20;L_step1=1;L_step10=0;L_step100=1;}
else if (DA_step==20){DA_step=200;L_step1=1;L_step10=1;L_step100=0;}
else if (DA_step==200){DA_step=2;L_step1=0;L_step10=1;L_step100=1;}
else {DA_step=20;L_step1=1;L_step10=0;L_step100=1;}
break;
}
}
}
void key_scan()
{
static uint t;
static bit k11,k12,k21,k22,k31,k32; //检测是否有按键动作(即引脚发生负跳变)static bit kd1,kd2,kd3;
k11=!K1;k21=!K2;k31=!K3;
k12^=k11;k12&=k11;
k22^=k21;k22&=k21;
k32^=k31;k32&=k31;
if (k12){KEY=1;kd1=1;kd2=0;kd3=0;t=0;} //有则返回相应键值
else if(k22){KEY=2;kd1=0;kd2=1;kd3=0;t=0;}
else if(k32){KEY=3;kd1=0;kd2=0;kd3=1;t=0;}
if(kd1) //检测是否有键长按不放,有则{kd1=k11;t++;if((t%15==0)&&t>50)KEY=1;} //每0.3秒返回一次相应键值if(kd2)
{kd2=k21;t++;if((t%15==0)&&t>50)KEY=2;}
k12=k11;k22=k21;k32=k31;
}
void DAC(uint datas)
{
unsigned char i,dh,dl;
if (datas>4095)datas=4096; //当输出量大于DA的最大输出电压时,DA输出dl=datas%256; //最大电压
dh=datas/256;
dh=dh<<4;
DASCLK=0;
DACS=0;
for (i=0;i<4;i++)
{
if ((dh&0x80)==0)
DADIN=0;
else
DADIN=1;
dh=dh<<1;
DASCLK=1;DASCLK=0;
}
for (i=0;i<8;i++)
{
if ((dl&0x80)==0)
DADIN=0;
else
DADIN=1;
dl=dl<<1;
DASCLK=1;DASCLK=0;
}
DACS=1;
}
uint ADC() using 1 //因为该子程序是被中断程序调用的,所以必须与中断服务程序
//用同一个寄存器区
{
unsigned char i;
uint ADdata=0;
ADSCLK=0;
ADCS=0;
while(ADDOUT!=1);
for(i=0;i<11;i++) //读入12位数据
{
ADSCLK=1;
ADSCLK=0;
ADdata=ADdata|ADDOUT;
ADdata=ADdata<<1;
}
ADSCLK=1;
ADSCLK=0;
ADdata=ADdata|ADDOUT;
ADSCLK=1;
ADSCLK=0;
ADCS=1;
return(ADdata);
}
附5:使用说明
1.操作面板说明:操作面板包括4位LED、2个显示内容指示灯、3个调节步进量指示灯、一个电源指示灯,三个操作按键组成。
2.操作说明:a)“+”键用于增加输出电流,长按不放连续增加;
b)“-”键用于减小输出电流,长按不放连续减小;
c)“步进量切换”键用于改变每次按下“+”、“-”键时的步进电流。
改变步进量时,相应指示灯就会点亮。
3.4位LED显示说明:
a)4位LED分时显示电流设定值和测量值,为读数方便,使用两个LED指示灯指示当前的显示状态。
b)当进行电流调整时,LED自动暂停显示状态的切换,只显示电流设定值,当操作停止后3秒钟后自动转入分时显示状态。
使操作更人性化。