资源描述
开关电源模块并联供电系统设计
46
2020年4月19日
文档仅供参考
选 修 课 设 计 (论 文)
题 目 开关电源模块并联供电系统设计
专 业 电子信息工程
班 级 111 112班
姓 名 邓逸博 孙浙飞 汪超
指导教师 王章权
所在学院 信息学院
完成时间: 5月
开关电源模块并联供电系统设计
电子信息工程专业 邓逸博 孙浙飞 汪超
摘 要:本设计设计制作的是开关电源模块并联供电系统,能够广泛应用在小功率及各种电子设备领域,能够输出8V定压,功率可达到16W,并根据要求对两路电流进行按比例分配。本系统由DC/DC模块,均流、分流模块,保护电路组成。DC/DC模块以IRF9530芯片为开关,配以BUCK的外围电路实现24V-8V的降压与稳压。采用LM328比较电路实现电流和电压的检测,控制由DC/DC模块构成的并联供电系统均流与分流工作模式,经过比较器电路实现过流保护。同时进行LCD1602液晶同步显示、独立键盘输入控制。输入的值经过单片机处理程序来控制输出电压,且输出电压和电流可实时显示。
关键词: DC/DC模块,BUCK,电流分流
目 录
一、绪论 1
二、设计的目标与基本要求 1
(一)、设计目标 1
(二)、基本要求 2
三、系统设计 2
(一)、系统框图 2
(二)、硬件设计与方案选择 3
1、单片机选择 3
2、主电路选择 3
3、驱动电路图 4
4、辅助电源 5
5、电流、电压采样 6
6、显示、按键 7
(三)、软件设计 7
1、主程序 7
2、按键程序 8
3、液晶程序 9
4、采样程序 10
5、中断、PID流程图 11
四、调试过程 12
(一)、遇到的问题及解决办法 12
(二)、数据分析 13
五、体会与展望 14
参考文献 15
附 录 15
附录1.整体电路图 15
附录2.程序代码 16
一、绪论
分布式直流开关电源系统取代传统的集中式直流开关电源系统已成为大功率电源系统的发展方向:(1)单台大功率电源容易受技术、成本的限制;(2)单台直流开关电源故障会导致整个系统的故障,而分布式电源系统由若干电源模块并联组成,某个电源模块故障不会导致整个电源故障;(3)可根据实际负荷的变化,自动确定需要投入运行的模块数量或者解列退出的模块数量,对变负荷运行很有意义;(4)由于多个电源模块并联运行,使每个电源模块承受的电应力较小,具有较高的运行效率,且具有较好的动态和静态特性。分布式电源系统需要解决的主要问题是实现多个并联运行的模块输出相同的功率。随着通信电源技术的高速发展,电力电子设备与人们的工作、生活的关系日益密切,而通信电子设备都离不开可靠的电源。进入20世纪80年代,计算机电源全面实现了开关电源化,率先完成计算机的电源换代;进入20世纪90年代,开关电源相继进入各种电子、电气设备领域,程控交换机、通信、电力检测设备电源、控制设备电源等都已广泛使用了开关电源,更促进了开关电源技术的迅速发展。
二、设计的目标与基本要求
(一)、设计目标
设计并制作一个由两个额定输出功率均为16W的8V DC/DC模块构成的并联供电系统(见图2.1)
图2.1 两路buck电路并联供电
(二)、基本要求
(1)调整负载电阻至额定输出功率工作状态,供电系统的直流输出电压UO=8.0±0.4V。在额定输出功率工作状态下,供电系统的效率不低于60% 。
(2)调整负载电阻,保持输出电压UO=8.0±0.4V,使两个模块输出电流之和IO =1.0A且按I1:I2=1:1模式自动分配电流,调整负载电阻,保持输出电压 UO=8.0±0.4V,使两个模块输出电流之和IO =1.5A且按I1:I2= 1:2模式自动分配电流,每个模块输出电流的相对误差绝对值不大于5%。调整负载电阻,保持输出电压 UO=8.0±0.4V,使两个模块输出电流之和IO =4.0A且按 I1:I2=1:1 模式自动分配电流,每个模块的输出电流的相对误差的绝对值不大于2%。
(3)调整负载电阻,保持输出电压UO=8.0±0.4V,使负载电流IO在1.5~3.5A之间变化时,两个模块的输出电流可在(0.5~2.0)范围内按指定的比例自动分配,每个模块的输出电流相对误差的绝对值不大于2%。
(4)具有负载短路保护及自动恢复功能,保护阈值电流为 4.5A(调试时允许有±0.2A的偏差)。在额定输出功率工作状态下,进一步提高供电系统效率。
三、系统设计
(一)、系统框图
图3.1 系统框图
系统说明:以单片机为核心处理元件,DC-DC变换器为主电路。按键、显示便于人机交互。驱动电路将单片机和DC-DC变换器隔离,辅助电源给单片机和采样电路供电。单片机将电压电流经过采样电路,运放采样回来在内部进行A/D处理,然后将数据输出液晶显示。在内部进行算法调整。使整个系统稳定,并达到基本要求。整个系统设计如上图3.1所示。
(二)、硬件设计与方案选择
1、单片机选择
方案一:使用89C51单片机指令简单,易学易懂,外围电路简单,硬件设计方便,IO口操作简单,无方向寄存器,资源丰富,,价格便宜、容易购买,资料丰富容易查到,程序烧写简单,但要外接A/D、D/A芯片,来实现对整个供电系统的控制,需要占用较多的I/O接口,会使普通单片机承载过大的数据处理任务,功耗较大。
方案二:使用ATmega16,ATmega16外设特点:两个具有独立的预分频器和比较器功能的8位定时器/计数器,两个具有预分频器、比较功能和扑捉功能的16位定时器/计数器,具有独立预分频器的实时时钟计数器,两路8位PWM,4路分辨率可编程(2~16位)的PWM,输出比较调制器,8路10位ADC,面向字节的两线接口I^2C总线,两个可编程的串行USART,可工作于主机/从机模式的SPI串行接口,具有独立片内振荡器的的可编程看门狗定时器,片内模拟比较器。特殊的处理器特点:上电复位以及可编程的掉电检测,片内经过标定的RC振荡器,片内/片外中断源,6种睡眠模式,能够经过软件进行选择的时钟频率,经过熔丝位能够选择兼容模式,全局上拉禁止功能。
结合前两个方案优点,经过方案比较与论证,最终确定使用方案二,因为ATmega16速度快 自带PWM ,自带AD,而用89C51会使电路更加复杂与不稳定因此,用ATmega16单片机和其它控制器电路同实现整个系统的控制。
2、主电路选择
方案一:有一种型号为LM2956的降压开关电压调节器,能够输出3A的驱动电流,同时具有很好的线性和负载调节特性,该器件内部集成频率补偿和固定频率发生器,极大地简化了开关电源电路的设计。
方案二:采用SG3525自带脉宽调制电源芯片来设计DC-DC降压转换电路,SG3525简单可靠及使用方便灵活,输出驱动为推拉输出形式,增加了驱动能力;内部含有欠压锁定电路,死区时间可调、软启动控制电路、PWM锁存器,有过流保护功能,频率可调,同时能限制最大占空比。由此设计而成的电路易于实现脉宽调制,然而在真正使用时会发现,为得到要求的电压输出值,开关管S的参数选取相当不易。
方案三:将经过隔离变压器,整流滤波后得到的24VDC经过BUCK降压电路进行DC-DC转换,由ATmega16 单片机产生PWM控制其占空比,从而得到要求的直流电压。此方案仅用一块控制芯片不但能够实现对BUCK电路的控制,而且能够结合A/D和D/A对输出电压进行调整与显示。由于ATmega16 单片机自带能够产生脉宽调制所需的PWM信号的端口,在实际制作中用起来比较方便。ATmega16单片机自带8路10位A/D转换。
结合前两个方案优点,经过方案比较与论证,最终确定使用方案三如图3.2,因为ATmega16单片机,自带PWM模块,能够输出PWM方波控制电路,节约芯片成本,也可实现AD转换。用单片机和其它控制器电路同实现整个系统的控制。
3.2 主电路图
3、驱动电路图
方案一:单片机输出PWM,采用IR2101驱动DC-DC电路中的IRF9530,控制输出电压。
方案二:先采用光耦TLP250和单片机进行隔离,有效保护单片机,之后用IRF3205去驱动MOS管IRF9530,控制输出电压。
结合两种方案的对比选择方案二如图3.3,因为方案二中采用光耦,将单片机与主电路隔离,能够有效保护单片机,而且也能使正常使电路工作。
图3.3 驱动电路图
4、辅助电源
方案一:采用集成的三端稳压集成芯片,7815和7805分别给光耦和运放,还有单片机供电,7815内含过流,过热,过载保护电路。
方案二:采用LM2575开关稳压集成芯片,它内部集成了一个固定的振荡器,是一种高效的稳压芯片,大多数情况下无需加散热片。内部有完善的保护电路,包括电流限制及热关断电路等。它能够根据用户要求选择输出电压,可输出3.3V,5V,12V,15V。然后再经过7805产生5V电压。
结合两种方案的对比选择方案二如图3.4,因为方案二中的LM2575的是可调节输出电压的芯片,方便调控,而且它内部有电压基准比较,使输出的电压能够准确并稳定,比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位双向数据端引脚。具有微功耗、体积小、显示内容丰富、超薄轻巧的特点。用户能够对EN、RW、RS的数据进行编程,然后经过D0~D7输出显示数据。其引脚功能图见下表6.1
表6.1 1602引脚功能图
按键部分采用四个独立的按键,分别控制占空比的加和减,对输出的电压和电流进行控制,使输出能够达到期望的要求,其按键功能表如表6.2。
表6.2按键功能表
键名
S1
S2
S3
S4
功能
PWM1加0.2%
PWM1减0.2%
PWM2加0.2%
PWM2减0.2%
CPU端口号
PD0
PD1
PD2
PD3
(三)、软件设计
1、主程序
如图3.7为主程序流程图,一开始给系统各部分初始化,包括按键初始化,液晶初始化,PWM初始化,AD采样初始化,中断初始化,然后在进入大循环,在循环内进行数据的显示,包括当前输入的占空比为多少,当前采样回来的数字量和实际的电压值为多少。还有按键程序,和AD采样。同时每10毫秒进入定时器0中断进行调整。
图3.7主程序流程图
2、按键程序
按键程序流程图如图3.8所示。按键采用四个独立的按键,分别控制PWM1,PWM2的加和减,当有键按下时,扫描按键,然后进入判断。判断当前寄存器对应的值是否大于了设定的上限值,如果没有则数值加1,如果达到了则钳位在最大的上限值。然后返回数据。经过按键程序,能够控制占空比的调节。
图3.8按键程序流程图
3、液晶程序
图3.8为1602液晶屏的程序框图,1602由3个控制引脚,8位双向数据端引脚控制显示的内容和位置。因此,这部分程序主要有初始化函数,写命令函数和写数据函数组成。初始化函数主要对液晶屏的显示模式进行设定,写命令函数主要是对显示的位置和显示的方式进行设置,写数据函数是决定显示的内容。
图3.8 1602程序流程图
4、采样程序
如图3.9是采样程序流程图。一开始配置AD寄存器,然后启动AD寄存器,然后将采样回来的数据组合成10位的数据,然后采样8次,去头去尾后,对其求平均值。将数据处理后,给液晶显示。然后进行电压判断,是否小于要求的最小值,如果是的话进行钳位,然后是否小于设定的最大值,是的话,就是在要求范围内,那就进行PID算法的调整,进行电流的分流。如果大于最大值的话,就进行钳位。
图3.9 AD采样程序流程图
5、中断、PID流程图
如图3.10和3.11分别是中断流程图和PID算法程序流程图。定时器0中断定时10毫秒溢出中断,在中断中进行PID调整,和电压反馈调整。PID算法是根据公式,对采样电阻采样回来的电压进行反馈计算。根据对P,I,D三个参数的设置,然后结合算法公式,对输出的数据进行不断的调整,达到要求的值。
图3.10 定时器0中断 图3.11 PID算法流程图
四、调试过程
(一)、遇到的问题及解决办法
(1)、在对电路板进行设计,做板子的时候,经过封塑机出来后的板子,然后用腐蚀剂进行腐蚀,得到了一块单面板,当我们把器件焊上去的时候发现,跟我们预期的反了一下,所有的器件都反了一下,这样子,整个电路就不能用了。经过我们的讨论和思考,我们认为是我们在打印出油印纸的时候没有将它镜像,使整块板子就是按照反面的印了出来,经过我们镜像后,发现和我们所需要的板子是一样的了,所有的元器件都能按照原来的位置进行装配。而且板子也能正常工作。
(2)、在整个电路都做出来以后,进行模块调试的时候发现方波的波形并不是很好,有一点的曲线,经过老师上课的讲解指导了是,栅极旁边的电阻阻值太大,因为有分布电容,所有会充放电,使波形不是很理想。经过计算后选取了一个合适的阻值,使波形能够达到电路的要求。还有在整体调试的时候,发现上面一路的测试点,一直是0,下面一路一直是1A左右,经过主电路排查后,发现没有问题,然后对测试点进行排查,发现测试点的夹子松掉了,使电流都往下去了。将夹子焊好后,电路正常工作。
(3)、在进行程序调试的时候,一直在使用内部的1M晶振,因此一直精度上不去,调节都是很粗的调节,电流一直达不到指标。还有液晶刷新很慢,按键要按很久才能用。后来查阅了资料,发现在烧写程序的时候要勾上熔丝位,如果使用的是8M以上的外部晶振的话,那就要把熔丝位全部勾上。这样才是在使用外部的16M晶振。将熔丝位勾上后,调节程序后,发现精度大大的提升了。能够达到基本的要求。还有在对PID参数设置的时候,一开始没有头绪,随便调,后来看论坛和同学谈论,发现要一个一个参数的调,在经过多次实验后,将PID参数调整好了,是指标达到了要求。
(二)、数据分析
表4.1和表4.2是在电流1:1情况下,比例调节和PI调节的数据对比。
表4.1负载为8.9Ω, 两模块电流按1:1分配(比例反馈)
I1(A)
I2 (A)
I总 (A)
Uo(V)
给定值
0.5
0.5
1.0
8.0
测量值
0.505
0.515
1.002
8.24
绝对误差
1%
3%
0.2%
3%
表4.2负载为8.5Ω, 两模块电流按1:1分配(PI反馈)
I1(A)
I2 (A)
I总 (A)
Uo(V)
给定值
0.5
0.5
1.0
8.0
测量值
0.494
0.508
1.007
8.08
绝对误差
1.2%
1.7%
0.7%
1%
表4.3和表4.4是在电流1:2情况下,比例调节和PI调节的数据对比。
表4.3负载为7.0Ω,两模块电流按1:2分配情况(比例反馈)
I1(A)
I2 (A)
I总 (A)
Uo(V)
给定值
0.5
1.0
1.5
8.0
测量值
0.462
0.930
1.497
7.71
绝对误差
7.6%
7%
0.2%
3.6%
表4.4负载为5.9Ω,两模块电流按1:2分配情况(PI反馈)
I1(A)
I2 (A)
I总 (A)
Uo(V)
给定值
0.5
1.0
1.5
8.0
测量值
0.508
0.981
1.502
7.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算法在控制方面的优势,使整个系统更加完善。
五、体会与展望
经过这次选修课的学习,学到了专业知识方面的一些知识。整个学习的过程是很重要的。由于这个学期在学习《电力电子》这门课,而课题又正好和电力电子相关知识有关,因此对于这次的课程,经过对整个系统的设计,测试,调整。更好的了解了电力电子和开关电源相关的知识,也更深入的学习到了一些课堂上无法学习到的东西。将课堂的理论知识和实践想结合,将学习到的东西更加印象深刻,不用去死记硬背,能够灵活运用。对于编写程序,整体的逻辑性还要加强。流程图要写好再写程序。对于展望,希望能够在以后的学习中把硬件方面学的更好,能够把不足给弥补。在程序方面多学习一下别人的算法。学的更好,希望一次比一次有进步。
参考文献
[1] 程汉湘,武小梅.电力电子技术.第二版. 科学出版社.
[2] 谭浩强.C程序设计.第三版,北京:清华大学出版社, .11.
[3] 童诗白,华成英.模拟电子技术,第四版.北京:高等教育出版社, .5.
[4] 阎石.数字电子技术基础,第五版.北京:高等教育出版社, .5.
[5] 蒋燕君.自动控制原理.重庆大学出版社, .1
附 录
附录1.整体电路图
附录2.程序代码
//******************main.c*************//
#include<iom16v.h>
#include<macros.h>
#include"1602.h"
#include"key.h"
#include"ad.h"
#include"pid.h"
#define uchar unsigned char
#define uint unsigned int
#pragma interrupt_handler timer0_ovf_isr:10
//**********定时器0中断***********//
void timer0_init(void)
{
TCCR0 = 0x00; //停止定时器
TCNT0 = 0x64; //初始值,每10毫秒进一次中断
TIMSK = 0x01; //允许中断
SREG |= BIT(7); //允许全局中断
}
//***********外中断0函数**********//
void timer0_ovf_isr(void)
{
TCNT0 = 0x64;
pid1_calculating(); //PID调整OCR1A
pid2_calculating(); //PID调整OCR1B
com_vol(); //电压反馈
}
//*******PWM设置输出********//
void KPWM(void)
{
PORTD|=BIT(4)|BIT(5);
DDRD|=BIT(4)|BIT(5);
TCCR1A = 0xA2; //两路PWM,匹配清零
TCCR1B = 0x11; //相位修正PWM模式,位数可调,预分频1
ICR1 = 800; //此数为16位PWM,16M晶振,clk/(2*N*TOP),频率为10K
OCR1A = 255; //占空比31.8%
OCR1B = 255; //占空比31.8%
}
void main()
{
KPWM(); //PWM函数
LCD_init(); //1602初始化函数
key_init(); //按键初始化函数
timer0_init(); //定时器0初始化
adcport_init(); //AD端口初始化
while(1)
{
Display_PWM(); //显示PWM函数
press(); //按键函数
display_AD0(); //显示AD0的模拟量和数字量
}
}
//****************1602.h************//
#ifndef _1602_H_
#define _1602_H_
#define uchar unsigned char
#define uint unsigned int
void delay(uint 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:";
//*******延时函数*******//
void delay(uint MS) //约为1MS的延时函数
{
uint i,j;
for(i=0;i<MS;i++)
for(j=0;j<2282;j++); //2282是在16MHz晶振下为MS毫秒
}
//******1602写地址********//
void write_com(uint com)
{
PORTA&=~BIT(5); //RS=0
PORTA&=~BIT(6); //RW=0
PORTB=com; //送地址
delay(5);
PORTA|=BIT(7); //EN=1
delay(5);
PORTA&=~BIT(7); //EN=0
}
//******1602写数据********//
void write_dat(uint dat)
{
PORTA|=BIT(5); //RS=1
PORTA&=~BIT(6); //RW=0
PORTB=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); //设8位数据线,双行,5*7点阵
delay(5);
write_com(0X0c); //开显示,不显示光标
delay(5);
write_com(0X06); //输入地址自加,屏幕不移动
delay(5);
write_com(0X01); //清屏
delay(5);
}
//*******显示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%10; //将OCR1B十位拆分
xiaoshu1=OCR1B%10; //将OCR1B个位拆分
write_com(0x80);
for(i=0;tab[i]!='\0';i++)
{
write_dat(tab[i]);
}
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+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('%');
}
//*****************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 a[8]);
float get_ADC0data(void);
float get_ADC1data(void);
float get_ADC2data(void);
void display_AD0();
#endif
//**************AD.C***************//
#include<iom16v.h>
#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)
{
ADMUX=0x40; //AREF基准压,结果右对齐,通道为ADC0
ADCSRA=0x87; //使能ADC,单次转换,预分频为128
ADCSRA|=(1<<ADSC); //启动首次转换
while(!(ADCSRA&(1<<ADIF))); //等待转换结束
ADCSRA|=(1<<ADIF); //清除ADIF位
}
//******ADC1初始化********//
void ADC1INIT(void)
{
ADMUX=0x41; //AREF基准压,结果右对齐,通道为ADC1
ADCSRA=0x87; //使能ADC,单次转换,预分频为128
ADCSRA|=(1<<ADSC); //启动首次转换
while(!(ADCSRA&(1<<ADIF))); //等待转结束循环
ADCSRA|=(1<<ADIF); //清除ADIF位
}
//******ADC2初始化********//
void ADC2INIT(void)
{
ADMUX=0x42; //AREF基准压,结果右对齐,通道为ADC2
ADCSRA=0x87; //使能ADC,单次转换,预分频为128
ADCSRA|=(1<<ADSC); //启动首次转换
while(!(ADCSRA&(1<<ADIF))); //等待转结束循环
ADCSRA|=(1<<ADIF); //清除ADIF位
}
//*********获取ADC的采样值*********//
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 a[8])
{
float v;
unsigned char i;
float sum=0;
for(i=1;i<7;i++) //从第2次到第6次数据
{
sum=sum+a[i];
}
v=sum/6;
return v;
}
//********获取ADC0采样8次的平均值**********//
float get_ADC0data(void)
{
unsigned char i=0;
float v;
int buf[8]={0};
for(i=0;i<8;i++)
{
ADC0INIT(); //AD初始化一次
buf[i]=get_ADCdata(); //将数据放入数组
}
v=get_ave(buf);
return v;
}
//********获取ADC1采样8次的平均值**********//
float get_ADC1data(void)
{
unsigned char i=0;
float v;
int buf[8]={0};
for(i=0;i<8;i++)
{
ADC1INIT(); //AD初始化一次
buf[i]=get_ADCdata(); //将数据放入数组
}
v=get_ave(buf);
return v;
}
//********获取ADC2采样8次的平均值**********//
float get_ADC2data(void)
{
unsigned char i=0;
float v;
int buf[8]={0};
for(i=0;i<8;i++)
{
ADC2INIT(); //AD初始化一次
buf[i]=get_ADCdata(); //将数据放入数组
}
v=get_ave(buf);
return v;
}
//*********将数据拆分送显示*******//
void display_AD0()
{
int a,b;
uchar s[6],k[6];
uchar i,j,m;
a=get_ADC0data()*REF/1024*1000; //将数据转化为十进制
b=get_ADC0data(); //数字量
s[0]=a/1000+'0';
s[1]='.';
s[2]=a%1000/100+'0';
s[3]=a%100/10+'0';
s[4]=a%10+'0';
s[5]='V';
k[0]='D';
k[1]=':';
k[2]=b/1000+'0';
k[3]=b%1000/100+'0';
k[4]=b%100/10+'0';
k[5]=b%10+'0';
write_com(0xC0);
for(
展开阅读全文