数控直流电流源完整版(电路+程序)
数控直流电流源程序

/*跳线说明:1)将EXP-LM3S811板卡上JP9、JP13跳至左侧(短接1-2);2)将EXP-min_system_board板卡上JP13、JP14、JP15、JP16跳至右侧(短接2-3。
操作过程:1)将EXP-min_system_board板卡上K1拨动开关拨至ON状态,给液晶上电;2)调节RP1电位器,使液晶有合适的背光;3)上电,编译并下载程序,复位后全速运行程序;观察液晶显示的内容,再修改程序使之显示自己的内容。
*/#include "systemInit.h"#include "ADS7886.h"#include "TLV5616.h"#include "timer.h"#define CTL_PERIPH SYSCTL_PERIPH_GPIOC // 控制液晶所用的片内端口外设定义#define CTL_PORT GPIO_PORTC_BASE#define SCK GPIO_PIN_4 // 定义信号SCK#define SID GPIO_PIN_5 // 定义信号SID#define CS GPIO_PIN_6 // 定义信号CS #define PSB GPIO_PIN_7 // 定义信号PSB#define SCK_L GPIOPinWrite(CTL_PORT,SCK,0x00) // 定义信号输出低电平#define SID_L GPIOPinWrite(CTL_PORT,SID,0x00)#define CS_L GPIOPinWrite(CTL_PORT,CS,0x00)#define PSB_L GPIOPinWrite(CTL_PORT,PSB,0x00)#define SCK_H GPIOPinWrite(CTL_PORT,SCK,0xFF) // 定义信号输出高电平#define SID_H GPIOPinWrite(CTL_PORT,SID,0xFF)#define CS_H GPIOPinWrite(CTL_PORT,CS,0xFF)#define PSB_H GPIOPinWrite(CTL_PORT,PSB,0xFF)#define SID_READ GPIOPinRead(CTL_PORT,SID) // 定义读回的数据#define SID_IN GPIOPinTypeGPIOInput(CTL_PORT,SID) // 定义SID信号为输入#define SID_OUT GPIOPinTypeGPIOOutput(CTL_PORT,SID) // 定义SID信号为输出#define LED_PERIPH SYSCTL_PERIPH_GPIOB#define LED_PORT GPIO_PORTB_BASE#define LED GPIO_PIN_5#define KEY_PERIPH SYSCTL_PERIPH_GPIOD // KEYS所接的端口#define KEY_PORT GPIO_PORTD_BASE#define KEYGPIO_PIN_7|GPIO_PIN_6|GPIO_PIN_5|GPIO_PIN_4|GPIO_PIN_3|GPIO_PIN_2|GPIO_PIN_ 1|GPIO_PIN_0#define KEY_H GPIO_PIN_7|GPIO_PIN_6|GPIO_PIN_5|GPIO_PIN_4#define KEY_L GPIO_PIN_3|GPIO_PIN_2|GPIO_PIN_1|GPIO_PIN_0#define key_h_in GPIOPinTypeGPIOInput(KEY_PORT,KEY_H)#define key_l_in GPIOPinTypeGPIOInput(KEY_PORT,KEY_L)#define key_h_out GPIOPinTypeGPIOOutput(KEY_PORT,KEY_H)#define key_l_out GPIOPinTypeGPIOOutput(KEY_PORT,KEY_L)#define SysCtlPeriClkGating SysCtlPeripheralClockGating //定义睡眠函数#define SysCtlPeriSlpEnable SysCtlPeripheralSleepEnable#define BitRate 115200 // 设定SPI的波特率#define DataWidth 8 // 设定SPI的数据宽度unsigned char AC_TABLE[]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, // 第一行汉字位置0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, // 第二行汉字位置} ;//开始菜单欢迎界面unsigned char Hello1[]="欢迎使用——数控" ;unsigned char Hello2[]="直流电流源" ;unsigned char Hello3[]="制作人: " ;unsigned char Hello4[]="chenfangjie";//一级菜单1unsigned char menu1_1[]="请输入(20~2000):"; // 选择提示unsigned char menu1_2[]="设值: mA ";//一级菜单1unsigned char menu2_1[]="设定值: mA"; // 选择提示unsigned char menu2_2[]="读取值: A";unsigned char key_val=0; //键值全局变量int A;void keyBoardInit(void){SysCtlPeripheralEnable(KEY_PERIPH); //D口使能开GPIOPinTypeGPIOOutput(KEY_PORT,KEY_H); //扫描信号输出GPIOPinTypeGPIOInput(KEY_PORT,KEY_L); //按键信号输入}//键盘扫描程序void keyBoard_scan(void){//如下依次输出行扫描线//如果有键按下则扫描列线,并获得键值//按键释放判断unsigned char key_h,key_l;key_val=0;key_l_out;key_h_out;GPIOPinWrite(KEY_PORT,KEY,0xf0);key_h_in;key_h=GPIOPinRead(KEY_PORT,KEY_H);if((GPIOPinRead(KEY_PORT,KEY_H)&0xf0)!=0xf0){SysCtlDelay(5*(TheSysClock/3000));if((GPIOPinRead(KEY_PORT,KEY_H)&0xf0)!=0xf0){key_h=GPIOPinRead(KEY_PORT,KEY_H)&0xf0;key_h_out;key_l_out;GPIOPinWrite(KEY_PORT,KEY,0x0f);key_l_in;key_l=GPIOPinRead(KEY_PORT,KEY_L)&0x0f;key_val=key_h+key_l;while(key_l!=0x0f){key_l=GPIOPinRead(KEY_PORT,KEY_L)&0x0f;}switch(key_val){case 0xe7: key_val=13;break;case 0xeb: key_val=9;break;case 0xed: key_val=5;break;case 0xee: key_val=1;break;case 0xd7: key_val=14;break;case 0xdb: key_val=10;break;case 0xdd: key_val=6;break;case 0xde: key_val=2;break;case 0xb7: key_val=15;break;case 0xbb: key_val=11;break;case 0xbd: key_val=7;break;case 0xbe: key_val=3;break;case 0x77: key_val=16;break;case 0x7b: key_val=12;break;case 0x7d: key_val=8;break;case 0x7e: key_val=4;break;}}}}// LCM端口初始化void init(void){SysCtlPeripheralEnable( CTL_PERIPH ); // 使能所用的端口GPIODirModeSet(CTL_PORT, (SCK | PSB | CS ) ,GPIO_DIR_MODE_OUT);// 设置信号的方向GPIOPadConfigSet(CTL_PORT, (SCK | PSB | CS ), GPIO_STRENGTH_8MA,GPIO_PIN_TYPE_STD_WPU); // 设置IO的驱动能力SysCtlPeripheralEnable(LED_PERIPH);GPIOPinTypeGPIOOutput(LED_PORT, LED);GPIOPadConfigSet(LED_PORT, LED, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD_WPU);}// 串行方式发送一个字节void SendByte(unsigned char Dbyte){unsigned char i ;for(i=0 ;i< 8 ;i++){SCK_L ;SID_OUT;if (Dbyte & 0x80){SID_H;}else{SID_L;}Dbyte=Dbyte<<1;SCK_H;SCK_L;}}// 串行方式接收一个字节unsigned char ReceiveByte(void){unsigned char i,temp1,t,temp2;temp1=temp2=0;for(i=0;i<8;i++){temp1=temp1<<1;SCK_L;SCK_H;SCK_L;SID_IN;t=SID_READ;if (t){temp1++;}}for(i=0 ;i<8 ;i++){temp2=temp2<<1;SCK_L;SCK_H;SCK_L;SID_IN;t=SID_READ;if (t){temp2++;}}return ((0xf0&temp1)+(0x0f&temp2));}// 判断是否忙碌void CheckBusy( void ){do SendByte(0xfc); // 字节格式:11111,RW(1),RS(0),0while(0x80&ReceiveByte()); // 判断是否忙碌:BF(.7)=1 Busy}// 向液晶发送命令void WriteCommand( unsigned char Cbyte ){CS_H;CheckBusy();SendByte(0xf8); // 字节格式:11111,RW(0),RS(0),0SendByte(0xf0&Cbyte); // 高四位SendByte(0xf0&Cbyte<<4); // 低四位(先执行< ;< ;)CS_L;}// 向液晶发送显示数据void WriteData( unsigned char Dbyte ) //显示字符{CS_H;CheckBusy();SendByte(0xfa); // 字节格式:11111,RW(0),RS(1),0SendByte(0xf0&Dbyte); // 高四位SendByte(0xf0&Dbyte<<4); // 低四位(先执行< ;< ;)CS_L;}// 延时函数void Delay(unsigned int MS){unsigned char us,usn;while(MS!=0){usn = 2;while(usn!=0){us=0xf5 ;while (us!=0){us-- ;};usn--;}MS--;}}// 维捷登测试架专用延时函数void DelayKey(unsigned int Second , unsigned int MS100){ // 输入精确到0.1S,是用","unsigned int i;for(i=0 ;i<Second*100+MS100*10 ;i++){Delay(10) ;}}// 文本区清RAM函数void LcmClearTXT( void ){unsigned char i ;WriteCommand(0x30);// 8BitMCU,基本指令集合WriteCommand(0x80);// AC归起始位for(i=0 ;i<64 ;i++)WriteData(0x20);}// 液晶初始化函数void LcmInit( void ){WriteCommand(0x30); // 8BitMCU,基本指令集合WriteCommand(0x03); // AC归0,不改变DDRAM内容WriteCommand(0x0c); // 显示ON,游标Off,游标位反白OFFWriteCommand(0x01); // 清屏,AC归0 WriteCommand(0x06); // 写入时,游标右移动}void PutStr(unsigned char row,unsigned char col,unsigned char *puts){int i=0;WriteCommand(0x30); // 8BitMCU,基本指令集合WriteCommand(AC_TABLE[8*row+col]); // 起始位置for(i=0;puts[i]!='\0';i++){WriteData(puts[i]);}}void DisplayHello(void) //显示欢迎菜单{LcmClearTXT();PutStr(0,0,Hello1);PutStr(1,0,Hello2);DelayKey(2,0);PutStr(0,0,Hello3);PutStr(1,0,Hello4);DelayKey(2,0);}void DisplayMenu1_1(void) //一级菜单显示{unsigned char a[4];int i=0,j;float v;key_val=0;LcmClearTXT();PutStr(0,0,menu1_1);PutStr(1,0,menu1_2);WriteCommand(0x30);WriteCommand(0x93);while(!(key_val==4)) // 如果按键D没有按下一直显示一级菜单{switch(key_val){case 1:WriteData('0');a[i]=0;i++;while(key_val==1);break;case 2:;break;case 3:;break;case 4:;break;case 5:WriteData('1');a[i]=1;i++;while(key_val==5);break;case 6:WriteData('2');a[i]=2;i++;while(key_val==6);break;case 7:WriteData('3');a[i]=3;i++;while(key_val==7);break;case 8:;break;case 9:WriteData('4');a[i]=4;i++;while(key_val==9);break;case 10:WriteData('5');a[i]=5;i++;while(key_val==10);break;case 11:WriteData('6');a[i]=6;i++;while(key_val==11);break;case 12:;break;case 13:WriteData('7');a[i]=7;i++;while(key_val==13);break;case 14:WriteData('8');a[i]=8;i++;while(key_val==14);break;case 15:WriteData('9');a[i]=9;i++;while(key_val==15);break;case 16:;break;}}i--;if (i==1){A=a[0]*10+a[1];}elseif(i==2){A=a[0]*100+a[1]*10+a[2];}elseif(i==3){A=a[0]*1000+a[1]*100+a[2]*10+a[3];if(A>2000)DisplayMenu1_1();}for(j=0;j<=i;j++){a[j]=a[j]+0x30;}LcmClearTXT();PutStr(0,0,menu2_1);PutStr(1,0,menu2_2);PutStr(0,4,a);while(1){while(!(key_val==4)) // 如果按键D没有按下一直显示一级菜单{switch(key_val){case 1:;break;case 2:A++;while(key_val==2);break; //数值加1case 3:A--;while(key_val==3);break; //数值减1case 4:;break;case 5:;break;case 6:;break;case 7:;break;case 8:;break;case 9:;break;case 10:;break;case 11:;break;case 12:;break;case 13:;break;case 14:;break;case 15:;break;case 16:;break;}if(A>=20&&A<=99){a[0]=A/10+0x30;a[1]=A%10+0x30;a[2]=0x20;a[3]=0x20;}if(A>=100&&A<=999){a[0]=A/100+0x30;a[1]=A/10%10+0x30;a[2]=A%10+0x30;a[3]=0x20;}if(A>=1000&&A<=2000){a[0]=A/1000+0x30;a[1]=A/100%10+0x30;a[2]=A/10%10+0x30;a[3]=A%10+0x30;}PutStr(0,4,a);v=(int)(((float)A/1000/2.5)*4096);DA_Write(v);AD_Display();}DisplayMenu1_1();}}// 主函数(程序入口)int main(void){jtagWait(); // JTAG口解锁函数clockInit(); // 时钟初始化init(); // 端口初始化PSB_L; // 串行方式Delay(100); // 延时LcmInit(); // 液晶初始化keyBoardInit(); // 键盘初始化DA_Init();AD_Init();//SysCtlPeriClkGating(true); // 允许在睡眠模式下外设采用寄存器SCGCn配置时钟//SysCtlPeriSlpEnable(KEY_PERIPH); // 允许KEY 所在GPIO端口在睡眠模式下继续工作SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER0 ); // 使能定时器0外设TimerConfigure(TIMER0_BASE, TIMER_CFG_A_PERIODIC); // 设置定时器0为周期触发模式TimerLoadSet(TIMER0_BASE, TIMER_A, 300000); // 设置定时器装载值:定时10MSTimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); // 设置定时器为溢出中断TimerEnable(TIMER0_BASE, TIMER_A); // 使能定时器0IntEnable(INT_TIMER0A); // 使能定时器0外设//DisplayHello();IntMasterEnable(); // 处理器总中断使能//GPIOPinWrite(LED_PORT, LED,0x00);DisplayMenu1_1(); // 一级菜单显示}//定时器中断void Timer0A_ISR(void) // 定时器0中断处理程序{TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); // 清除定时器0中断keyBoard_scan();TimerEnable(TIMER0_BASE, TIMER_A); // 使能定时器0}。
数控直流电流源完整版(电路+程序)

