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