开关电源模块并联供电系统设计..doc

上传人:scccc 文档编号:13410313 上传时间:2021-12-25 格式:DOC 页数:53 大小:851KB
返回 下载 相关 举报
开关电源模块并联供电系统设计..doc_第1页
第1页 / 共53页
开关电源模块并联供电系统设计..doc_第2页
第2页 / 共53页
开关电源模块并联供电系统设计..doc_第3页
第3页 / 共53页
亲,该文档总共53页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《开关电源模块并联供电系统设计..doc》由会员分享,可在线阅读,更多相关《开关电源模块并联供电系统设计..doc(53页珍藏版)》请在三一文库上搜索。

1、开关电源模块并联供电系统设计选修课设计(论文)题 目开关电源模块并联供电系统设计专业电子信息工程班级111112班姓 名邓逸博 孙浙飞 汪超指导教师王章权所在学院信息学院完成时间:2014年5月开关电源模块并联供电系统设计 .开关电源模块并联供电系统设计电子信息工程专业 邓逸博 孙浙飞 汪超摘 要: 本设计设计制作的是开关电源模块并联供电系统,能够广泛应用 在小功率与各种电子设备领域, 能够输出 8V 定压, 功率可达到 16W ,并根据 要求对两路电流进行按比例分配。本系统由 DC/DC 模块,均流、分流模块, 保护电路组成。 DC/DC 模块以 IRF9530 芯片为开关, 配以 BUCK

2、 的外围电路 实现 24V-8V 的降压与稳压。采用 LM328 比较电路实现电流和电压的检测, 控制由 DC/DC 模块构成的并联供电系统均流与分流工作模式,通过比较器电 路实现过流保护。同时进行 LCD1602 液晶同步显示、独立键盘输入控制。输 入的值经过单片机处理程序来控制输出电压,且输出电压和电流可实时显示。关键词 :DC/DC 模块, BUCK ,电流分流开关电源模块并联供电系统设计 .目录一、绪论 1二、设计的目标与基本要求 1.(一)、设计目标 1(二)、基本要求 2三、系统设计 3(一)、系统框图 3(二)、硬件设计与方案选择 3.1 、单片机选择 32 、主电路选择 43

3、、驱动电路图 54 、辅助电源 65 、电流、电压采样 7.6 、显示、按键 8(三 )、软件设计 91 、主程序 92 、按键程序 1.0.3 、液晶程序 1.1.4 、采样程序 1.2.5 、中断、 PID 流程图 1.3.四、调试过程 1.4.(一)、遇到的问题与解决办法 1.4.(二)、数据分析 1.5.五、体会与展望 1.7.参考文献 1.7.附 录 1.8.附录 1 整体电路图 1.8.附录 2程序代码 1.8.一、绪论分布式直流开关电源系统取代传统的集中式直流开关电源系统已成为大 功率电源系统的发展方向: (1)单台大功率电源容易受技术、成本的限制; ( 2) 单台直流开关电源故

4、障会导致整个系统的故障,而分布式电源系统由若干电源 模块并联组成,某个电源模块故障不会导致整个电源故障; ( 3)可根据实际负 荷的变化,自动确定需要投入运行的模块数量或者解列退出的模块数量,对变 负荷运行很有意义; ( 4)由于多个电源模块并联运行,使每个电源模块承受的 电应力较小,具有较高的运行效率,且具有较好的动态和静态特性。分布式电 源系统需要解决的主要问题是实现多个并联运行的模块输出相同的功率。随着 通信电源技术的高速发展,电力电子设备与人们的工作、生活的关系日益密 切,而通信电子设备都离不开可靠的电源。进入 20 世纪 80 年代,计算机电源 全面实现了开关电源化,率先完成计算机的

5、电源换代;进入 20 世纪 90 年代, 开关电源相继进入各种电子、电气设备领域,程控交换机、通信、电力检测设 备电源、控制设备电源等都已广泛使用了开关电源,更促进了开关电源技术的 迅速发展。二、设计的目标与基本要求(一)、设计目标设计并制作一个由两个额定输出功率均为 16W 的 8V DC/DC 模块构成的 并联供电系统(见图 2.1 )/IK匚DC/DC複块1J"DC/DC模块2图2.1两路buck电路并联供电(二八基本要求(1 )调整负载电阻至额定输出功率工作状态,供电系统的直流输出电压UO=8.0 ±0.4V。在额定输出功率工作状态下,供电系统的效率不低于60% o