题目名称:数控直流电流源摘要:该数控直流电流源以精密压控电流源为核心、用单片机、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所示。
数控直流源

简易数控直流电流源摘要:本系统设计以A T89S52为核心,通过D/A转换、、功率放大电路、I/V转换、独特的算法及ICL7107电压测量实现了高精度的电压输出范围在0~9.9V范围内的数控直流电流源。
此外本电流源还具有菜单选择功能、电压可预置,多种波形供选择、并可以以0.1V电压步进、显示给定值和实测值等功能并具备过流保护的功能。
关键词:单片机DA转换数字控制功率放大一、引言1.1系统设计目的设计出有一定输出电压范围和功能的数控电源。
满足下列要求:(1)输出电压:范围0~+9.9V,步进0.1V,纹波不大于10mV;(2)输出电流:500mA;(3)输出电压值由数码管显示;(4)由“+”、“-”两键分别控制输出电压步进增减;(5)为实现上述几部件工作,自制一稳压直流电源,输出±15V,+5V。
设计概念图如下所示:图一:设计概念图另外还可以实现如下要求:(1)输出电压可预置在0~9.9V之间的任意一个值;(2)用自动扫描代替人工按键,实现输出电压变化(步进0.1V不变);(3)扩展输出电压种类(比如三角波等)。
1.2 系统设计思想本系统以AT89S52为系统控制单元、DA转换器为数字控制输出单元、运放组合电路为功率放大单元、ICL7107为实际电压测量反馈单元、4*4键盘为预置控制输入单元, 12864为显示单元。
通过键盘控制实现预置初始化,由单片机给DA转换器相应的数据,通过功率放大电路运放,最后经射极输出器完成输出。
ICL7107接至输出,显示实际的输出电压。
综上所述,系统最终的方框模块图如下所示。
图二:系统方框图二、方案比较及确定2.1、主要控制模块方案(1):凌阳单片机是本身具备语音识别功能的十六位单片机,具有基本的DSP 功能,具备语音识别的优点。
如常见的语音控制机器人,语音控制小车等。
方案(2) :采用AT89S52作为控制模块核心。
单片机最小系统相对简单,容易制作PCB ,算术功能强,软件编程灵活、可以通过ISP 方式将程序快速下载到芯片,方便的实现程序的更新,自由度大,较好的发挥C 语言的灵活性,可用编程实现各种算法和逻辑控制,同时其具有功耗低、体积小、技术成熟和成本低等优点。
(数控加工)数控直流电流源设计报告精编

