《开关电源模块并联供电系统设计讲解学习.doc》由会员分享,可在线阅读,更多相关《开关电源模块并联供电系统设计讲解学习.doc(35页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Good is good, but better carries it.精益求精,善益求善。开关电源模块并联供电系统设计-选修课设计(论文)题目开关电源模块并联供电系统设计专业电子信息工程班级111112班姓名邓逸博孙浙飞汪超指导教师王章权所在学院信息学院完成时间:2014年5月-开关电源模块并联供电系统设计电子信息工程专业邓逸博孙浙飞汪超摘要:本设计设计制作的是开关电源模块并联供电系统,能够广泛应用在小功率及各种电子设备领域,能够输出8V定压,功率可达到16W,并根据要求对两路电流进行按比例分配。本系统由DC/DC模块,均流、分流模块,保护电路组成。DC/DC模块以IRF9530芯片为开关,
2、配以BUCK的外围电路实现24V-8V的降压与稳压。采用LM328比较电路实现电流和电压的检测,控制由DC/DC模块构成的并联供电系统均流与分流工作模式,通过比较器电路实现过流保护。同时进行LCD1602液晶同步显示、独立键盘输入控制。输入的值经过单片机处理程序来控制输出电压,且输出电压和电流可实时显示。关键词:DC/DC模块,BUCK,电流分流目录一、绪论1二、设计的目标与基本要求1(一)、设计目标1(二)、基本要求2三、系统设计2(一)、系统框图2(二)、硬件设计与方案选择31、单片机选择32、主电路选择33、驱动电路图44、辅助电源55、电流、电压采样66、显示、按键7(三)、软件设计7
3、1、主程序72、按键程序83、液晶程序94、采样程序105、中断、PID流程图11四、调试过程12(一)、遇到的问题及解决办法12(二)、数据分析13五、体会与展望14参考文献15附录15附录1整体电路图15附录2程序代码16一、绪论分布式直流开关电源系统取代传统的集中式直流开关电源系统已成为大功率电源系统的发展方向:(1)单台大功率电源容易受技术、成本的限制;(2)单台直流开关电源故障会导致整个系统的故障,而分布式电源系统由若干电源模块并联组成,某个电源模块故障不会导致整个电源故障;(3)可根据实际负荷的变化,自动确定需要投入运行的模块数量或者解列退出的模块数量,对变负荷运行很有意义;(4)
4、由于多个电源模块并联运行,使每个电源模块承受的电应力较小,具有较高的运行效率,且具有较好的动态和静态特性。分布式电源系统需要解决的主要问题是实现多个并联运行的模块输出相同的功率。随着通信电源技术的高速发展,电力电子设备与人们的工作、生活的关系日益密切,而通信电子设备都离不开可靠的电源。进入20世纪80年代,计算机电源全面实现了开关电源化,率先完成计算机的电源换代;进入20世纪90年代,开关电源相继进入各种电子、电气设备领域,程控交换机、通信、电力检测设备电源、控制设备电源等都已广泛使用了开关电源,更促进了开关电源技术的迅速发展。二、设计的目标与基本要求(一)、设计目标设计并制作一个由两个额定输
5、出功率均为16W的8VDC/DC模块构成的并联供电系统(见图2.1)图2.1两路buck电路并联供电(二)、基本要求(1)调整负载电阻至额定输出功率工作状态,供电系统的直流输出电压UO=8.00.4V。在额定输出功率工作状态下,供电系统的效率不低于60%。(2)调整负载电阻,保持输出电压UO=8.00.4V,使两个模块输出电流之和IO=1.0A且按I1:I2=1:1模式自动分配电流,调整负载电阻,保持输出电压UO=8.00.4V,使两个模块输出电流之和IO=1.5A且按I1:I2=1:2模式自动分配电流,每个模块输出电流的相对误差绝对值不大于5%。调整负载电阻,保持输出电压UO=8.00.4V
6、,使两个模块输出电流之和IO=4.0A且按I1:I2=1:1模式自动分配电流,每个模块的输出电流的相对误差的绝对值不大于2%。(3)调整负载电阻,保持输出电压UO=8.00.4V,使负载电流IO在1.53.5A之间变化时,两个模块的输出电流可在(0.52.0)范围内按指定的比例自动分配,每个模块的输出电流相对误差的绝对值不大于2%。(4)具有负载短路保护及自动恢复功能,保护阈值电流为4.5A(调试时允许有0.2A的偏差)。在额定输出功率工作状态下,进一步提高供电系统效率。三、系统设计(一)、系统框图图3.1系统框图系统说明:以单片机为核心处理元件,DC-DC变换器为主电路。按键、显示便于人机交
7、互。驱动电路将单片机和DC-DC变换器隔离,辅助电源给单片机和采样电路供电。单片机将电压电流通过采样电路,运放采样回来在内部进行A/D处理,然后将数据输出液晶显示。在内部进行算法调整。使整个系统稳定,并达到基本要求。整个系统设计如上图3.1所示。(二)、硬件设计与方案选择1、单片机选择方案一:使用89C51单片机指令简单,易学易懂,外围电路简单,硬件设计方便,IO口操作简单,无方向寄存器,资源丰富,价格便宜、容易购买,资料丰富容易查到,程序烧写简单,但要外接A/D、D/A芯片,来实现对整个供电系统的控制,需要占用较多的I/O接口,会使普通单片机承载过大的数据处理任务,功耗较大。方案二:使用AT
8、mega16,ATmega16外设特点:两个具有独立的预分频器和比较器功能的8位定时器/计数器,两个具有预分频器、比较功能和扑捉功能的16位定时器/计数器,具有独立预分频器的实时时钟计数器,两路8位PWM,4路分辨率可编程(216位)的PWM,输出比较调制器,8路10位ADC,面向字节的两线接口I2C总线,两个可编程的串行USART,可工作于主机/从机模式的SPI串行接口,具有独立片内振荡器的的可编程看门狗定时器,片内模拟比较器。特殊的处理器特点:上电复位以及可编程的掉电检测,片内经过标定的RC振荡器,片内/片外中断源,6种睡眠模式,可以通过软件进行选择的时钟频率,通过熔丝位可以选择兼容模式,
9、全局上拉禁止功能。结合前两个方案优点,经过方案比较与论证,最终确定使用方案二,因为ATmega16速度快自带PWM,自带AD,而用89C51会使电路更加复杂与不稳定所以,用ATmega16单片机和其它控制器电路同实现整个系统的控制。2、主电路选择方案一:有一种型号为LM2956的降压开关电压调节器,能够输出3A的驱动电流,同时具有很好的线性和负载调节特性,该器件内部集成频率补偿和固定频率发生器,极大地简化了开关电源电路的设计。方案二:采用SG3525自带脉宽调制电源芯片来设计DC-DC降压转换电路,SG3525简单可靠及使用方便灵活,输出驱动为推拉输出形式,增加了驱动能力;内部含有欠压锁定电路
10、,死区时间可调、软启动控制电路、PWM锁存器,有过流保护功能,频率可调,同时能限制最大占空比。由此设计而成的电路易于实现脉宽调制,然而在真正使用时会发现,为得到要求的电压输出值,开关管S的参数选取相当不易。方案三:将经过隔离变压器,整流滤波后得到的24VDC通过BUCK降压电路进行DC-DC转换,由ATmega16单片机产生PWM控制其占空比,从而得到要求的直流电压。此方案仅用一块控制芯片不但可以实现对BUCK电路的控制,而且可以结合A/D和D/A对输出电压进行调整与显示。由于ATmega16单片机自带能够产生脉宽调制所需的PWM信号的端口,在实际制作中用起来比较方便。ATmega16单片机自
11、带8路10位A/D转换。结合前两个方案优点,经过方案比较与论证,最终确定使用方案三如图3.2,因为ATmega16单片机,自带PWM模块,可以输出PWM方波控制电路,节约芯片成本,也可实现AD转换。用单片机和其它控制器电路同实现整个系统的控制。3.2主电路图3、驱动电路图方案一:单片机输出PWM,采用IR2101驱动DC-DC电路中的IRF9530,控制输出电压。方案二:先采用光耦TLP250和单片机进行隔离,有效保护单片机,之后用IRF3205去驱动MOS管IRF9530,控制输出电压。结合两种方案的对比选择方案二如图3.3,因为方案二中采用光耦,将单片机与主电路隔离,能够有效保护单片机,而
12、且也能使正常使电路工作。图3.3驱动电路图4、辅助电源方案一:采用集成的三端稳压集成芯片,7815和7805分别给光耦和运放,还有单片机供电,7815内含过流,过热,过载保护电路。方案二:采用LM2575开关稳压集成芯片,它内部集成了一个固定的振荡器,是一种高效的稳压芯片,大多数情况下无需加散热片。内部有完善的保护电路,包括电流限制及热关断电路等。它可以根据用户要求选择输出电压,可输出3.3V,5V,12V,15V。然后再经过7805产生5V电压。结合两种方案的对比选择方案二如图3.4,因为方案二中的LM2575的是可调节输出电压的芯片,方便调控,而且它内部有电压基准比较,使输出的电压能够准确
13、并稳定,比7815要精确,且性能好。图3.4辅助电源电路图5、电流、电压采样采样模块是输出电压经过采样回来,形成一个负反馈.经过单片机内部A/D进行处理,然后使输出更加稳定和准确。电压采样模块直接采用LM358运放如图3.5,将输出的电压缩小一定倍数后,然后送给单片机处理判断。电流采样是经过0.1欧/4瓦的采样电阻后,缩小一定倍数,然后经过一个差分电路,将电压值送入单片机进行处理如图3.6。图3.5电压采样电路图图3.6电流采样电路图6、显示、按键显示部分采用字符型液晶1602,能够同时显示16x02即32个字符。16个引脚,3个控制引脚,8位双向数据端引脚。具有微功耗、体积小、显示内容丰富、
14、超薄轻巧的特点。用户可以对EN、RW、RS的数据进行编程,然后通过D0D7输出显示数据。其引脚功能图见下表6.1表6.11602引脚功能图按键部分采用四个独立的按键,分别控制占空比的加和减,对输出的电压和电流进行控制,使输出能够达到期望的要求,其按键功能表如表6.2。表6.2按键功能表键名S1S2S3S4功能PWM1加0.2%PWM1减0.2%PWM2加0.2%PWM2减0.2%CPU端口号PD0PD1PD2PD3(三)、软件设计1、主程序如图3.7为主程序流程图,一开始给系统各部分初始化,包括按键初始化,液晶初始化,PWM初始化,AD采样初始化,中断初始化,然后在进入大循环,在循环内进行数据
15、的显示,包括当前输入的占空比为多少,当前采样回来的数字量和实际的电压值为多少。还有按键程序,和AD采样。同时每10毫秒进入定时器0中断进行调整。图3.7主程序流程图2、按键程序按键程序流程图如图3.8所示。按键采用四个独立的按键,分别控制PWM1,PWM2的加和减,当有键按下时,扫描按键,然后进入判断。判断当前寄存器对应的值是否大于了设定的上限值,如果没有则数值加1,如果达到了则钳位在最大的上限值。然后返回数据。通过按键程序,可以控制占空比的调节。图3.8按键程序流程图3、液晶程序图3.8为1602液晶屏的程序框图,1602由3个控制引脚,8位双向数据端引脚控制显示的内容和位置。因此,这部分程
16、序主要有初始化函数,写命令函数和写数据函数组成。初始化函数主要对液晶屏的显示模式进行设定,写命令函数主要是对显示的位置和显示的方式进行设置,写数据函数是决定显示的内容。图3.81602程序流程图4、采样程序如图3.9是采样程序流程图。一开始配置AD寄存器,然后启动AD寄存器,然后将采样回来的数据组合成10位的数据,然后采样8次,去头去尾后,对其求平均值。将数据处理后,给液晶显示。然后进行电压判断,是否小于要求的最小值,如果是的话进行钳位,然后是否小于设定的最大值,是的话,就是在要求范围内,那就进行PID算法的调整,进行电流的分流。如果大于最大值的话,就进行钳位。图3.9AD采样程序流程图5、中
17、断、PID流程图如图3.10和3.11分别是中断流程图和PID算法程序流程图。定时器0中断定时10毫秒溢出中断,在中断中进行PID调整,和电压反馈调整。PID算法是根据公式,对采样电阻采样回来的电压进行反馈计算。根据对P,I,D三个参数的设置,然后结合算法公式,对输出的数据进行不断的调整,达到要求的值。图3.10定时器0中断图3.11PID算法流程图四、调试过程(一)、遇到的问题及解决办法(1)、在对电路板进行设计,做板子的时候,经过封塑机出来后的板子,然后用腐蚀剂进行腐蚀,得到了一块单面板,当我们把器件焊上去的时候发现,跟我们预期的反了一下,所有的器件都反了一下,这样子,整个电路就不能用了。
18、经过我们的讨论和思考,我们认为是我们在打印出油印纸的时候没有将它镜像,使整块板子就是按照反面的印了出来,经过我们镜像后,发现和我们所需要的板子是一样的了,所有的元器件都能按照原来的位置进行装配。而且板子也能正常工作。(2)、在整个电路都做出来以后,进行模块调试的时候发现方波的波形并不是很好,有一点的曲线,经过老师上课的讲解指导了是,栅极旁边的电阻阻值太大,因为有分布电容,所有会充放电,使波形不是很理想。经过计算后选取了一个合适的阻值,使波形能够达到电路的要求。还有在整体调试的时候,发现上面一路的测试点,一直是0,下面一路一直是1A左右,经过主电路排查后,发现没有问题,然后对测试点进行排查,发现
19、测试点的夹子松掉了,使电流都往下去了。将夹子焊好后,电路正常工作。(3)、在进行程序调试的时候,一直在使用内部的1M晶振,所以一直精度上不去,调节都是很粗的调节,电流一直达不到指标。还有液晶刷新很慢,按键要按很久才能用。后来查阅了资料,发现在烧写程序的时候要勾上熔丝位,如果使用的是8M以上的外部晶振的话,那就要把熔丝位全部勾上。这样才是在使用外部的16M晶振。将熔丝位勾上后,调节程序后,发现精度大大的提升了。能够达到基本的要求。还有在对PID参数设置的时候,一开始没有头绪,随便调,后来看论坛和同学谈论,发现要一个一个参数的调,在经过多次实验后,将PID参数调整好了,是指标达到了要求。(二)、数
20、据分析表4.1和表4.2是在电流1:1情况下,比例调节和PI调节的数据对比。表4.1负载为8.9,两模块电流按1:1分配(比例反馈)I1(A)I2(A)I总(A)Uo(V)给定值0.5051.08.0测量值0.5050.5151.0028.24绝对误差1%3%0.2%3%表4.2负载为8.5,两模块电流按1:1分配(PI反馈)I1(A)I2(A)I总(A)Uo(V)给定值0.5051.08.0测量值0.4940.5081.0078.08绝对误差1.2%1.7%0.7%1%表4.3和表4.4是在电流1:2情况下,比例调节和PI调节的数据对比。表4.3负载为7.0,两模块电流按1:2分配情况(比例
21、反馈)I1(A)I2(A)I总(A)Uo(V)给定值0.51.01.58.0测量值0.4620.9301.4977.71绝对误差7.6%7%0.2%3.6%表4.4负载为5.9,两模块电流按1:2分配情况(PI反馈)I1(A)I2(A)I总(A)Uo(V)给定值0.51.01.58.0测量值0.5080.9811.5027.60绝对误差1.6%1.9%0.2%5%对比表4.1和表4.2可以看出,同样是1:1的电流分配情况下,比例调节的误差在5%以内,达到了基本的要求,但是在PI调节下,可以看出误差精度已经达到了2%的要求。对比表4.3和表4.4可以看出,同样是1:2的电流分配情况下,比例调节的
22、误差已经超出了5%的要求,而在PI调节下精度达到了2%以内。对比着两组数据,可以看出了在PI的调节下精度大大的提升,说明了PID算法在控制方面的优势,使整个系统更加完善。五、体会与展望通过这次选修课的学习,学到了专业知识方面的一些知识。整个学习的过程是很重要的。由于这个学期在学习电力电子这门课,而课题又正好和电力电子相关知识有关,所以对于这次的课程,通过对整个系统的设计,测试,调整。更好的了解了电力电子和开关电源相关的知识,也更深入的学习到了一些课堂上无法学习到的东西。将课堂的理论知识和实践想结合,将学习到的东西更加印象深刻,不用去死记硬背,能够灵活运用。对于编写程序,整体的逻辑性还要加强。流
23、程图要写好再写程序。对于展望,希望能够在以后的学习中把硬件方面学的更好,能够把不足给弥补。在程序方面多学习一下别人的算法。学的更好,希望一次比一次有进步。参考文献1程汉湘,武小梅电力电子技术第二版.科学出版社2谭浩强C程序设计第三版,北京:清华大学出版社,2008.113童诗白,华成英.模拟电子技术,第四版北京:高等教育出版社,2006.54阎石数字电子技术基础,第五版.北京:高等教育出版社,2006.55蒋燕君.自动控制原理.重庆大学出版社,2008.1附录附录1整体电路图附录2程序代码/*main.c*/#include#include#include1602.h#includekey.h
24、#includead.h#includepid.h#defineucharunsignedchar#defineuintunsignedint#pragmainterrupt_handlertimer0_ovf_isr:10/*定时器0中断*/voidtimer0_init(void)TCCR0=0x00;/停止定时器TCNT0=0x64;/初始值,每10毫秒进一次中断TIMSK=0x01;/允许中断SREG|=BIT(7);/允许全局中断/*外中断0函数*/voidtimer0_ovf_isr(void)TCNT0=0x64;pid1_calculating();/PID调整OCR1Apid
25、2_calculating();/PID调整OCR1Bcom_vol();/电压反馈/*PWM设置输出*/voidKPWM(void)PORTD|=BIT(4)|BIT(5);DDRD|=BIT(4)|BIT(5);TCCR1A=0xA2;/两路PWM,匹配清零TCCR1B=0x11;/相位修正PWM模式,位数可调,预分频1ICR1=800;/此数为16位PWM,16M晶振,clk/(2*N*TOP),频率为10KOCR1A=255;/占空比31.8%OCR1B=255;/占空比31.8%voidmain()KPWM();/PWM函数LCD_init();/1602初始化函数key_init(
26、);/按键初始化函数timer0_init();/定时器0初始化adcport_init();/AD端口初始化while(1)Display_PWM();/显示PWM函数press();/按键函数display_AD0();/显示AD0的模拟量和数字量/*1602.h*/#ifndef_1602_H_#define_1602_H_#defineucharunsignedchar#defineuintunsignedintvoiddelay(uintMS);voidwrite_com(uintcom);voidwrite_dat(uintdat);voidLCD_init();voidDispl
27、ay_PWM();voidcalculate_AD0();#endif/*1602.c*/#include#include#include1602.h#defineucharunsignedchar#defineuintunsignedint/*显示固定数组PWM:*/constuchartab=PWM:;/*延时函数*/voiddelay(uintMS)/约为1MS的延时函数uinti,j;for(i=0;iMS;i+)for(j=0;j2282;j+);/2282是在16MHz晶振下为MS毫秒/*1602写地址*/voidwrite_com(uintcom)PORTA&=BIT(5);/R
28、S=0PORTA&=BIT(6);/RW=0PORTB=com;/送地址delay(5);PORTA|=BIT(7);/EN=1delay(5);PORTA&=BIT(7);/EN=0/*1602写数据*/voidwrite_dat(uintdat)PORTA|=BIT(5);/RS=1PORTA&=BIT(6);/RW=0PORTB=dat;/送数据delay(5);PORTA|=BIT(7);/EN=1delay(5);PORTA&=BIT(7);/EN=0/*1602初始化*/voidLCD_init()DDRA=0XFF;DDRB=0xFF;delay(5);write_com(0X3
29、8);/设8位数据线,双行,5*7点阵delay(5);write_com(0X0c);/开显示,不显示光标delay(5);write_com(0X06);/输入地址自加,屏幕不移动delay(5);write_com(0X01);/清屏delay(5);/*显示PWM占空比*/voidDisplay_PWM()uchari;uintshi,ge,xiaoshu,beichu;uintshi1,ge1,xiaoshu1;shi=OCR1A/100;/将OCR1A百位拆分ge=OCR1A/10%10;/将OCR1A十位拆分xiaoshu=OCR1A%10;/将OCR1A个位拆分beichu=I
30、CR1/10;/将ICR1变为两位数shi1=OCR1B/100;/将OCR1B百位拆分ge1=OCR1B/10%10;/将OCR1B十位拆分xiaoshu1=OCR1B%10;/将OCR1B个位拆分write_com(0x80);for(i=0;tabi!=0;i+)write_dat(tabi);write_com(0x84);write_dat(shi*100+ge*10+xiaoshu)*100/beichu/100+0x30);/显示十位write_dat(shi*100+ge*10+xiaoshu)*100/beichu/10%10+0x30);/显示个位write_dat(.);
31、write_dat(shi*100+ge*10+xiaoshu)*100/beichu%10+0x30);/显示小数点write_dat(%);write_com(0x8a);write_dat(shi1*100+ge1*10+xiaoshu1)*100/beichu/100+0x30);/显示十位write_dat(shi1*100+ge1*10+xiaoshu1)*100/beichu/10%10+0x30);/显示个位write_dat(.);write_dat(shi1*100+ge1*10+xiaoshu1)*100/beichu%10+0x30);/显示小数点write_dat(%
32、);/*AD.H*/#ifndef_AD_H_#define_AD_H_voidadcport_init();voidADC0INIT(void);voidADC1INIT(void);voidADC2INIT(void);intget_ADCdata(void);floatget_ave(inta8);floatget_ADC0data(void);floatget_ADC1data(void);floatget_ADC2data(void);voiddisplay_AD0();#endif/*AD.C*/#include#include#include1602.h#defineucharu
33、nsignedchar#defineuintunsignedint/参考电压#defineREF5.12/*ADC端口初始化*/voidadcport_init()DDRA&=BIT(0);PORTA&=BIT(0);DDRA&=BIT(1);PORTA&=BIT(1);DDRA&=BIT(2);PORTA&=BIT(2);/*ADC0初始化*/voidADC0INIT(void)ADMUX=0x40;/AREF基准压,结果右对齐,通道为ADC0ADCSRA=0x87;/使能ADC,单次转换,预分频为128ADCSRA|=(1ADSC);/启动首次转换while(!(ADCSRA&(1ADIF
34、);/等待转换结束ADCSRA|=(1ADIF);/清除ADIF位/*ADC1初始化*/voidADC1INIT(void)ADMUX=0x41;/AREF基准压,结果右对齐,通道为ADC1ADCSRA=0x87;/使能ADC,单次转换,预分频为128ADCSRA|=(1ADSC);/启动首次转换while(!(ADCSRA&(1ADIF);/等待转结束循环ADCSRA|=(1ADIF);/清除ADIF位/*ADC2初始化*/voidADC2INIT(void)ADMUX=0x42;/AREF基准压,结果右对齐,通道为ADC2ADCSRA=0x87;/使能ADC,单次转换,预分频为128ADC
35、SRA|=(1ADSC);/启动首次转换while(!(ADCSRA&(1ADIF);/等待转结束循环ADCSRA|=(1ADIF);/清除ADIF位/*获取ADC的采样值*/intget_ADCdata(void)inta,b;a=b=0;b=ADCL;/读高位后数据更新a=ADCH;/再读取ADCH数据a=(a8);/右对齐,左移八位a=(a|b);/组成10位二进制数据returna;/*去头去尾,获取平均值*/floatget_ave(inta8)floatv;unsignedchari;floatsum=0;for(i=1;i7;i+)/从第2次到第6次数据sum=sum+ai;v=
36、sum/6;returnv;/*获取ADC0采样8次的平均值*/floatget_ADC0data(void)unsignedchari=0;floatv;intbuf8=0;for(i=0;i8;i+)ADC0INIT();/AD初始化一次bufi=get_ADCdata();/将数据放入数组v=get_ave(buf);returnv;/*获取ADC1采样8次的平均值*/floatget_ADC1data(void)unsignedchari=0;floatv;intbuf8=0;for(i=0;i8;i+)ADC1INIT();/AD初始化一次bufi=get_ADCdata();/将数
37、据放入数组v=get_ave(buf);returnv;/*获取ADC2采样8次的平均值*/floatget_ADC2data(void)unsignedchari=0;floatv;intbuf8=0;for(i=0;i8;i+)ADC2INIT();/AD初始化一次bufi=get_ADCdata();/将数据放入数组v=get_ave(buf);returnv;/*将数据拆分送显示*/voiddisplay_AD0()inta,b;uchars6,k6;uchari,j,m;a=get_ADC0data()*REF/1024*1000;/将数据转化为十进制b=get_ADC0data()
38、;/数字量s0=a/1000+0;s1=.;s2=a%1000/100+0;s3=a%100/10+0;s4=a%10+0;s5=V;k0=D;k1=:;k2=b/1000+0;k3=b%1000/100+0;k4=b%100/10+0;k5=b%10+0;write_com(0xC0);for(i=0;i6;i+)write_dat(si);write_com(0xC7);for(j=0;j=360)/实际电压值大于8.4VOCR1A=265;/钳位到8.4VOCR1B=265;if(get_ADC2data()=310)/实际电压值小于7.6VOCR1A=240;/钳位到7.6VOCR1B
39、=240;/*KEY.H*/#ifndef_KEY_H_#define_KEY_H_voidkey_init();voidpress();ucharkey();#endif/*KEY.C*/#include#include#include1602.h#defineucharunsignedchar#defineuintunsignedintuintcount_pwm=255;uintcount_pwm1=255;/*按键初始化函数*/voidkey_init()DDRD&=BIT(0);/独立键盘接口置高电平PORTD|=BIT(0);DDRD&=BIT(1);/独立键盘接口置高电平PORTD
40、|=BIT(1);DDRD&=BIT(2);/独立键盘接口置高电平PORTD|=BIT(2);DDRD&=BIT(3);/独立键盘接口置高电平PORTD|=BIT(3);DDRD&=BIT(7);/独立键盘接口置高电平PORTD|=BIT(7);/*按键函数*/voidpress()ucharm;m=PIND;m&=0x0f;if(m=0X0e)count_pwm=OCR1A;/读取当前PWM值count_pwm+=1;count_pwm=OCR1B;/读取当前PWM值count_pwm+=1;delay(1);/按键消抖while(PIND=0x0e);OCR1A=count_pwm;/OC
41、R1A赋新值OCR1B=count_pwm;/OCR1B赋新值if(OCR1A=265&OCR1B=265)OCR1A=265;OCR1B=265;if(m=0X0d)count_pwm=OCR1A;/读取当前PWM值count_pwm-=1;count_pwm=OCR1B;/读取当前PWM值count_pwm-=1;delay(1);/按键消抖while(PIND=0x0d);OCR1A=count_pwm;/OCR1A赋新值OCR1B=count_pwm;/OCR1B赋新值if(OCR1A=240&OCR1B=240)OCR1A=240;OCR1B=240;if(m=0X0b)count_pwm=OCR1A;/读取当前PWM值count_pwm+=1;count_pwm1=OCR1B;/读取当前PWM值count_pwm1-=1;delay(1);/按