6、(2) 调整负载电阻,保持输出电压UO=8.0 ±0.4V,使两个模块输出电流之和10 =1.0A 且按11:12=1:1模式自动分配电流,调整负载电阻,保持输出电压UO=8.0 ±0.4V,使两个模块输出电流之和 10 =1.5A 且按11:12二1:2 模式自动 分配电流,每个模块输出电流的相对误差绝对值不大于5%。调整负载电阻,保持输出电压UO=8.0 ±0.4V,使两个模块输出电流之和IO =4.0A 且按11:12=1:1模式自动分配电流,每个模块的输出电流的相对误差的绝对值不大于2% o(3) 调整负载电阻,保持输出电压UO=8.0 ±0.4

7、V,使负载电流IO在1.53.5A之间变化时,两个模块的输出电流可在(0.52.0 )范围内按指定的比例自动分配,每个模块的输出电流相对误差的绝对值不大于2%4.5A (调试时允许(4) 具有负载短路保护与自动恢复功能,保护阈值电流为有±0.2A的偏差)。在额定输出功率工作状态下,进一步提高供电系统效率。三、系统设计(一)、系统框图+ 24 VDC-IK变换器1rx>ix'变换器2PWM峠辅助电源驱动O控制器A PWM2 电 流 取 样图3.1系统框图系统说明:以单片机为核心处理元件,DC-DC变换器为主电路。按键、显示便于人机交互。驱动电路将单片机和DC-DC变换器隔

8、离,辅助电源给单片机和采样电路供电。单片机将电压电流通过采样电路,运放采样回来在内部进 行A/D处理,然后将数据输出液晶显示。 在内部进行算法调整。使整个系统稳 定,并达到基本要求。整个系统设计如上图3.1所示。(二)、硬件设计与方案选择1、单片机选择方案一:使用89C51单片机指令简单,易学易懂,外围电路简单,硬件设计方便,10 口操作简单,无方向寄存器,资源丰富,价格便宜、容易购买,资料丰富容易查到,程序烧写简单,但要外接A/D、D/A芯片,来实现对整个供电系统的控制,需要占用较多的 I/O接口,会使普通单片机承载过大的数据 处理任务,功耗较大。方案二:使用 ATmega16 ,ATmeg

9、a16外设特点:两个具有独立的预分频 器和比较器功能的8位定时器/计数器,两个具有预分频器、比较功能和扑捉功 能的16位定时器/计数器,具有独立预分频器的实时时钟计数器,两路8位PWM,4路分辨率可编程(216位)的PWM,输出比较调制器,8路10位ADC, 面向字节的两线接口 22C总线,两个可编程的串行 USART,可工作于主机/从 机模式的SPI串行接口,具有独立片内振荡器的的可编程看门狗定时器,片内 模拟比较器。特殊的处理器特点:上电复位以与可编程的掉电检测,片内经过 标定的RC振荡器,片内/片外中断源,6种睡眠模式,可以通过软件进行选择 的时钟频率,通过熔丝位可以选择兼容模式,全局上

10、拉禁止功能。结合前两个方案优点,经过方案比较与论证,最终确定使用方案二,因为 ATmega16速度快 自带PWM ,自带AD,而用89C51会使电路更加复杂与 不稳定所以,用ATmega16单片机和其它控制器电路同实现整个系统的控制。2、主电路选择方案一:有一种型号为 LM2956的降压开关电压调节器,能够输出3A的驱动电流,同时具有很好的线性和负载调节特性,该器件内部集成频率补偿和 固定频率发生器,极大地简化了开关电源电路的设计。方案二:采用SG3525自带脉宽调制电源芯片来设计 DC-DC降压转换电 路,SG3525简单可靠与使用方便灵活,输出驱动为推拉输出形式,增加了驱 动能力;内部含有

11、欠压锁定电路,死区时间可调、软启动控制电路、PWM锁存 器,有过流保护功能,频率可调,同时能限制最大占空比。由此设计而成的电 路易于实现脉宽调制,然而在真正使用时会发现,为得到要求的电压输出值, 开关管S的参数选取相当不易。方案三:将经过隔离变压器,整流滤波后得到的24VDC通过BUCK降压电路进行DC-DC转换,由ATmega16 单片机产生PWM控制其占空比,从 而得到要求的直流电压。 此方案仅用一块控制芯片不但可以实现对BUCK电路的控制,而且可以结合 A/D和D/A对输出电压进行调整与显示。由于 ATmega16单片机自带能够产生脉宽调制所需的PWM信号的端口,在实际制作中用起来比较方