(数控加工)数控直流电流源设计报告数控直流电流源一、设计任务和技术要求1.设计壹个数控直流电流源。
2.输出电流0~99mA,手动步进1mA增、减可调,误差不大于0.01mA。
3.具有输出电流大小的数码显示。
4.负载供电电压+12V,负载等效阻值100Ω。
5.电路应具有对负载驱动电流较好的线性控制特性。
6.设计电路工作的直流供电电源电路。
二、系统原理概述本设计要求设计出壹个数控的直流电源,且且输出电流为0~99mA,能够手动控制增减。
在此采用数模转换的原理,只要产生和0~99mA电流相对应的数字量(我们取数字量为0~99),再使用D/A转换器转换为模拟电压量,最后再用V/I转换器将电压量转换为和电压量相对应的电流量即可。
为控制输出电流手动步进为1mA增、减可调,我们只要保证数字量(0~99)——电压量(0~9.9V)——电流量(0~99mA)相对应,通过控制数字量手动增减步进为1可调即可。
综上,整个系统的原理框图如图壹所示:图一系统原理框图三、方案论证1.直流稳压电源电路单元小功率稳压电源由电源变压器、整流电路、滤波电路和稳压电路四个部分组成。
如图二所示:图二稳压电源组成示意图方案壹:输出可调的开关电源开关电源的功能元件工作在开关状态,因而效率高,输出功率大;且容易实现短路保护和过流保护,可是电路比较复杂,设计繁琐,在低输出电压时开关频率低,纹波大,稳定度极差,因此在本设计中不适合此方案。
方案二:由固定式三端稳压器组成由固定式三端稳压器(7805、7812、7912)输出脚V0、输入脚V i和接地脚GND组成,它们的输入端接电容能够进壹步滤波,输出端接电容能够改善负载的瞬间影响,且且此电路也比较稳定,实现简单。
因此在此采用方案二,电路原理图如图三所示:图三固定三端式直流稳压电源电路2.手动增减数字量产生单元方案壹:74LS163为可预置的4位二进制同步加法计数器。
采用俩片74LS163运用反馈清零或者反馈置数法构成十进制计数器,再将俩片73LS163构成2位十进制加法计数器。
数控直流电流源TLC5615

