ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:190.07KB ,
资源ID:24379181      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/24379181.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数控电源010V含代码.docx)为本站会员(b****2)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数控电源010V含代码.docx

1、数控电源010V含代码直流数控电压源设计本小组成员:刘兵丹,刘朋,刘伶,电子信息工程0904班系统框架本数控直流稳压电源的设计以一稳压电源为基础,以高性能单片机系统为控制核心,以稳压驱动放大电路、短路保护电路为外围的硬件系统,在检测与控制软件的支持下实现对电压输出的数字控制,通过对稳压电源输出的电压进行数据采样与给定数据比较,从而调整输入电压。本数控直流稳压电源实现以下功能:键盘可以直接设定输出电压值;可步进调整电压;LCD显示电压值。硬件接口及主要特性:ADC0804接口振荡频率为fCLK1/1.1RC。其典型应用参数为:R=10K,C=150PF,fCLK640KHZ,转换速度为100。若

2、采用外部时钟,则外部fCLK 可从CLKI 端送入,此时不接R、C。允许的时钟频率范围为100KHZ1460KHZ。INTR (引脚5): INTR 是转换结束信号输出端,输出跳转为低电平表示本次转换已经完成,可作为微处理器的中断或查询信号。如果将CS 和WR 端与INTR 端相连,则ADC0804 就处于自动循环转换状态. CS 0 时,允许进行A/D 转换。WR 由低跳高时A/D 转换开始,8 位逐次比较需88=64 个时钟周期,再加上控制逻辑操作,一次转换需要6673 个时钟周期。在典型应用fCLK640KHZ 时,转换时间约为103114。当fCLK 超过640KHZ,转换精度下降,超

3、过极限值1460KHZ 时便不能正常工作。 V2(引脚9):参考电压V/2 可以由外部电路供给,从“V/2”端直接送入,V/2 端电压值应是输入电压范围的二分之一。DAC0832接口 8位D/A转换,其转换时间为1us,工作电压为+5V+15V,基准电压为10V+10V芯片数据输入可采用双缓冲,单缓冲和直通三种方式。本次采用直通方式。LCD1602接口和ADC0804分时复用P0进行数据传输键盘接口 单独用P1口对4*4键盘进行扫描识别程序设计程序设计思想提炼如下图所示:精简协作式不可剥夺嵌入式操作系统,得力与田sir的Easy51RTOS操作系统,这个系统运用。协作式不可剥夺意思是说一个任务

4、得到了 CPU 时间,除非它自己放弃使用 CPU ,否则将完全霸占 CPU ,所以任务之间需要协作使用一段时间的 CPU ,放弃使用,其它的任务也如此,才能保证系统的正常运行。把一些例行的及需要定时执行的程序放在时钟中断中,还可以利用时钟中断协助主程序完成定时、延时等操作。注意:应尽量缩短中断处理程序的执行时间,更不要长于20mS。全局变量部分代码如下:ADC0804测得的数字量adc_value;DAC0832输入的数字量dac_value;程序写好后,编译成功,但1602显示的数据与预期不符。于是分块检查,发现DA,1602,AD均是正确的。后来参考别人的程序,发现单片机在读取AD的数据时

5、,没有先对相应的端口写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_dat

6、a() 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_valu

7、e1; 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)/当确

8、认键按下时。 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()

9、 task2_init(); if(key_input_display=0)/当确认键按下时. adc_value=19.*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;

10、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

11、; 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_v

12、alue,同时还有步进加减和确定,清零的识别。void input_dac_value(num) uchar temp=0; static uchar flag=0; temp = num; if(temp=0xff) flag=1; if(temp != 0xff) & (flag=1) flag=0; key = temp; fmq=0; if(key10 & (key_input_display=1) press_time+; switch(press_time) case 2: dac_value=key*1000; break; case 3: dac_value=dac_value

13、+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;fm

14、q=0; break;/清零 case 10: dac_value+=40;fmq=0; break;/递加 case 11: dac_value-=40;fmq=0; break;/递减 default: break; 主要程序见附件(略)模拟部分电路仿真图电路说明图作品参数测试 设定值AD测量值万用表测量值列1AD测量得误差列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.7

15、92%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总结:这个作品的单片机部分的仿真和电路的焊接是在两天内完工的,模拟部分开始焊好了,测试时烧过,后来又从焊了一次。当时正是要要校级比赛的作品,我们的器件过来好久才送过来,导致交作品那天我们才拿到器件正式开始焊电路。在紧张和高度兴奋中,似乎效率很高,程序的设计和仿真中遇到的问题都得到了解决。第三天,数控和功率放大部分进行联合调,一开始就遇到0804测量不准的问题,差距很大,后来才发现,输出部分的分压电位器是坏的。改了后误差还是有点大差不多,0.1V左右。原来是我们为了能输出更大的电流,在输出端接的很大的分压电位器,差不多20M欧姆,然后为了滤除纹波也并接了电容,导致电容的电很难放掉,测得的电压不准。最后用五天的时间我们完成了数控电源。作品照片后续会上传

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1