12、便。 ATmega16单片机自带8路10位A/D转换。结合前两个方案优点,经过方案比较与论证,最终确定使用方案三如图3.2,因为ATmega16 单片机,自带 PWM 模块,可以输出 PWM 方波控制电 路,节约芯片成本,也可实现 AD转换。用单片机和其它控制器电路同实现整 个系统的控制。3、驱动电路图万案一:单片机输出PWM,采用IR2101驱动DC-DC 电路中的IRF9530, 控制输出电压。方案二:先采用光耦 TLP250和单片机进行隔离,有效保护单片机,之后用IRF3205去驱动MOS管IRF9530,控制输出电压。结合两种方案的对比选择方案二如图3.3,因为方案二中采用光耦,将单片

13、机与主电路隔离,能够有效保护单片机,而且也能使正常使电路工作。驱动模块图3.3驱动电路图4、辅助电源方案一:采用集成的三端稳压集成芯片,7815和7805分别给光耦和运放, 还有单片机供电,7815内含过流,过热,过载保护电路。方案二:采用LM2575开关稳压集成芯片,它内部集成了一个固定的振荡 器,是一种高效的稳压芯片,大多数情况下无需加散热片。内部有完善的保护 电路,包括电流限制与热关断电路等。它可以根据用户要求选择输出电压,可 输出3.3V,5V,12V,15V。然后再经过7805产生5V电压。结合两种方案的对比选择方案二如图3.4,因为方案二中的 LM2575的是可调节输出电压的芯片,

14、方便调控,而且它内部有电压基准比较,使输出的电 压能够准确并稳定,比7815要精确,且性能好。图3.4辅助电源电路图5、电流、电压采样采样模块是输出电压经过采样回来,形成一个负反馈.经过单片机内部A/D进行处理,然后使输出更加稳定和准确。电压采样模块直接采用LM358运放如图3.5,将输出的电压缩小一定倍数后,然后送给单片机处理判断。电 流采样是经过0.1欧/4瓦的采样电阻后,缩小一定倍数,然后经过一个差分电 路,将电压值送入单片机进行处理如图3.6 o H吉电JE缩小4倍图3.5电压采样电路图图3.6电流采样电路图6、显示、按键显示部分采用字符型液晶 1602,能够同时显示16x02即32个