数控直流电流源林彩莲黎智华周双强(广西师范大学物理与信息工程学院创新基地桂林 541004 )摘要本数控直流电流源以单片机A T89S51为控制核心,由D/A转换器TLC5615、A/D转换器TLC2543、中文字库液晶显示块、放大电路和大功率调整电路组成。
通过4x4键盘输入给定值,由D/A转换器将数字信号转换成模拟信号,经D/A输出电压作为恒流源的参考电压,以LMOP07作为电压跟随器,利用晶体管平坦的输出特性得到恒定的电流输出,最后用中文液晶显示输出。
本系统采用单片机作为控制中心,产生数字可调的直流电流源。
其内部4K flash memory 用于存储应用程序。
键盘用于设定电流源的值。
键盘为4x4结构,采用反转法读取键盘值。
P3口的低四位接键盘的行线,P3口的高四位接键盘的列线.图中数模转换器D/A与其右边部分的电路构成恒流源。
D/A输出电压作为恒流源的参考电压,LMOP07成电压跟随器。
利用晶体管平坦的输出特性即可得到恒流输出。
由于跟随器是一种深度的电压负反馈电路,因此电流源具有较好的稳定性。
为了提高稳定度,D/A 部分的参考电压采用LM336的参考电压。
R2采用大线径康铜丝制作,康铜丝温度系数很小(5ppm/o C),大线径可使其温度影响减至最小。
单片机系统仅需5V,0.5A电源即可,电源只供单片机完成键盘输入显示,D/A等控制功能。
电流源的电源由V+提供,普通任何一种直流稳压电源都可满足要求。
作者使用的是0~10V,0~2A的直流文要电源,恒流源最大电流可达2A。
一、方案论证与比较方案一:数模转换器采用通用的DAC0809,摸数转换器采用AD0832,调整管用TIP41C.方案二:数模转换器采用美国德州仪器公司的TLC5615IP,它使带由缓冲基准输入的10位电压输出数模转换器(DAC)。
DAC具有基准电压两倍的输出范围,且DAC使单调变化的。
器件使用简单,用单5V 电源工作。
方案比较:方案一的电路能实现功能,但硬件电路复杂,逻辑电路设繁琐,调试困难,A/D、D/A采用并行转换器,占用单片机口线资源较多,处理数据的精度不够。
数控直流电流源

