1、直流电子负载设计报告目录摘要31.课题背景42.实验设计要求42.1基本任务42.2基本要求42.3发挥部分53.总体方案论证与设计53.1硬件部分53.1.1DA转换模块53.1.2电压跟随模块63.1.3单片机模块73.2软件部分83.2.1界面设计93.2.2横流模式程序设计93.2.3恒阻模式程序设计94.系统调试94.1模块调试94.1.1硬件部分调试94.1.2软件部分调试104.2整体调试104.3测试结果分析105.实验创新设计105.1界面创新105.2电流范围扩展115.3电阻范围扩展115.4保护电路创新116.附录126.1元器件识别方法和检测方法126.2相关芯片资料
2、136.3软件部分程序源代码146.4参考文献207.心得体会21摘要本文论述了直流电子负载的设计思路和过程。本电子负载采用 “IAP15F2K61S2” 单片机作为系统的控制芯片,可实现以下功能:电子负载有恒流和恒阻两种模式,可手动切换。恒流方式时不论输入电压如何变化(在一定范围内),流过该电子负载的电流恒定,且电流值可设定。工作于恒阻模式时,电子负载端电阻保持恒定,且可设定,流入电子负载的电流随被测直流电源的电压变化而变化。AD模块接受电路电压和电流模拟信号,转化为数字信号,经液晶模块同步显示电压和电流。包括控制电路(“IAP15F2K61S2”单片机)、主电路、采样电路、显示电路、基准电
3、路等;能够检测被测电源的电流值、电压值;各个参数都能直观的在LCD屏上显示。【关键词】:电子负载、单片机、恒流、恒阻。1.课题背景在电路中,负载是指用来吸收电源供应器输出的电能量的装置,它将电源供应器输出的电能量吸收并转化为其他形式的能量储存或消耗掉。如电炉子将电能转化为热能;电灯将电能转化为光能;蓄电池将电能转化为化学能;电机将电能转化为动能。这些都是负载的真实表现形式。负载的种类繁多,但根据其在电路中表现的特性可分为阻性负载、容性负载、感性负载和混合性负载。在实验室,我们通常采用电阻、电容、电感等或它们的串并联组合,作为负载模拟真实的负载情况。进行电源设备的性能实验。电子负载是利用电子元件
4、吸收电能并将其消耗的一 种负载。电子元件一般为功率场效应管(Power MOS)、绝缘栅双极型晶体管(IGBT)等功率半导体器件。由于采用了功率半导体器件替代电阻等作为电能消耗的载体,使得负载的调节和控制易于实现,能达到很高的调节精度和稳定性。同时通过灵活多样的调节和控制方法,不仅可以模拟实际的负载情况,还可以模拟一些特殊的负载波形曲线,测试电源设备的动态和瞬态特性。这是电阻等负载形式所无法实现的。2.实验设计要求2.1基本任务设计并制作一个电子负载,作为测试“直流稳压电源”或“蓄电池”性能指标的辅助装置。电子负载应具有恒流和恒阻两种方式。被检测直流稳压电源或蓄电池的输出电压施加在电子负载的两
5、端,简称为电子负载的输入电压。恒流方式是指输入电压在一定的范围内变化时,流过该电子负载的电流恒定,且该恒流值是可以设定的。恒阻方式是指电子负载相当于电阻,其输入电压与流过电子负载的电流成正比(比值就是电阻),且该电阻值可以设定。实现电子负载的电路部分,可以使用单独的直流电源。2.2设计要求(1)恒流模式:当输入电压在3V-24V之间变化时,恒流电流可设置为:200mA-2.00A,步进100mA。(2)恒阻模式:当输入电压在3V-24V之间变化时,恒定电阻可设置为:6- 60(3)具有良好的人机接口,完成参数设置和电压、电流和电阻等参数的显示。3.总体方案论证与设计电子负载用于测试直流稳压电源
6、、蓄电池等电源的性能。设计和制作一台电子负载,有恒流和和恒阻两种模式,可手动切换。恒流方式时不论输入电压如何变化(在一定范围内),流过该电子负载的电流恒定,且电流值可设定。工作于恒阻模式时,电子负载端电压保持恒定,且可设定,流入电子负载的电流随被测直流电源的电压变化而变化。3.1硬件部分实验电路分为三个模块:DA转换模块、电压跟随模块和单片机控制模块。系统整体框图为:各模块设计方案如下:3.1.1DA转换模块根据电路需要,综合考虑价格,转换速度与精度,使用方便程度等因数,我们选择了DAC0832作为核心的DA转换芯片。DAC0832为8输入并行DA转换芯片,使用简单。我们采取但缓冲工作模式,电
7、路接线图如图1所示:图 1DAC0832的八位输入端口接单片机P4口,运放我们采用了双运放LM358,经测试,该电路DA转换的精度和速度均满足要求。3.1.2电压跟随模块电压跟随模块直接控制取样电阻的电压大小,从而控制其电流,来实现恒流的目的。设计中,该模块充分运用了运放的“虚短”和“虚断”,通过控制运放的正输入端来控制取样电阻上的电压,实验电路如图2所示。由于实际中发现MOS管的功率较大,于是给场效应三极管加装了散热装置。图 2这个图是一个最常用的恒流电路,这样的电路更容易获得稳定及精确的电流值,R3 为取样电阻,VREF是给定信号,电路工作原理是:当给定一个信号时VREF,如果R3上的电压
8、小于VREF,也就是OP07的-IN小于+IN,OP07加输出大,使MOS加大导通使 R3 的电流加大。如果R3上的电压大于VREF时,-IN大于+IN,OP07 减小输出,也就降R3上的电流,这样电路最终维持在恒定的给值上,也就实现了恒流工作。如给定VREF为10mV,R3为0.01欧时电路恒流为1A,改变VREF可改变恒流值,VREF可用电位调节输入或用DAC芯片由”IAP15F2K61S2”单片机控制输入,采用电位器可手动调节输出电流。如采用DAC输入可实现数控恒流电子负载。恒阻功能,在有些数控电子负载中并不设计专用电路,而是在恒流电路的基础上通过”IAP15F2K61S2”单片机检测到
9、的输入电压来计算电流,达到恒阻功能的目的,比如要恒定电阻为 10 欧时,”IAP15F2K61S2”单片机检测到输入电压为20V,那么会控制输出电流为2A,但这种方法响应较慢,只适用于输入变化较慢,且要求不高的场合。专业的恒阻电子负载都是由硬件实现的。恒阻电路如下图所示:在定电阻工作模式时,电子负载所流入的负载电流依据所设定负载电阻和输入电压的大小而定,此时负载电流与输入电压呈正比例,比值即是所设定的负载电阻,即负载电阻保持设定值不变。恒阻功能,在有些数控电子负载中并不设计专用电路,而是在恒流电路的基础上通过”IAP15F2K61S2”单片机 检测到的输入电压来计算电流,达到恒阻功能的目的,比
10、如要恒定电阻为10欧时,”IAP15F2K61S2”单片机 检测到输入电压为20V,那么会控制输出电流为 2A,但这种方法响应较慢,只适用于输入变化较慢,且要求不高的场合。专业的恒阻电子负载都是由硬件实现的。3.1.3单片机模块单片机模块采用”IAP15F2K61S2”作为核心控制模块,通过盘片及开发版上的LCD屏来实现相关内容的显示,通过按键和滑轮实现对电路的输入和控制。单片机的编程部分将在软件部分说明。考虑到单片机不能直接采集大电压,应在采集电路前加保护电路。保护电路如图所示:3.2软件部分软件部分分为三个部分,即界面设计部分、横流模式程序设计和恒阻模式程序设计。如见部分程序流程图如下:各
11、部分详细设计说明如下:3.2.1界面设计界面设计仿照官方例程,采用菜单式设计。这样设计比较方便操作者操作,也方便调用程序的各个模块,顺利实现相关功能。主菜单下根据功能设置“横流模式”和“恒阻模式”两个子菜单,横流模式下又能通过滑轮实现对电流值的设置和输出,恒阻模式先能通过滑轮实现对电阻值的设置和相关电流的输出。该部分的源代码在附录部分给出。3.2.2横流模式程序设计横流模式能够实现对电流的设置与输出。该部分采用滑轮与按键配合的方式来设置电流,操作方便。通过用户输入的电流值,该模块能将其转化为取样电阻的相应电压值,然后转换为相应的2进制数到DA模块,实现对横流的控制。该部分的源代码在附录部分给出
12、。3.2.3恒阻模式程序设计横阻模式能够实现对电阻的设置与相关电流输出。该部分采用滑轮与按键配合的方式来设置电阻,操作方便。通过用户输入的电阻值,并结合采样电路采得的外加电压值,该模块能计算出相应的电流。并最终转化为相应的2进制数到DA模块,实现对横阻的控制。该部分的源代码在附录部分给出。4.系统调试系统调试分为模块调试与整体调试两个阶段:在完成每一部分电路时,都要进行模块调试,来确保各模块都能正常工作。在全部电路焊接完成时,要进行整体调试,来确保电路整体能实现相应的功能。系统调试顺序详细介绍如下:4.1模块调试4.1.1硬件部分调试硬件部分调试分为两部分,一个是电压跟随模块调试,另一个是DA
13、转换部分调试。电压跟随模块调试主要调试取样电阻上的电压值是否随运放的的输入管脚的电压变化而变化及变化的灵敏度。调试时要对该模块进行正常供电,在运放OP07的正输入管脚加上一个可变电压,测试取样电阻上的电压是否能和其保持一致。DA转换模块调试主要是调试该模块能否把给定的数字信号转换为相应的模拟信号,以及转换的时间及精度。调试时要对该模块进行正常供电,在DA0832的八位数字信号输入端加上输入信号,然后在模拟信号输出端测试其输出信号,观察其是否准确。4.1.2软件部分调试 软件部分调试是在Code Composer Studio v5环境下进行的,主要测试程序的语法错误与逻辑错误,可分函数、分文件
14、逐个进行。软件部分调试的另一个作用是确定程序中运用的重要基础数值,该部分的测试可以采用双向逼近法一个一个的确定。4.2整体调试整体调试是测试整个电路能否实现预定功能,测试时根据实验要求逐个测试即可。首先对系统进行供电,单片机装入编号的程序。横流模式下,通过单片机设置电流值,改变外接电源的电压值,观察流过取样电阻的电流是否改变。反复修改电流值,观察电路能否实现恒流功能。恒阻模式下,通过单片机设置电阻值,改变外接电源的电压值,观察流过取样电阻的电流是否改变。反复修改电阻值,观察电路能否实现恒阻功能。4.3测试结果分析恒流:不论输入电压如何变化,流过该电子负载的电流值恒定且可设定。恒阻:不论输入电压
15、如何变化,流过该电子负载的电压与电流的比例恒定。受实验室环境与器材限制,稍有误差。I/A恒阻特性曲线恒流特性曲线0预置负载4预置负载3I/AU/V0U/V0预置负载5电压05.实验创新设计5.1界面创新本程序在界面设计部分有诸多创新之处,程序刚刚加载时,LCD屏会出现“TI杯电子设计”字样,来表示本次竞赛的赞助方。欢迎界面过后,主程序的界面采取菜单模式,恒流模式和恒阻模式各自有自己的子菜单。在设置电流和电阻的方式上,本程序创新的采取滑轮与按键相结合的方法,是操作更加简洁、方便。程序在执行恒流或恒阻输出的方式时,都能够显示当前的电流或电阻值,方便用户测试。程序的每一级菜单均有退出或返回上一级按钮
16、,使用户的操作体验更加优化。5.2电流范围扩展本实验的基本要求的电流输出范围为0.2到2安培,步进0.1安培。但是由于我们采用了更加合理的电路结构和大功率的散热片,使得本实验的电流输出范围为0.2到3安培,步进0.1安培。大大提高了直流电子负载的性能,扩大了测试电压的范围。5.3电阻范围扩展本实验的基本要求的电阻范围为6到60欧姆,步进1欧姆。但是由于我们采用了更加合理的电路结构和大功率的散热片,使得本实验的电阻范围为6到80欧姆,步进1欧姆。大大提高了直流电子负载的性能,扩大了测试电压的范围。5.4保护电路创新为了防止单片机被损坏,我们对输出单片机的信号都加上了保护电路。通过创新设计,保护电
17、路既能使单片机准确的测量相关电路参数,又不至于因为电流或电压过大而导致单片机损坏。保护电路由分压和限压两部分构成,电路如图所示:6.附录6.1元器件识别方法和检测方法芯片的识别方法和检测方法 相对于其他元件,芯片的识别和检测相对简单,芯片表面有明显的型号标示,可以用来识别信号。而芯片的检测实验室也有专门的仪器,可以直接借助专用的仪器来检测芯片的好坏。电阻的识别方法与检测方法电阻的标示一般都是色环标示法。色环标示主要应用圆柱型的电阻器上,如:碳膜电阻、金属膜电阻、金属氧化膜电阻、保险丝电阻、绕线电阻。主要分两部分。第一部分的每一条色环都是等距,自成一组,容易和第二部分的色环区分。四个色环电阻的识
18、别:第一、二环分别代表两位有效数的阻值;第三环代表倍率;第四环代表误差。 五个色环电阻的识别:第一、二、三环分别代表三位有效数的阻值;第四环代表倍率;第五环代表误差。 如果第五条色环为黑色,一般用来表示为绕线电阻器,第五条色环如为白色,一般用来表示为保险丝电阻器。如果电阻体只有中间一条黑色的色环,则代表此电阻为零欧姆电阻。色环颜色和相应的数值对照表如下。银金黑棕红橙黄绿蓝紫灰白无有效数字0123456789数量级10-210-110010 1102103104105106107108109 电阻的检测相对简单,直接用万用表测电阻的阻值并与电阻上的色环标示值比较就可以检验电阻的好坏。电容的识别方
19、法与检测方法电容器的标注规则为:当电容器的容量大于100pF而又小于1mF时,一般不注单位,没有小数点的,其单位是pF时,有小数点的其单位是mF。如4700就是4700pF,0.22就是0.22mF。当电容量大于是10000pF时,可用mF为单位,当电容小于10000pF时用pF为单位。据此根据电容器表面的标注可以识别电容器的大小。电容器的检测方法如下:1.用万用电表的欧姆档(R10k或R1k档,视电容器的容量而定),当两表笔分别接触容器的两根引线时,表针首先朝顺时针方向(向右)摆动,然后又慢慢地向左回归至位置的附近,此过程为电容器的充电过程。2.当表针静止时所指的电阻值就是该电容器的漏电电阻
20、(R)。在测量中如表针距无穷大较远,表明电容器漏电严重,不能使用。有的电容器在测漏电电阻时,表针退回到无穷大位置时,又顺时针摆动,这表明电容器漏电更严重。一般要求漏电电阻R500k,否则不能使用。三极管的识别方法与检测方法对于三极管的识别,三极管表面有明显的型号标示,可以根据标示的型号判断三极管的类型。三极管的检测也可以运用万用表的三极管测量功能来进行检测。6.2相关芯片资料DAC0832管脚图OP07管脚图LM358管脚图IRF540管脚图6.3软件部分程序源代码20#include #include HAL_PMM.h#include HAL_UCS.h#include HAL_Board
21、.h#include HAL_Buttons.h#include HAL_Cma3000.h#include HAL_Dogs102x6.h#include HAL_Menu.h#include HAL_Wheel.h#include LaunchpadDef.h#include Clock.h#include LPM.h#include MassStorage.h#include Mouse.h#include PMM.h#include Settings.h#include PowerTest.h#include DemoApps.h#include SdCard.h#include Me
22、nuGames.huint16_t timeoutCounter;uint16_t convert;static const uint8_t tiBug = 0x42, / Image width in pixels 0x08, / Image height in rows (1 row = 8 pixels) 0X00,0X00,0X00,0X00,0X00,0X00, ;static const char *const mainMenu = 1. hengliu, 2. hengzu ;#define WHEEL_PORT_DIR P8DIR#define WHEEL_PORT_OUT P
23、8OUT#define WHEEL_ENABLE BIT0#define ADC_PORT_SEL P6SEL#define ADC_INPUT_A5 BIT5void hengliu(void);void hengzu(void);void hengzuout(void);void hengliuout(void);void INIT_OUT_PUT(void);void DATA_OUT_PUT(uint8_t input_data);extern void Wheel_init(void);extern uint8_t Wheel_getPosition(void);extern uin
24、t16_t Wheel_getValue(void);extern uint16_t PO_getValue(void);extern void Wheel_disable(void);extern void Wheel_enable(void);int number;int number1;char string10;uint8_t data;uint16_t positionData;uint16_t positionDataOld;uint16_t po,poOld;#define SPI_SEL P4SEL#define SPI_DIR P4DIRvoid INIT_OUT_PUT(v
25、oid)P4SEL = 0;P4DIR = 0XFF;void DATA_OUT_PUT(uint8_t input_data)P4OUT = input_data;void hengzu(void)Dogs102x6_init(); while (1) buttonsPressed=0; Dogs102x6_clearScreen(); if (buttonsPressed & BUTTON_S2) break; else number=Wheel_getValue(); number1=number/54+6; if(number180) number1=80; itoa(number1,
26、string,10); Dogs102x6_stringDraw(3, 30, string, DOGS102x6_DRAW_NORMAL); Dogs102x6_stringDraw(2, 0,Are you sure?, DOGS102x6_DRAW_NORMAL); if(buttonsPressed & BUTTON_S1) hengzuout(); INIT_OUT_PUT();DATA_OUT_PUT(0X00); Dogs102x6_init(); void hengzuout(void)uint16_t getval;uint16_t in; Dogs102x6_init();
27、while(1)Dogs102x6_clearScreen(); if (buttonsPressed & BUTTON_S2) break; else Dogs102x6_stringDraw(3, 30, string, DOGS102x6_DRAW_NORMAL); Dogs102x6_stringDraw(2, 0,OUT, DOGS102x6_DRAW_NORMAL); getval= PO_getValue(); getval=3 * getval ; in=6 * getval / ( 41 * number1 ); if(number1 = 15) in=in+5; else
28、if(15 number1 =20) in=in+4; if(20 number1 30) in=in+2; else if(30 = number1 40 ) in=in; if(40 = number1 50 ) in=in-3; else if(50 = number1 55) in=in-4; if(55 = number1 60 ) in=in-2; else if(60 = number1 70) in=in-2; INIT_OUT_PUT(); DATA_OUT_PUT(in); void hengliu(void)Dogs102x6_init(); while (1) butt
29、onsPressed=0; Dogs102x6_clearScreen(); if (buttonsPressed & BUTTON_S2) break; else number=Wheel_getValue(); number1=number/140*100+200; if(number13000) number1=3000; itoa(number1,string,10); Dogs102x6_stringDraw(3, 30, string, DOGS102x6_DRAW_NORMAL); Dogs102x6_stringDraw(2, 0,Are you sure?, DOGS102x
30、6_DRAW_NORMAL); if(buttonsPressed & BUTTON_S1) hengliuout(); INIT_OUT_PUT(); DATA_OUT_PUT(0X00); Dogs102x6_init(); void hengliuout(void)Dogs102x6_init();while(1)Dogs102x6_clearScreen(); if (buttonsPressed & BUTTON_S2) break; else Dogs102x6_stringDraw(3, 30, string, DOGS102x6_DRAW_NORMAL); Dogs102x6_
31、stringDraw(2, 0,OUT, DOGS102x6_DRAW_NORMAL); INIT_OUT_PUT(); switch(number1) case 200: data=0X0A;break; case 300: data=0X10;break; case 400: data=0X16;break; case 500: data=0X1C;break; case 600: data=0X20;break; case 700: data=0X26;break; case 800: data=0X2C;break; case 900: data=0X32;break; case 10
32、00: data=0X37;break; case 1100: data=0X3C;break; case 1200: data=0X42;break; case 1300: data=0X47;break; case 1400: data=0X4C;break; case 1500: data=0X52;break; case 1600: data=0X58;break; case 1700: data=0X5C;break; case 1800: data=0X62;break; case 1900: data=0X68;break; case 2000: data=0X6C;break;
33、 case 2100: data=0X73;break; case 2200: data=0X79;break; case 2300: data=0X7D;break; case 2400: data=0X83;break; case 2500: data=0X88;break; case 2600: data=0X8D;break; case 2700: data=0X92;break; case 2800: data=0X98;break; case 2900: data=0X9D;break; case 3000: data=0XA1;break; default : break; DA
34、TA_OUT_PUT(data); void main(void) uint8_t contrast = *(unsigned char *)contrastSetpointAddress); uint8_t brightness = *(unsigned char *)brightnessSetpointAddress); Cma3000_setAccel_offset(*(unsigned char *)accelXcalibrationAddress), *(unsigned char *)accelYcalibrationAddress), *(unsigned char *)acce
35、lZcalibrationAddress); WDTCTL = WDTPW + WDTHOLD; Board_init(); SetVCore(3); LFXT_Start(XT1DRIVE_0); Init_FLL_Settle(25000, 762); SFRIFG1 = 0; SFRIE1 |= OFIE; _enable_interrupt(); SetupRTC(); Dogs102x6_init(); Dogs102x6_backlightInit(); if (contrast = 0xFF) contrast = 11; if (brightness = 0xFF) brigh
36、tness = 11; Dogs102x6_setBacklight(brightness); Dogs102x6_setContrast(contrast); Dogs102x6_clearScreen(); Wheel_init(); Buttons_init(BUTTON_ALL); Buttons_interruptEnable(BUTTON_ALL); buttonsPressed = 0; Dogs102x6_imageDraw(tiBug, 0, 16); while (!buttonsPressed) for (timeoutCounter = 0; timeoutCounte
37、r 0x0806) position = 7 - (positionData - 0x0806) / 260; /scale the data for 8 different positions else position = positionData / 260; return position;uint16_t Wheel_getValue(void) ADC12IE = 0x03; ADC12CTL0 |= ADC12SC; _bis_SR_register(LPM0_bits + GIE); ADC12IE = 0x00; if (positionData positionDataOld) if (positionData - positionDataOld) 10) positionDataOld = positionData; /