15、字符。16个引 脚,3个控制引脚,8位双向数据端引脚。具有微功耗、体积小、显示内容丰 富、超薄轻巧的特点。用户可以对EN、RW、RS的数据进行编程,然后通过D0D7输出显示数据。其引脚功能图见下表6.1表6.1 1602引脚功能图符号功能1<MTV淳卅电琛舀VO潢品朋阳电湘4RS输人面作富选样L:敷與;Os推&5RW读*目僅作ii择1: Its D: j6E喪陸信峥(MDLS 10166?-. -,NO7BO收括总线'LSBDBJ态9)0UDB4态12當掘总线1314测K总线(MSB)*15£JIft人MDLS<M66|.|WU(1!能佶罟1&L2

16、MOLS40466 F莉牡蠻W号按键部分采用四个独立的按键,分别控制占空比的加和减,对输出的电压和电流进行控制,使输出能够达到期望的要求,其按键功能表如表6.2 o表6.2按键功能表键名S1S2S3S4功能PWM1加PWM1减PWM2加PWM2减0.2%0.2%0.2%0.2%CPU端口号PD0PD1PD2PD3(三)、软件设计1、主程序如图3.7为主程序流程图,一开始给系统各部分初始化,包括按键初始化,液晶初始化,PWM初始化,AD采样初始化,中断初始化,然后在进入大循环, 在循环内进行数据的显示,包括当前输入的占空比为多少,当前采样回来的数 字量和实际的电压值为多少。还有按键程序,和AD采

17、样。同时每10毫秒进入定时器0中断进行调整。主程序系统各初始 化定时器0中断显示PWM显示AD数据定时器0中断定时10毫秒进行PID调整AD采样电压比较反馈按键图3.7主程序流程图2、按键程序按键程序流程图如图3.8所示。按键采用四个独立的按键,分别控制PWM1,PWM2的加和减,当有键按下时,扫描按键,然后进入判断。判断当前寄存器 对应的值是否大于了设定的上限值,如果没有则数值加1,如果达到了则钳位在最大的上限值。然后返回数据。通过按键程序,可以控制占空比的调节。按键图3.8按键程序流程图3、液晶程序图3.8为1602液晶屏的程序框图,1602由3个控制引脚,8位双向数据端引 脚控制显示的内

18、容和位置。因此,这部分程序主要有初始化函数,写命令函数 和写数据函数组成。初始化函数主要对液晶屏的显示模式进行设定,写命令函 数主要是对显示的位置和显示的方式进行设置,写数据函数是决定显示的内容。写命令写数据初始化T设置为双行,5*7点阵延时5毫秒*开显示,不显示光标*延时5毫秒输入地址自加,屏幕不移动清屏1F延时5毫秒5延时5毫秒结束图3.8 1602程序流程图4、米样程序如图3.9是采样程序流程图。一开始配置AD寄存器,然后启动 AD寄存器,然后将采样回来的数据组合成10位的数据,然后采样8次,去头去尾后,对其求平均值。将数据处理后,给液晶显示。然后进行电压判断,是否小于要求的最小值,如果

19、是的话进行钳位,然后是否小于设定的最大值,是的话,就是在要求范围内,那就进行PID算法的调整,进行电流的分流。如果大于最大值的话,就进行钳位。AD图3.9 AD采样程序流程图5、中断、PID流程图如图3.10和3.11分别是中断流程图和 PID算法程序流程图。定时器0中断定时10毫秒溢出中断,在中断中进行PID调整,和电压反馈调整。PID算法是根据公式,对采样电阻采样回来的电压进行反馈计算。根据对PI,D三个参数的设置,然后结合算法公式,对输出的数据进行不断的调整,达到要求的值。定时器中断PID算法开始进API閑整电压比较反 馈结束图3.11 PID算法图3.10定时器0中断流程图四、调试过程

20、(一)、遇到的问题与解决办法(1 )、在对电路板进行设计,做板子的时候,经过封塑机出来后的板子,然后 用腐蚀剂进行腐蚀,得到了一块单面板,当我们把器件焊上去的时候发现,跟 我们预期的反了一下, 所有的器件都反了一下, 这样子, 整个电路就不能用了。 经过我们的讨论和思考,我们认为是我们在打印出油印纸的时候没有将它镜 像,使整块板子就是按照反面的印了出来,经过我们镜像后,发现和我们所需 要的板子是一样的了,所有的元器件都能按照原来的位置进行装配。而且板子 也能正常工作。(2)、在整个电路都做出来以后,进行模块调试的时候发现方波的波形并不是 很好,有一点的曲线,经过老师上课的讲解指导了是,栅极旁边

21、的电阻阻值太 大,因为有分布电容,所有会充放电,使波形不是很理想。经过计算后选取了 一个合适的阻值,使波形能够达到电路的要求。还有在整体调试的时候,发现 上面一路的测试点,一直是 0 ,下面一路一直是 1A 左右,经过主电路排查后, 发现没有问题,然后对测试点进行排查,发现测试点的夹子松掉了,使电流都 往下去了。将夹子焊好后,电路正常工作。( 3)、在进行程序调试的时候,一直在使用内部的 1M 晶振,所以一直精度上 不去,调节都是很粗的调节,电流一直达不到指标。还有液晶刷新很慢,按键 要按很久才能用。后来查阅了资料,发现在烧写程序的时候要勾上熔丝位,如 果使用的是 8M 以上的外部晶振的话,那

22、就要把熔丝位全部勾上。这样才是在 使用外部的 16M 晶振。将熔丝位勾上后,调节程序后,发现精度大大的提升 了。能够达到基本的要求。还有在对 PID 参数设置的时候,一开始没有头绪, 随便调,后来看论坛和同学谈论,发现要一个一个参数的调,在经过多次实验 后,将 PID 参数调整好了,是指标达到了要求。二)、数据分析表4.1和表4.2是在电流1:1情况下,比例调节和PI调节的数据对比表4.1负载为8.9 Q,两模块电流按1:1分配(比例反馈)11 (A)I2 (A)I 总(A)Uo (V)给定值0.50. 51.08.0测量值0.5050.5151.0028.24绝对误差1%3%0.2%3%表4