Hefei University2015年合肥学院电子设计竞赛项目报告项目名称:数控直流电流源作者姓名:班级: 13级通信工程(2)班完成时间: 2015.3.16数控直流电流源摘要本设计采用闭环控制实现直流电流源,系统以AT89S51单片机为控制核心,可以连续设定200mA-1000mA的电流值,根据设定的电流值,通过12位D/A TLV5618输出控制电压,10位A/D TLC1549对输出电流进行反馈,按照PID控制算法和运放的电流串联负反馈特性,实现一种高精度、低纹波、带负载能力强的直流电流源。
该电流源可以通过键盘进行预置调整设计值,且输出值能通过LCD 显示。
经过ADC采样,完成输出电流显示功能,是理想的电流源解决方案。
关键词:精密电流源;单片机;高精度;数控一、引言 (1)二、系统整体设计 (1)三、恒流源的工作原理 (1)3.1.基本原理 (2)3.2原理框图 (2)四、方案论证与选择 (2)4.1数控部分 (2)4.2电源提供部分 (3)4.3基准电压输出部分 (3)五、系统的硬件设计与实现 (4)5.1电路设计及器件选择 (4)5.2取样电阻的选择 (4)5.3调整管的选择 (5)5.4误差电压放大器 (5)5.4.1误差放大器的选择 (5)5.4.2放大电路工作电压的选择 (5)5.5基准电压源 (5)5.6供电部分 (6)5.7键盘显示与电路 (7)5.8其他注意事项 (7)六、系统软件设计 (8)七、系统测试与误差分析 (9)7.1测试使用的仪器设备 (9)7.2测试结果 (9)7.3纹波测量 (10)7.4系统误差分析 (10)7.4.1误差原因 (10)7.4.2电路改进方法 (10)八、心得体会与总结 (11)九、参考文献 (11)附录: (12)附录1:显示模块电路原理图 (12)附录2:键盘模块电路图 (12)一、引言科学技术是第一生产力,科技进步与创新是推动社会进步和科技发展的决定性因素,科研与创新训练是培养创新意识、提高创新能力、培养创新型人才的有效途径。
数控直流电流源设计

