资源预览内容
第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
第9页 / 共9页
亲,该文档总共9页全部预览完了,如果喜欢就下载吧!
资源描述
直流数控电压源设计直流数控电压源设计本小组成员:刘兵丹,刘朋,刘伶,电子信息工程 0904 班 系统框架本数控直流稳压电源的设计以一稳压电源为基础,以高性能单片机系统为控制核心, 以稳压驱动放大电路、短路保护电路为外围的硬件系统,在检测与控制软件的支持下实现 对电压输出的数字控制,通过对稳压电源输出的电压进行数据采样与给定数据比较,从而 调整输入电压。本数控直流稳压电源实现以下功能:键盘可以直接设定输出电压值;可步 进调整电压;LCD显示电压值。硬件接口及主要特性: ADC0804 接口振荡频率为 fCLK1/1.1RC。其典型应用参数为:1R=10K,C=150PF,fCLK640KHZ,转换速度为 100。若采用外部时钟,则外 部 fCLK 可从 CLKI 端送入,此时不接 R、C。允许的时钟频率范围为100KHZ1460KHZ。INTR (引脚 5): INTR 是转换结束信号输出端,输出跳转为低电平表示本次转换2已经完成,可作为微处理器的中断或查询信号。如果将 CS 和 WR 端与 INTR 端相连, 则 ADC0804 就处于自动循环转换状态. CS 0 时,允许进行 A/D 转换。WR 由低跳高时 A/D 转换开始,8 位逐次比较需388=64 个时钟周期,再加上控制逻辑操作,一次转换需要 6673 个时钟周期。在典 型应用 fCLK640KHZ 时,转换时间约为 103114。当 fCLK 超过 640KHZ,转换精度下降,超过极限值 1460KHZ 时便不能正常工作。V2(引脚 9):参考电压 V/2 可以由外部电路供给,从4“V/2”端直接送入,V/2 端电压值应是输入电压范围的二分之一。DAC0832 接口8 位 D/A 转换,其转换时间为 1us,工作电压为+5V+15V,基准电压为110V+10V 芯片数据输入可采用双缓冲,单缓冲和直通三种方式。本次采用直通方式。 LCD1602 接口和 ADC0804 分时复用 P0 进行数据传输1键盘接口单独用 P1 口对 4*4 键盘进行扫描识别1程序设计程序设计思想提炼如下图所示:精简协作式不可剥夺嵌入式操作系统,得力与田 sir 的 Easy51RTOS 操作系统,这个系1统运用。协作式不可剥夺意思是说一个任务得到了 CPU 时间,除非它自己放弃使用 CPU ,否则将完全霸占 CPU ,所以任务之间需要协作使用一段时间的 CPU ,放 弃使用,其它的任务也如此,才能保证系统的正常运行。把一些例行的及需要定时执行的 程序放在时钟中断中,还可以利用时钟中断协助主程序完成定时、延时等操作。注意:应 尽量缩短中断处理程序的执行时间,更不要长于 20mS。 全局变量部分代码如下:ADC0804 测得的数字量 adc_value;DAC0832 输入的数字量 dac_value;程序写好后,编译成功,但 1602 显示的数据与预期不符。于是分块检查,发现 DA,1602,AD 均是正确的。后来参考别人的程序,发现单片机在读取 AD 的 数据时,没有先对相应的端口写 1. 任务零ADC0804 测数控电源的输出电压(量程限制取其一半进行测量) ,得到数字量 adc_value, 与 DAC0832 的输入 dac_value 进行比较,进行反馈(其实我们在把电路做出来, 进行测试时发现实际输出和我们通过按键设定的值误差很小,反而 ADC0804 由于精度不高,测出来的电压值误差较大,最后我们舍去了反馈)来调整 0832 的 dac_value。#ifndef _adc0804_H_ #define _adc0804_H_ /接口定义sbit AD_CS=P34; sbit AD_RD=P37; sbit AD_WR=P36; /读 ADDR 中的数据int get_data() int date; AD_CS=0; AD_RD=1; AD_WR=1; /ad 开始转换 AD_WR=0;P0=0xff;AD_RD=1; AD_RD=0; date=P0; AD_WR=1; /ad 停止转换AD_RD=1; return date; #endif程序写好后,编译成功,但 1602 显示的数据与预期不符。于是分块检查,发现 DA,1602,AD 均是正确的。后来参考别人的程序,发现单片机在读取 AD 的 数据时,没有先对相应的端口写 1.任务一通过按键设定电压,识别到 dac_value 使 DAC0832 输出我们需要的电压。void task1(void) float adc_value1;float dac_value1;int dac_value2;adc_value1=adc_value; dac_value1=dac_value;if(adc_value1*10/255-dac_value1/1000=0.04) dac_value1=dac_value1-1;if(dac_value1/1000-adc_value1*10/255=0.04) dac_value1=dac_value1+1;dac_value1=dac_value1*255/10000;dac_value2=dac_value1; if(key_input_display=0)/当确认键按下时。dac0832(dac_value2); task_delay1 = TASK_DELAY1; 涂暗的那段代码是为了用 0804 的测量值来反馈 0832 已得到我实际设定的电压值; 涂红的那段代码:8 位精准度,10V 对应 255,但是按键扫描得到的电压值是放大了一 千倍的。见后面任务三任务二通过 1602 来显示 setting:设定的电压值measure:测得的电压值void task2_init(void) lcd1602_init(); print_string(“setting:“,0x80); print_string(“measure:“,0x80+0x40); /任务2void task2() task2_init();if(key_input_display=0)/当确认键按下时.adc_value=19.60784313725490196078431372549*adc_value;adc0=adc_value/1000+0;adc1=.;adc2=adc_value%1000/100+0; adc3=adc_value%100/10+0; adc4=adc_value%10+0;adc5=0; switch(press_time) case 0: key_value_dac0=dac_value/1000+0;key_value_dac1=.;key_value_dac2=dac_value%1000/100+0; key_value_dac3=dac_value%1000%100/10+0; key_value_dac4=dac_value%1000%100%10+0; break; dac_value是一个四位的整数case 1: key_value_dac0=_;key_value_dac1=.;key_value_dac2=_;key_value_dac3=_;key_value_dac4=_; break;case 2: key_value_dac0=dac_value/1000+0; break;case 3: key_value_dac2=dac_value%1000/100+0; break;case 4: key_value_dac3=dac_value%1000%100/10+0; break;case 5: key_value_dac4=dac_value%1000%100%10+0; break;default: break;print_string(adc,0xc8);print_string(key_value_dac,0x88); 显示设定的电压值,和测得的电压值task_delay2 = TASK_DELAY2; 1602 在显示数据时会在数据最后乱码,后经在尾数写/0,显示正确。 任务三通过对键盘进行扫描,将设定的电压值,转换为数字量 dac_value,同时还有步 进加减和确定,清零的识别。void input_dac_value(num) uchar temp=0; static uchar flag=0; temp = num;if(temp=0xff) flag=1;if(temp != 0xff) key = temp; fmq=0;if(key10 switch(press_time)case 2: dac_value=key*1000; break; case 3: dac_value=dac_value+key*100 ; break;case 4: dac_value=dac_value+key*10; break;case 5: dac_value=dac_value+key; break;default: break; 注:将设定的电压转化为整数,放大一千倍switch(key)case 14: key_input_display=1; press_time+; key=0; fmq=0; break;/设置case 13: key_input_display=0; press_time=0; fmq=0; break;/ 确认 case 15: dac_value=0;fmq=0; break;/清零case 10: dac_value+=40;fmq=0; break;/递加case 11: dac_value-=40;fmq=0; break;/递减default: break; 主要程序见附件(略)模拟部分电路仿真图1电路说明图2作品参数测试设定值设定值ADAD 测量值测量值万用表测量值万用表测量值列列 1 1ADAD 测量得误差测量得误差列列 2 2万用表测得误差万用表测得误差1.0000.9410.9405.900%6.000% 2.0001.9601.9602.000%2.000% 2.9102.9012.9000.309%0.344% 3.0002.9802.9800.667%0.667% 3.7903.7603.7700.792%0.528% 4.0004.0004.0000.000%0.000% 5.0004.9414.9401.180%1.200% 5.5505.5005.5000.901%0.901% 6.0005.9415.9400.983%1.000% 7.0006.9806.9900.286%0.143% 8.0008.0008.0100.000%-0.125%8.9998.9418.9500.645%0.545% 9.9999.9609.9800.390%0.190%纹波峰峰值10mV纹波频率50KHZ内阻2.2 欧姆最大电流0.88A最大功率11.4W总结:这个作品的单片机部分的仿真和电路的焊接是在两天内完工的,模拟部分开始 焊好了,测试时烧过,后来又从焊了一次。当时正是要要校级比赛的作品,我 们的器件过来好久才送过来,导致交作品那天我们才拿到器件正式开始焊电路。 在紧张和高度兴奋中,似乎效率很高,程序的设计和仿真中遇到的问题都得到
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号