23、.2负载为8.5 Q,两模块电流按1:1分配(PI反馈)I1 (A)I2 (A)I 总(A)Uo (V)给定值0.50. 51.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 Q,两模块电流按1:2分配情况(比例反馈)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 Q,两模块电流按1:2分配情况(PI反馈)I1 (A)I2 (A)I 总

24、(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的电流分配情况下,比例调节的误 差已经超出了 5%的要求,而在PI调节下精度达到了 2%以内。对比着两组数据,可以看出了在PI的调节下精度大大的提升,说明了 PID算法在控制方面的优势,使整个系统更加完善。五、体会与展望通过这次选修课的学习,学到了专业知

25、识方面的一些知识。整个学习的过 程是很重要的。由于这个学期在学习电力电子这门课,而课题又正好和电 力电子相关知识有关,所以对于这次的课程,通过对整个系统的设计,测试, 调整。更好的了解了电力电子和开关电源相关的知识,也更深入的学习到了一 些课堂上无法学习到的东西。将课堂的理论知识和实践想结合,将学习到的东 西更加印象深刻,不用去死记硬背,能够灵活运用。对于编写程序,整体的逻 辑性还要加强。流程图要写好再写程序。对于展望,希望能够在以后的学习中 把硬件方面学的更好,能够把不足给弥补。在程序方面多学习一下别人的算法。 学的更好,希望一次比一次有进步。参考文献1 .科学出版社.2 谭浩强.C程序设计

26、.第三版,北京:清华大学出版社,2008.11 .3 童诗白,华成英.模拟电子技术,第四版.北京:高等教育出版社,2006.5 .4 阎石.数字电子技术基础,第五版.北京:高等教育出版社,2006.5 .蒋燕君.自动控制原理.重庆大学出版社,2008.1附录附录1 .整体电路图附录2 .程序代码*main c*#in clude<iom16v.h> #in clude<macros.h> #in clude"1602.h"#include"key.h"#include"ad.h"#include"pi

27、d.h"#define uchar unsigned char#define uint unsigned int#pragma interrupt_handler timer0_ovf_isr:10/*定时器 0 中断 */TCCR0= 0x00;TCNT0= 0x64;TIMSK= 0x01;SREG |= BIT(7);/ 允许全局中断void timer0_init(void)/ 停止定时器/ 初始值 ,每 10 毫秒进一次中断/ 允许中断/*外中断 0 函数 */void timer0_ovf_isr(void)TCNT0 = 0x64;pid1_calculating();

28、/PID 调整 OCR1Apid2_calculating(); com_vol();/PID 调整 OCR1B/ 电压反馈/*PWM设置输出*/void KPWM(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),频率为 10KOCR1AOCR1B= 255;= 255;/ 占空比 31.8%/ 占空比 31.8%voi

29、d main()KPWM();LCD_init();/PWM 函数/1602 初始化函数key_init();timer0_init(); adcport_init();while(1)Display_PWM();press();display_AD0();/ 按键初始化函数/ 定时器 0 初始化/AD 端口初始化/ 显示 PWM 函数/ 按键函数/ 显示 AD0 的模拟量和数字量* 1602.h *#ifndef _1602_H #define _1602_H #define uchar unsigned char#define uint unsigned intvoid delay(uin

30、t MS);void write_com(uint com); void write_dat(uint dat);void LCD_init();void Display_PWM();void calculate_AD0();#endif/*1602.c*/#include<iom16v.h> #include<macros.h>#include"1602.h" #define uchar unsigned char#define uint unsigned int /* 显示固定数组 PWM:*/ const uchar tab="PWM

31、:"/*延时函数 */ 约为 1MS 的延时函数/2282 是在 16MHz 晶振下为 MS 毫秒void delay(uint MS)uint i,j;for(i=0;i<MS;i+)for(j=0;j<2282;j+);/*1602写地址*/void write_com(uint com)/*1602写数据*/PORTA&=BIT(5);/RS=0PORTA&=BIT(6);/RW=0PORTB=com;/ 送地址delay(5);PORTA|=BIT(7);/EN=1delay(5);PORTA&=BIT(7);/EN=0void write