摘要:本次主要任务是使用Proteus、Multisim、PSPICE、TINA-TI、Matlab等电路仿真软件,设计仿真一个简易数控恒流源电路方案以微控制器为核心,设计一数字式直流电流控制系统,实现了可控的恒电流源.系统以89c52单片机为控制核心,通过12位D/A MAX5822控制输出电流、12位A/D MAX1241对输出电流进行检测,利用电流串连负反馈特性采用OP07和达林顿管组成的恒流源,实现一种宽范围、高精度、低纹波、带负载能力强的直流电源。
此外,该电流源可以通过键盘进行预置调整设定值,且输出通过LCD显示。
本次仿真所用的软件主要是Proteus与Multisim。
关键词:数控直流电流源 89C52 MAX5822 MAX1241 仿真目录1.设计任务与要求 (2)1.设计任务与要求 (3)1.1任务 (3)1.2要求 (3)2. 方案论证与比较 (4)2.1. 数控模块 (4)2.2.恒流源电路模块 (4)3 系统硬件组成及各部分的原理分析 (5)3.1数控电流输出及测量模块 (5)3.1.1数控电流输出 (5)3.1.2 测量电流输出 (6)3.2键盘与显示电路 (7)3.3恒流源电路 (7)3.4供电电路 (9)4 系统软件设计 (9)4.1软件的结构 (9)4.1软件流程图 (10)5电路各部分的仿真结果 (11)5.1显示和按键控制电路仿真 (11)5.2 DA转换仿真 (11)5.3 AD转换仿真 (12)5.4恒流源电路仿真 (13)6设计总结 (14)7附录 (15)1.设计任务与要求1.1任务设计并制作数控直流电流源。
输入交流200~240V,50Hz;输出直流电压≤10V1.2要求用仿真软件对电路进行设计并仿真,使其满足以下要求:1、基本要求(1)输出电流范围:200mA~2000mA;(2)可设置并显示输出电流给定值,要求输出电流与给定值偏差的绝对值≤给定值的1%+10 mA;(3)具有“+”、“-”步进调整功能,步进≤10mA;(4)改变负载电阻,输出电压在10V以内变化时,要求输出电流变化的绝对值≤输出电流值的1%+10 mA;(5)纹波电流≤2mA;(6)自制电源。
数控直流电流源设计制做