32、_dat(uint dat)PORTA|=BIT(5);/RS=1PORTA&=BIT(6);/RW=0PORTB=dat;/ 送数据delay(5);PORTA|=BIT(7); /EN=1 delay(5);PORTA&=BIT(7); /EN=0/*1602初始化*/void LCD_init()DDRA=0XFF;DDRB=0xFF; delay(5); write_com(0X38); delay(5);write_com(0X0c); delay(5);write_com(0X06); delay(5);write_com(0X01); delay(5);/ 设 8

33、 位数据线 ,双行 ,5*7 点阵/ 开显示 ,不显示光标/ 输入地址自加 ,屏幕不移动/ 清屏/* 显示 PWM 占空比 */void Display_PWM()uchar i;uint shi,ge,xiaoshu,beichu;uint shi1,ge1,xiaoshu1;shi=OCR1A/100; / 将 OCR1A 百位拆分ge=OCR1A/10%10;/ 将 OCR1A 十位拆分xiaoshu=OCR1A%10;/ 将 OCR1A 个位拆分beichu=ICR1/10;/ 将 ICR1 变为两位数shi1=OCR1B/100;/ 将 OCR1B 百位拆分ge1=OCR1B/10%

34、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('.');write_dat(shi*100+ge*10+x

35、iaoshu)*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('%

36、');/*AD.H*/#ifndef _AD_H #define _AD_H void adcport_init();void ADC0INIT(void);void ADC1INIT(void);void ADC2INIT(void);int get_ADCdata(void); float get_ave(int a8);float get_ADC0data(void); float get_ADC1data(void);float get_ADC2data(void);void display_AD0();#endif/*AD.C*/#include<iom16v.h>

37、; #include<macros.h>#include"1602.h" #define uchar unsigned char#define uint unsigned int / 参考电压#define REF 5.12/*ADC端口初始化 */void adcport_init()DDRA&=BIT(0);PORTA&=BIT(0);DDRA&=BIT(1);PORTA&=BIT(1);DDRA&=BIT(2);PORTA&=BIT(2);/* *ADC0初始化*/void ADC0INIT(void)ADM

38、UX=0x40;ADC0ADCSRA=0x87;ADCSRA|=(1<<ADSC);while(!(ADCSRA&(1<<ADIF);ADCSRA|=(1<<ADIF);/AREF 基准压,结果右对齐,通道为/ 使能 ADC ,单次转换,预分频为 128/ 启动首次转换/ 等待转换结束/ 清除 ADIF 位/*ADC1初始化*/void ADC1INIT(void)ADMUX=0x41;ADC1ADCSRA=0x87;ADCSRA|=(1<<ADSC); while(!(ADCSRA&(1<<ADIF);ADCSRA|

39、=(1<<ADIF);/AREF 基准压,结果右对齐,通道为/ 使能 ADC ,单次转换,预分频为 128/ 启动首次转换/ 等待转结束循环/ 清除 ADIF 位/* *ADC2初始化*/AREF 基准压,结果右对齐,通道为/ 使能 ADC ,单次转换,预分频为 128/ 启动首次转换/ 等待转结束循环/ 清除 ADIF 位/*获取 ADC 的采样值 */void ADC2INIT(void)ADMUX=0x42;ADC2ADCSRA=0x87;ADCSRA|=(1<<ADSC);while(!(ADCSRA&(1<<ADIF);ADCSRA|=(1

40、<<ADIF);int get_ADCdata(void)int a,b;a=b=0;b=ADCL;/ 读高位后数据更新a=ADCH;/ 再读取 ADCH 数据a=(a<<8);/ 右对齐,左移八位a=(a|b);/ 组成 10 位二进制数据return a;/*去头去尾,获取平均值 */float get_ave(int a8)float v;unsigned char i;float sum=0;for(i=1;i<7;i+) / 从第 2 次到第 6 次数据 sum=sum+ai;v=sum/6;return v;/*获取 ADC0 采样 8 次的平均值 *

41、/float get_ADC0data(void)unsigned char i=0;float v;int buf8=0;for(i=0;i<8;i+)/AD 初始化一次/ 将数据放入数组ADC0INIT(); bufi=get_ADCdata();v=get_ave(buf);return v;/*获取 ADC1 采样 8 次的平均值 */float get_ADC1data(void)unsigned char i=0;float v;int buf8=0;for(i=0;i<8;i+)/AD 初始化一次/ 将数据放入数组ADC1INIT(); bufi=get_ADCdata();v=get_ave(buf);return v;/*获取 ADC2 采样 8 次的平均值 */float get_ADC2data(void)unsigned char

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1