数控直流电流源1 方案比较,设计与论证1.1 控制方案比较方案一(见图1)此方案是传统的模拟PID控制方案,其优点是不占用CPU处理器的时间,对处理器性能的要求比较低。
但模拟PID控制方式的参数不易匹配,调节时间长,难以把精度做得很高,并且难以实现题中要求的良好的人机交互功能。
图1 控制方案一框图方案二(见图2)此方案采用摩托罗拉16位DSP芯片56F807为核心处理器来实现,该平台具有高处理速度,适合实现复杂的算法和控制。
这种方案可以方便地实现PID的控制算法。
本设计采用了方案二。
图2 控制方案二框图1.2 检测方案比较方案一 直接对负载进行采样直接对负载进行采样简单易行。
但由于负载电阻为可调节电阻,输出可能有电流可能会受接触电阻的变化而不稳定,故不宜选取。
方案二 对采样电阻进行采样采样电阻采用标准精密电阻,阻值稳定,将阻值的变化对电流的影响降低到最小程度。
另外,对采样电阻进行采样,有效避免了外接测量电路对电流的影响。
因此采用方案二。
2 理论分析2.1 PID 控制算法PID 是一种在单片机控制中常用的算法, PID 控制由于其具有控制方法简单、稳定性好、可靠性高和易于现场调试等优点,被广泛应用于工业过程控制。
其输入e (t)与输出u (t)的关系为[1]⎰++=t d i p dtde(t)K d e(τK e(t)K u(t)0)τ 数字PID 控制算法是以模拟PID 调节器控制为基础的,由于单片机是一种采样控制,它只能根据采样时刻的偏差计算控制量。
但是如果采样周期T 取得足够小,采用数值计算的方法逼近可相当准确,被控过程与连续控制十分接近。
离散化后的PID 算式为:[1]()001u e e T T e T T e K u ij i i d j i i i +⎥⎦⎤⎢⎣⎡-++=∑=- 式中:K : 比例系数u o : 偏差为零时的控制作用T i : 积分时间T d : 微分时间T : 采样时间以上公式称为位置式算法。