找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 30244|回复: 17
收起左侧

单片机太阳能充电器设计文档

  [复制链接]
ID:140725 发表于 2017-3-16 01:50 | 显示全部楼层 |阅读模式
完整的太阳能充电器文档下载地址(word格式可编辑):
http://www.51hei.com/bbs/dpj-79109-1.html

下面是部分内容预览:
----------------------------------------------------------------------------------------
名称  基于单片机的太阳能充电器的设计            

随着环境保护意识的增强,寻求洁净能源的现实问题也日益显现出来。具有清洁可再生的太阳能已经越来越受到人们的关注。本文提出了一个基于单片机的太阳能充电器的设计,它不但能环保节能,还可以在没有电源充电时对手机进行应急充电。
喜欢外出或游玩的人通常会有手机没电的经历,提供充电的地方也不会到处都有,因此会出现手机因没有电无法正常使用的情况。本次设计介绍一种通过单片机控制的太阳能手机充电器,它能将太阳能通过电路变换成稳定的直流电从而给手机充电,还可以在电池充好电以后有自动停止充电的功能,并且能当作一般的直流电源,让我们减弱对市电的依靠,从而得到通信的自由。与传统的充电器对比,太阳能充电器的优势日益发挥出来。

目录
摘  要
Abstract
目录
1 绪论
1.1 本课题研究背景及现状
1.2 课题设计思想
1.3 文档结构
2 基于单片机的太阳能充电器系统总体方案设计
2.1 设计方案一
2.2 设计方案二
2.3基于单片机的太阳能充电器的设计的总体设计方案
3 基于单片机的太阳能充电器系统的硬件设计
3.1太阳能电池板的选用
3.2 LM7805稳压电路
3.3 充电主电路的设计
3.4 信号采集处理电路
3.6 单片机AT89C51介绍
3.7 单片机电路
3.7.1单片机复位电路
3.7.2 单片机时钟电路
3.7.3 单片机A/D转换电路
3.7.4按键电路
3.7.5数码管显示电路
3.8锂电池充电原理
4 基于单片机的太阳能充电器系统的软件设计
4.1 设计思想
4.2 基于单片机的太阳能充电器系统的整体程序设计
4.3 基于单片机的太阳能充电器系统的子程序的设计
4.3.1电路启动初始化
4.3.2按键采集程序
4.3.3数据采集及模数转换程序
4.3.4数码管显示子程序
4.3.5 充电子程序的设计
4.3.6电源子程序的设计
5 仿真与调试
5.1 充电电路仿真
5.2 电流采样处理电路仿真
5.3系统做直流电源使用时电路仿真图
5.4 系统做充电器使用时仿真结果
总结与展望
参考文献
附录A 整体电路图
附录B 整体程序
致谢

1 绪论
1.1 本课题研究背景及现状
当代社会随着一些不可再生资源如煤炭,石油等日益减少,使得各国社会经济越来越受能源问题的约制,因此许多国家开始逐渐的实行“阳光计划”,开发洁净的能源如太阳能,用以成为本国经济发展的新动力。
首先让我们想到的是太阳能电池,因为它不会消耗水,燃料等物质,并且不会释放任何对环境有污染的气体,是直接通过太阳光与材料的相互作用释放出电能,这种无污染资源对环境的保护有着相当重要的意义[1]。由于无公害的作用,目前世界太阳能电池产业已经出具规模,1995年到2004年的十年内平均年增长率达到30%以上。随着新型太阳能电池的涌现,以及传统硅电池的不断革新,新的概念已经开始在太阳能电池技术中显现,从某种意义上讲,预示着太阳能电池技术的发展趋势[2]。世界各国对光伏发电也越来越重视,目前全世界已超过一百个国家使用光伏发电系统,其中以欧洲为代表的发达国家为主,占总市场的80.1%,早在09年的时候,世界各国总的光伏新加装机容量接近800万千瓦,截至当年低,世界光伏装机容量总共接近2700万千瓦[3]。随着并网光伏发电市场的迅速发展,让它受到了世界各地的关注。
目前,太阳能电池的应用已经逐渐广泛得到推广,众所周知,沙漠地区由于气温特别高,因此最具有大规模开发太阳能的潜力,这使得沙漠等偏远地区对其的使用更加方便,并且能减低甚至节省昂贵的输电线路,从长远发展状况来看,随着改善太阳能电池制造技术和新的光 - 电转换装置发明,国家环保和清洁能源,光伏发电系统和太阳能发电的巨大需求恢复将继续利用太阳辐射能比较实用方法,这可以为人类以后能使用太阳能提供了广阔的开辟前景[4]。
当代社会太阳能手机充电器得到了一定的使用,它具有运用方便,环保,节能,格外使用于应急场合,高效率充电,性价比较高,让大家无论身处何处,都不会受到手机没电的困扰[5]。借此太阳能手机充电器的众多优点,因此提出本课题。
1.2 课题设计思想
基于单片机的太阳能充电器的设计是本次探导的课题。首先,由于太阳能电池板的电压会随太阳光的强度波动,强烈的太阳光的太阳能电池板的电压是高的数,当太阳光弱的强度,所述太阳能电池板的输出电压低时,从太阳能电池板的输出到稳定的电压[6]。本设计采用了稳压器LM7805 , LM7805输出端口可以输出稳定的5V电压,因为电力可以用于单芯片和其它芯片,其次,作为下一个电源电压转换电路。第二,考虑到电池的充电过程的电压要求各不相同,不能简单稳定的直流输出,因此提出了利用DC / DC转换器电路的,通过控制关断时间的占空比,以调节输出电压。 SCM是控制中心,在控制信号产生电路是由充电过程的一个外部状态产生的,外部充电电压的比较信号和充电电流与理想充电过程中,占空比调节。单个微控制器设计用于该目的,所述电压检测电路和一个电流检测电路,并且为了方便用户知道系统的状态,设计设置在显示模块和指标。
1.3 文档结构
    本文档第一部分介绍了当前的形势和太阳能电池和太阳能光伏发电系统,本研究的背景,并提出了设计思路的发展前景;第二部分论述整个系统的设计方案;第三部分介绍了系统的硬件电路设计;第四部分进行了系统软件设计;第五部分进行了系统仿真分析;第六部分分析了该设计的成果和前景。

基于单片机的太阳能充电器系统总体方案设计
2.1 设计方案一
方案一方框图如图2.1所示

1.003.jpg
图2.1方案一方框图
该程序使用的DC / DC转换电路,将太阳能电池板输出的电压变换为需要的电压值给手机电池充电,同时单片机可以控制电路变换,还可采用按键设定某些值,有显示部分,可以设定为显示电路状态。可以从该图中的框图中可以看出,该程序能够控制DC / DC变换器电路,显示模块,但该程序是没有实时检测的外部电路,而不是用DC / DC实时控制根据外部电路的条件转换电路。
2.2 设计方案二
借于方案一存在的缺点,所以在此提出第二种方案,方案二方框图如下图2.2。
1.004.jpg
图2.2 方案二方框图
如从图2可以看出,以弥补设计用于检测电路的状态的方案的缺点,并通过模拟转换到数字的转换模块的信号到微控制器。 PWM控制芯片微控制器可以产生施加PWM波转换电路的控制主要模块和显示模块,但此次方案是将生成PWM部分用芯片替换,这使得电路复杂硬件部分的设计,它是更好地使用软件允许硬件电路简单,而且还能充分利用单片机的功能。
2.3基于单片机的太阳能充电器的设计的总体设计方案
综合以上两种方案提出本次设计的整体设计框图如下图2.3所示。
1.005.jpg
图2.3 整体设计框图   
相对于前两种方案,此整体方案显示的优点,不仅能对充电电路进行检测,单片机还可以根据充电电路的关键电路的信号处理后的分析来检测的情况进行控制可以选择系统可以实现功能。显示电路可以显示用于实现本方案的电路中,PWM控制信号的工作状态,从而使硬件电路非常简单,节省资源,提高系统的性能。

3 基于单片机的太阳能充电器系统的硬件设计3.1太阳能电池板的选用
太阳能电池板是通过吸收太阳光,将太阳辐射能通过光电效应或者光化学效应直接或间接转换成电能的装置,大部分太阳能电池板的主要材料为“硅”,但因制作成本很大,以致于它还不能被大量广泛和普遍地使用。硅太阳能电池分为晶体硅电池板,非晶硅电池板等几种。单晶硅太阳能电池的光电转换效率为15%左右,最高通常可以达到24%,它是所有种类的太阳能电池中光电转换效率最高的,但制作成本很大,以致于它还不能被普遍地使用,因为单晶硅通常会用钢化玻璃和防水树脂包装起来,所以会十分耐用,通常能用十几年,最长可以用25年。多晶硅太阳电池的制作过程与单晶的差不多,可相对而言起光电转换效率要比单晶降低很多,其效率大概在12%左右 (其中世界上最高的多晶硅转换效率为14.8%)[7]。但如果我们从制作费用上来讲,多晶硅的由于制造简单,节能节电,因此其生产费用就会降低不少,从而得到了一定的发展。另外,其使用年限没有单晶硅太阳能电池那么长。如果从性价比来说,自然是单晶硅太阳能电池还略好。接下来我们说下非晶硅太阳电池,它是1976年出现的新型薄膜式太阳电池,其制造过程得到了很多简化,对硅材料的使用很少,电耗也更低,它突出的优点是在很多情况下都能发电包括弱光时候。但它也有一定的问题,就是光电转换效率相对而言偏低,就算国际上的先进水平也只大约在10%,不够稳定,时间越久,其转换效率会衰减。
根据所需要的不同数目的太阳能电池,其转换效率是通过光,温度和结晶型太阳能电池的制造工艺和其他因素的影响,2010年中国平均效率接近为18%,一般的太阳能电池电压有很多种,其主要用于太阳能发电。
太阳能电池板的太阳能发电系统是其工作的基础,是充电器的第一部分,其功能是将太阳光转为电能,如今更多种类型的便携式数字设备,电压和电流范围所需的输入功率较大的器件,面积较大,必须使用太阳能电池板,这给了携带不便。因此,模块化设计的组合,可根据不同的负载充电需求,太阳能电池板组合起来以实现一组光伏电池在某个期望的输出功率和输出电压。本文通过一些常用的小功率设备例如手机,来讲解太阳能充电器设计的过程。
3.2 LM7805稳压电路
由于太阳能电池板的电压会随太阳光的强度波动,强烈的太阳光会使太阳能电池板的电压变高,当太阳光强度变弱时,自然会使电池板输出电压变低。为了获得到稳定的输出,本设计应用稳压管LM7805,其输出口能输出稳定的所需要电压(5V),以便能保持稳定的输出电压。典型LM7805的应用电路图如图3.1所示。

1.006.jpg

图3.1 LM7805稳压电路图
图中C4、C7的是用于清除因长期连接时由于电感效应产生的自激振荡,降低了纹波电压,在其输出端接上电容C6、C5的作用是清除电路高频产生的噪声,以便提高所用负载的瞬态响应。一般来说电容的耐压性都会比电源输入、输出电压要强。此外,在稳压器输入、输出端之间加上二极管,可以避免对稳压器的破坏,从而实现对LM7805的保护。
LM7805输入电压在7V至37V之间,其最大工作电流可达1.5A,且拥有电路精简,电流输出高,运行工作稳定,即使电压不稳定,也能使太阳能电池拥有不变的输出电压(5V),最后能让单片机控制的电路正常稳定的运行,并且性价比高,不需要消耗多余的材料。
3.3 充电主电路的设计
充电主电路图如图3.2所示。

1.007.jpg

图3.2电池充电电路图
DC/DC变换是将直流电能(DC)转换成另一种固定电压或电压可调的直流电能,又可称成直流斩波[8]。若其输出电压较输入之电源电压低,则称为降压式(Buck )直流斩波器即频率调制(1)Buck电路,若其输出电压较输入之电源电压高,则称为升压式(Boost)直流斩波器。主电路核心由图可以看出,主要由三部分组成即电感L1,三极管区和续流二极管D1,其也就形成了一个完整的BUCK降压DC/DC转换电路;上图Q2是具有将PWM信号打开变大,从而到达驱动Q1开关管的功能。
3.4 信号采集处理电路
为了使锂电池能完成安全充电,本设计的电流取样处理电路图如下图3.3所示
1.008.jpg

图3.3电流取样处理电路图

电池电压与单片机A/D接口相连,通过A/D转换和微控制器即单片机,以获得测量的电压值得到计算处理。此次充电电流通过0.1Ω的取样电阻,产生的电压再使用LM358,将电流取样电压放大相应的倍数后输到单片机A/D接口进行采集。电压检测输出电压直接进行模数转换之后被发送到A/D输入接口的单片机进行处理。
3.5 单片机选型
单片机型号众多,但大家熟悉了解的就那么几种类型。我们在学校接触到的也就是C51系列,C51是51单片机C语言程序设计的简称,由于接触到的单片机以型号为AT开头的为多,所以选用了型号是AT89C51为此次设计的单片机。
3.6 单片机AT89C51介绍
AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机[9]。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪速存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。AT89C51单片机引脚图如下图3.4所示。
1.009.jpg
图3.4 单片机引脚图
以下为其引脚功能及作用
VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须接上拉电阻。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为低八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
口管脚 备选功能
P3.0 RXD(串行输入口)
P3.1 TXD(串行输出口)
P3.2 /INT0(外部中断0)
P3.3 /INT1(外部中断1)
P3.4 T0(计时器0外部输入)
P3.5 T1计时器1外部输入)
P3.6 /WR(外部数据存储器写选通)
P3.7 /RD外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的低位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。
3.7 单片机电路3.7.1单片机复位电路
单片机复位电路图如图3.5所示。
1.010.jpg
图3.5复位电路图
当系统正常工作时,由于上图使用的是按键复位,当电源给电容充电的过程中,会使电容存储的电能增加,致使单片机复位端电平减低,这时候得人为的按下键,才能使电平变高,单片机收集到信号后就会自动复位。
3.7.2 单片机时钟电路
单片机可作为驱动时钟定时逻辑电路,在其工作过程中可以看出,所有的工作都是在时钟信号的控制下进行的,当执行一个指令事,CPU控制器必须发出一系列特定的控制信号。单片机时钟电路图如图3.6所示
1.011.jpg
图3.6单片机时钟电路图
3.7.3 单片机A/D转换电路
ADC0809是8位的采样分辨率,以模拟数字转换的逐次逼近原理。ADC0809由一个8通道模拟开关,地址锁存器,解码器, A/D转换器。内部有一个8通道多路复用器,它能根据信号的地址锁存译码后,门控8模拟输入信号的A/D转换。多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器转换。数字锁存器的A/D转换完成三态输出锁存器,当OE端为高电平,可以从三态输出锁存器的数据转换。A/D转换的数据要发送数据后,应该传给单片机进行处理。关键的问题是如何确定数据的A/D转换完成转移,因为只有确认完成后,可以发送。A/D转换电路图如图3.7所示
1.012.jpg
     图3.7 A/D电路图
ADC0809的引脚功能及作用
IN0~IN7:8路模拟量输入端。
2-1~2-8:8位数字量输出端。
ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路。
ALE:地址锁存允许信号,输入端,高电平有效。
START: A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。
EOC: A/D转换结束信号,输出端,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
OE:数据输出允许信号,输入端,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
CLK:时钟脉冲输入端。要求时钟频率不高于640KHz。
REF(+)、REF(-):基准电压。
Vcc:电源(+5V)。
GND:接地。
3.7.4按键电路
按照键盘与单片机的连接方式分为独立式键盘和矩阵式键盘[11]。独立式键盘相互独立,每个按键占用一根I/O口线,每根I/O口线上的按键工作状态对其他按键的工作状态不会产生不好作用。这种按键软件程序简单,但占用I/O口线较多(一根口线只能接一个键),适用于键盘应用数量较少的系统中。矩阵式键盘又称行列式键盘,与独立式键盘对比,单片机口线资源利用率提高了一倍。
按键接线图如图3.8所示。

1.013.jpg
图3.8按键电路图

键盘抖动的时间一般为5~10ms,抖动现象会引起CPU对一次键操作进行多次处理,从而可能产生错误,因而必须设法消除抖动的不良后果。通过去抖动处理,可以得到按键闭合与断开的稳定状态。为了准确判断闭合键的位置,要对每个按键进行编码。根据矩阵式键盘的结构,采用行扫描的键位识别方法。使某条列线为低电平,如果这条列线上没有闭合键,则各行线的状态都为高电平;如果列线上有键闭合,则相应的那条行线即变为低电平。于是就可以根据行线号与列线号计算出闭合键的键码。扫描时由第一列开始,即由PA口先输出0FEH,然后由PC口输入行线状态,判断哪一行有键闭合,若无键闭合,再输出0FDH检测下一列各行键闭合状态,由此一直扫描下去。
在这个设计中,按键的数量设置为3,它们中的一个作为一个复位按钮;另一个作为电压按键,这样的设计提供3V,3.5V,4.0V,4.5V为周期的四个电压值,可以“电压选择”键选择一个电压输出;另一个开始充电,装上一个电池为电池充电,当按下“开始充电”按钮,系统开始为锂电池充电。因此,使用一个独立的密钥的方法,它可以减少编程的难度。
3.7.5数码管显示电路
LED数码管组成的多个发光二极管打包在一起,以形成“8”字状的装置中,连接导线已在内部做好,只要能导致它们导出各自的笔划,公共电极。
数码管显示电路图如图3.9所示
1.014.jpg

图3.9 数码管显示电路图

本设计使用四位LED数码管数码管段加小数点为7或8个数码管,数码管有两种阴阳,本设计采用共阴极数码管,8段LED阴极接地连接在一起,阳极当某一高电平时,二极管被点亮而发光,设计时允许数码管阳极的某一组合被设置高。
3.8锂电池充电原理
锂电池充电的工作原理就是指其充放电原理。充电时锂离子由正极向负极运动而嵌入石墨层中。放电时,锂离子从石墨晶体内负极表面脱离移向正极。所以,在该电池充放电过程中锂总是以锂离子形态出现,而不是以金属锂的形态出现。一般而言电池容量指的就是放电容量。可以看到,锂电池在充放电的过程中,锂离子是存在于正极 → 负极 → 正极的运动状态。如果我们把锂电池形象地比喻为一把摇椅,摇椅的两端为电池的两极,而锂离子就象优秀的运动健将,在摇椅的两端来回奔跑。
锂蓄电池的充电特性曲线图如图3.10所示:

1.015.jpg
图3.10锂电池充电特性曲线图
为保证安全充电,对锂离子电池充电要求首先是在充电时保持电流不变,电池电压会在充电过程中渐渐升高,当电池端电压达到4.2V(4.1V),会改变充电状态,即变化为电压不变的恒压充电。电流会依照电芯的饱和程度,随着充电过程的渐渐降低,当降低到0.01CA时,认为充电终止。大家注意,其中C是以电池标称容量对照电流的一种表示方法,如电池是1000mAh的容量,1C就是充电电流1000mA,注意是mA而不是mAh,0.01CA就是10mA。当然,规范的表示方式是0.01C5A。



4 基于单片机的太阳能充电器系统的软件设4.1 设计思
首先主程序由初始化段和循环主体段两部分组成,在执行循环体时,需要一个个的调用所需的任务模块,不会直接去执行程序,其中每一个任务为一个子函数,这种机制也叫称为轮询机制。举个例子说明:就是当一个正在被主程序执行的子函数,它会自动确认其执行条件有无可行性,如果可以就执行,反之,就会返回。按键处理是以10ms为周期的选择一次。PWM的控制调节不能过快,最好以200ms为周期,如果太快,会影响到数码管刷屏,A/D采样速度也是一样。
子程序主要由4部分组成,包括初始化程序,PWM波程序,按键采集程序,信号采集与转换程序;如果从系统表现出的功能来看,又可以分成充电子程序、电源子程序,这两程序都会用到子程序的4个程序。
本次设计使用的PWM波是可以掌控开关管的占空比,它的生成是运用了输出在低电平和高电平的转换、延时。即当输出为低电平时,将输出信号放大驱动开关管断开,反之,如果其为高电平时,开关管则会打开。开关管的占空比是通过低电平和高电平的时间的比值(即PWM波的占空比)来控制。
本设计单片机采用AT89C51芯片,由于其内部没有AD转换模块,单片机需外接转换模块,本设计采用ADC0809,模拟信号输入有两路,一路是电压信号,一路是电流信号。ADC0809 在对多路输入的模拟量进行模数转换时采用分时复用的方法,即AD转换器对两路信号轮换采集转换。轮换周期根据模数转换时间和控制的情况设定。

4.2 基于单片机的太阳能充电器系统的整体程序设计            
本设计由单片机程序控制来实现整体工作,其工作过程主要为:电路启动初始化,电路功能的选择,输出选择及确定输出,单片机集合计算输出PWM信号,定时采集数据及处理调节PWM信号占空比等,程序整体框架图如下图4.1所示。

1.016.jpg

图4.1 程序整体框架流程图
4.3 基于单片机的太阳能充电器系统的子程序的设计4.3.1电路启动初始化
初始化设置初始运行环境为单片机运行,主要完成以下任务:清理片内RAM,每一个微控制器上电,上电复位将导致单片机操作。在复位操作完成后,单芯片寄存器将被设置为不同的值,该值的一个相当大的部分是未知的。在微控制器的复位完成这些未知的值,正式工作后,会产生不能让程序员掌握的后果,甚至会损坏系统。因此,微控制器运行后,先设置为0,这样的初始参数设置,方便编程人员掌握,以方便系统的工作。设置系统运行所需的参数,设置定时器和中断设置。
初始化程序流程图如下图4.2所示。
1.017.jpg
图4.2 初始化程序流程图
4.3.2按键采集程序
键盘子程序用于检测开关,是否在有效的开关状态来决定是否启动系统运行。读线、读取、连接到该端口,它的值存储处理后确定相关的缓存。看完端口在其中做了一定的延迟,以排除引起的误动作键晃动。按键子程序结构流程图如图4.3所示。
1.018.jpg
图4.3按键子程序结构流程图
4.3.3数据采集及模数转换程序
数据收集主要是由单片机控制ADC0809来完成,该方案分为数据初始化,发送一个命令到开始转换,等待转换结束,接收数据,处理且存储在缓存中,程序流程如图4.4所示。
1.019.jpg

图4.4 数据采集子程序结构流程图
4.3.4数码管显示子程序
开机时,先让数码管初始化,通过串口为“0”字形码输出使数码管显示“O”。然后来确认按键是否被按下,如果没有键被按下继续确认。
显示子程序时要先初始化串口,以致串口工作会显示在方式0,以便读取显示缓冲区的数据(其用来存储数据也就是将被显示出来的数据),然后找到通过字形码查表相应的方式,再将字形码写入串口寄存器SBUF通过串口方式0发送出去显示。子程序是如何显示在缓冲区中的数据转换成相应的字形码呢?具体方法是,从小型字形码到每一位十六进制数到大的顺序固定区域,以便存储在表单中显示出来码表的记忆。当要显示的字符,该表的起始地址到数据指针DPTR寄存器为基地,在显示缓冲区中的数据作为偏移到索引寄存器A,查表“MOVCA,@ A + DPTR“,在取出相应数字的字形码其是通过累加器A得到的结果。

4.3.5 充电子程序的设计
充电过程分两阶段进行,第一阶段为预充电,充电电流以0.01CA的小电流进行充电;第二阶段,当充电电压达到3V时转入第二阶段(一般认为三分钟后电池电压大于3V),以0.5CA的电流进行恒流充电方式,。电流降到小于0.01CA时,表明电池已充到额定容量,如果继续充下去,充电电流会慢慢降低到零,电池完全充满[4]。充电过程中,“充电”指示灯亮;充满时,“充饱”指示灯亮,“充电”指示灯灭,通过按键设置可控制充电时间。充电子程序流程图如图4. 5所示。
1.020.jpg
图4.5 充电子程序图
4.3.6电源子程序的设计            
与传统的手机充电器相比,本次设计的太阳能手机充电器最大的优点是不仅能够为电池直接充电,也可用作一般直流电源。该系统存在并且可以有3V,3.5V,4V,4.5V四种电压输出,这可以用来选择一个按钮作为输出电压。直流输出可直接给手机充电,或作为电源等小型电子设备,如MP4。输出电压可以是一个数字显示,以及完善一个过流保护作用,以确保能安全使用的电子产品。
电源程序流程图如图4.6所示。


1.021.jpg 1.022.jpg
图4.6 电源子程序结构流程图



5
仿真与调试
5.1 充电电路仿真
总所周知buck斩波电路中调整输出电压值的变化是由控制开关管开通与关断时间控制, multisim仿真电路如下图5.1所示
1.023.jpg

              图5.1电压检测仿真图
5.2 电流采样处理电路仿真
上面提出将电流采样电压是采用LM358电路让其放大到相应倍后再输送到单片机的A/D接口,输入的电压是5V时,输出时的电压则为125V,这样就能看出其电路所具有放大多少倍(计算可得21倍)的功能。如下图5.2所示
1.024.jpg
图5.2电流采样处理电路仿真图

5.3系统做直流电源使用时电路仿真图
Protues软件因为不存在太阳能电池模拟模块,所以在仿真时我们把稳压输出电压值用直流电源电压为5V的来更换,当数字到达3时,表示充电已经完成。按复位键会显示0,点开始键表示开始充电。整体电路仿真图如下图5.4所示

1.025.jpg

图5.3 整体电路仿真图
5.4 系统做充电器使用时仿真结果
充电器在运行过程中它会随着充电的进行,充电电压会渐渐升高,指示灯会从0逐渐变成3,此过程可表示充电从开始到结束。仿真结果如下图5.4、5.5、5.6所示。
1.026.jpg

图5.4 充电过程仿真

1.027.jpg
图5.5 充电过程仿真

1.028.jpg

图5.6 充电过程仿真

总结与展望
时光飞逝,离开大学的日子也渐渐向我们走来,随之而来的设计也即将完成。通过一段时间的努力,我的设计的任务终于结束了。设计是对我们整个大学期间学习的一次总结性的检验,通过设计的过程能检验我们大学期间的基础理论学习是否扎实,各种知识间的结合是否灵活,能否严格,全面,系统的结合所学的知识解决实际的问题。经过此次设计,我才明白学习是一个长期积累的过程,在以后的工作、生活中都应该不断的学习,努力提高自己知识和综合素质。根据本次设计方案,我设计了一个由单片机控制的充电器,在充电过程中我们会看到方形波带宽会逐渐变宽,并且会显示出“1”,“2”,“3”数字,在充电完成后波形消失,显示成一条直线,我设置了一个复位键,当我按下键时,它会重新充电。
本次设计能初步完成以上功能,但设计不足之处很多。主要表现在以下几点:第一、本此设计显示模块采用了数码管,不如采用液晶显示,硬件电路简单,能省去一些I/O口来实现更多的功能。第二,没有采用温度检测,一般快速充电电流会比较大,在不超过允许充电电流的情况下,电池温度也会升高,若能加温度监测模块,当温度超过允许值时,终止充电会减少因温度过高给电池带来的危害。第三、没有采用电能存储装置,不能存储电能备天气状况不好并且没有市电的情况使用,若有电能存储功能,可以将系统闲置时太阳能电池板转化的电能存储起来,作为电源给别的用电设备使用,这样可以即方便又节能环保。能源的日益紧张,太阳能电池板、充放电控制器、蓄电池等构成的产品都有了相对成熟的发展,相信不久之后太阳能手机充电器的应用将会变得普遍[9]。

参考文献
[1] 蒋鸿飞,胡淑婷.绿色能源—太阳能充电器[J].上海应用技术学院学报(自然科学版),2007,21(2):147-149
[2] 张军军,孙佩石,梁海涛. 智能化小区 LED 路灯光伏充电器的设计[J]. 电源技术,2007,32(2):88-91
[3] 滨川圭弘.太阳能光伏电池及其应用[M]. 北京:科学出版社,2008,33(3):203-205
[4] 陈维,沈辉,王东海等. 太阳能半导体照明驱动技术研究[J]. 照明工程学报,2005,44(1):156-158
[5] 张红梅,尹云华. 太阳能电池的研究现状与发展趋势[J]. 水电能源科学,2008,26(6):193-197
[6] 蔡朝洋. 单片机控制实习与专题制作[M].北京航空航天大学出版社,2006,18(1):135-138
[7] 李朝青.单片机原理及接口技术[M].北京航空航天大学出版社,2005,29(2):77-79
[8] 沈德金等.接口电路与实用程序实例[M].北京:北京大学出版社, 2003,47(2):112-113
[9] 康华光. 电子技术基础 (模拟部分) [M]. 北京:高等教育出版社,2000,21(4):97-99
[10] 孙超.一种独立光伏系统设计的新方法[M].太阳能学报,1995,23(2):66-69
[11] X.S.Cai.Renewable Energies,Present&Future(J):Advanced Technology of Electrical Engineering and Energy,2005,24,(1):69~75
[12] Yaoui,R K et al. Conf. Rec.IEEE Photo.Spec. Conf.(M)8 th,Seattle,P.110 1970
[13] Huang S J and Pai F S. Design and operation of grid-connected photovoltaic system with power-factor control and active islanding detection Generation, Transmission and Distribution(J):IEE prceedings-Vol 148, 2001,36(4):243~250
[14] Shimizu T, Hirakata M, Kamezawa T, Watanabe H. Generation control circuit for photovoltaic modules.(J) IEEE trans. On power electronics,2001,16(3):293~300

附录A 整体电路图
1.029.jpg


致谢
在此要感谢我的指导老师周建华对我悉心的指导,感谢老师给我的帮助。在设计过程中,我通过查阅大量有关资料,与同学交流经验和自学,不断向老师问问题,老师也非常细心仔细的教导我。这使自己学到了不少知识,自然会经历了不少艰辛,但收获同样巨大。在整设计中让我收获颇多,不仅培养了我独立工作的能力,也树立了对自己一些能力的信心,相信会对今后的学习工作生活有非常重要的帮助。这也提高了动手的能力,使我充分体会到了在创造过程中探索的艰难和成功时的喜悦。总之,此次毕业的顺利完成,我由衷的感谢大家对我的帮助与支持。

源程序:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4.   sbit   P3_3=P3^3;              //开始充电
  5.   sbit   P3_4=P3^4;              //电压切换
  6.   sbit   PWM=P3^5;
  7.   sbit EOC=P3^1;                                          //定义ADC0808的控制引脚/
  8.   sbit OE=P3^0;
  9.   sbit START=P3^2;
  10.   sbit P3_6=P3^6;
  11.   sbit P3_7=P3^7;
  12.   sbit wela=P2^1;
  13.   sbit dula=P2^0;
  14.   uchar   time=0,time1=0;  
  15.   uchar   period=40;  
  16.   uchar   high=6,high1=12;
  17.   uchar   th0=0;
  18.   uchar   tl0=1;
  19.   uchar   i=0,j=0;
  20.   uint x,z,n;
  21.   uchar code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  22.   //uchar   n=0;
  23.   //uchar flag1;
  24.   //unsigned char volatile g_delay_count;
  25.   uchar disp[4]={0,0,0,0};  //显示数据,保存段码,四位/
  26. //================================/
  27. void delay(uchar z)                            //100us延时子程序/
  28. {

  29. while(z--);
  30. }
  31. //==============================/
  32. void display()                            //定义显示子函数/ 可以使用锁存器实现
  33. {
  34. for(n=0;n<4;n++)
  35. {
  36. P0=0x00;
  37. dula=1;
  38. P0 =disp[1];       //显示第一位小数
  39. dula=0;            
  40. wela=1;
  41. P0=0xfb;
  42. wela=0;
  43. delay(2);
  44. P0=0x00;
  45. dula=1;
  46. P0=disp[2];  //显示第二位小数
  47. dula=0;            
  48. wela=1;
  49. P0=0xfd;                                                      
  50. wela=0;
  51. delay(2);
  52. P0=0x00;
  53. dula=1;
  54. P0 =disp[3];       //显示第三位小数
  55. dula=0;            
  56. wela=1;
  57. P0=0xfe;
  58. wela=0;

  59. delay(2);
  60. P0=0x00;
  61. dula=1;
  62. P0 =disp[0]+0x80;      
  63. dula=0;            
  64. wela=1;
  65. P0=0xf7;
  66. wela=0;

  67. delay(2);
  68. }
  69. }
  70. //===============================/
  71. uint ADC0808()                              //定义ADC0808读入数据子函数,并通过函数返回/
  72. {
  73. uchar d ;
  74. uchar value;
  75. START=1;START=0;  //启动ADC0808,开始A/D转换/
  76. while(!EOC);                                          //等待ADC0808,转换结束,即EOC为高电平/
  77. OE=1;
  78. if(time1<high1)
  79. {d=P1;                                                                      //读入数据/
  80. if(high1==16)
  81. {
  82.               value=0.4*d;
  83. }
  84.   else if(high1==20)
  85. {
  86.               value=0.5*d;
  87. }
  88.   else if(high1==24)
  89. {
  90.               value=0.6*d;
  91.   }
  92.   else if(high1==28)
  93. {
  94.               value=0.7*d;
  95.   }
  96.     else if(high1==32)
  97. {
  98.               value=0.8*d;
  99.   }
  100.     else if(high1==36)
  101. {
  102.               value=0.9*d;
  103.   }
  104. }                                                                      //允许ADC0808输出数据  /
  105. if(time<high)
  106. {d=P1;                                                                      //读入数据/
  107. if(high==8)
  108. {
  109.               value=0.2*d;
  110. }
  111.   else if(high==10)
  112. {
  113.               value=0.25*d;
  114.   }
  115. else if(high==12)
  116. {
  117.               value=0.3*d;
  118.   }
  119. else if(high==14)
  120. {
  121.               value=0.35*d;
  122.   }
  123. else if(high==16)
  124. {
  125.               value=0.4*d;
  126.   }
  127. else if(high==18)
  128. {
  129.               value=0.45*d;
  130.   }
  131. else if(high==20)
  132. {
  133.               value=0.5*d;
  134.   }
  135. else if(high==22)
  136. {
  137.               value=0.55*d;
  138.   }
  139. else if(high==24)
  140. {
  141.               value=0.6*d;
  142.   }
  143.    else if(high==26)
  144. {
  145.               value=0.65*d;
  146.   }
  147. else if(high==28)
  148. {
  149.               value=0.7*d;
  150.   }
  151. else if(high==30)
  152. {
  153.               value=0.75*d;
  154.   }
  155. else if(high==32)
  156. {
  157.               value=0.75*d;
  158.   }
  159. else if(high==34)
  160. {
  161.               value=0.8*d;
  162.   }
  163. else if(high==36)
  164. {
  165.               value=0.85*d;
  166.   }
  167. }
  168. OE=0;                                                                         //禁止ADC0808数据输出/
  169. return value;                                                           //返回A/D转换数据/
  170. }            
  171. //=================================/
  172. void convert(uint x)              //定义显示码转换子函数/
  173. {
  174. uchar code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};              //定义0~9显示码/
  175. x=x*1.0/255*5000;                                          //              处理数据使其在0~5v范围内/
  176. disp[3]=dispcode[x%10];              //第三位小数,最低位/
  177. disp[2]=dispcode[x/10%10];              //第二位小数/
  178. disp[1]=dispcode[x/100%10];   //第一位小数/
  179. disp[0]=dispcode[x/1000];                //整数部分/
  180. }   
  181.   void   timer0()   interrupt   1   using   1  
  182.   {  
  183.             TH0=0xff;     /*定时器初值重装载*/  
  184.             TL0=0xf6;           
  185.             time++;
  186.                                           if(time==high)   /*高电平持续时间结束,变低*/  
  187.                                           {  PWM=th0;                              /*经过反相器反相*/
  188.                                                         }                                                           
  189.             else   if(time==period)     /*周期时间到,变高*/  
  190.                 {   time=0;  
  191.                     PWM=tl0;              /*经过反相器反相*/            
  192.                 }
  193.                     }
  194.   void   timer1()   interrupt   3   using   3  
  195.   {  
  196.             TH1=0xff;     /*定时器初值重装载*/  
  197.             TL1=0xf6;           
  198.             time1++;
  199.                                           if(time1==high1)   /*高电平持续时间结束,变低*/  
  200.                                                    
  201.                                              {  PWM=th0;                              /*经过反相器反相*/
  202.                                                         }                                                           
  203.             else   if(time1==period)     /*周期时间到,变高*/  
  204.                 {   time1=0;  
  205.                     PWM=tl0;              /*经过反相器反相*/            
  206.                 }
  207.                     }
  208. void main()  
  209.   {  
  210.         OE=0;                                             //ADC0808初始化/
  211.                   START=0;
  212.                             EOC=1;                                          //将单片机的引脚(EOC输入端)置成输入状态/
  213.                             P3_3=0;
  214.                   P3_4=0;
  215.         P3_6=1;
  216.                             P3_7=1;
  217.         TMOD=0x11;   /*定时器0方式1*/  
  218.         TH0=0xff;     /*定时器装载初值,设置脉冲信号的占空比为1/5*/  
  219.         TL0=0xf6;
  220.                             ET0=1;
  221. //                            TR0=1;
  222.       TH1=0xff;     /*定时器装载初值,设置脉冲信号的占空比为1/5*/  
  223.         TL1=0xf6;
  224.                             ET1=1;
  225. //                            TR1=1;
  226.         while(1)   
  227.         {                                          
  228.                                           if(P3_3==1)
  229.                                {
  230.                                   EA=1;  /*开CPU中断*/
  231.                                             TR0=1;
  232.                                             TR1=0;
  233.                                   P3_4=0;
  234.                             du: for(i=0;i<14;i++)
  235.                                              {      
  236.                                    P3_7=1;
  237.                                                                                       high1=0;
  238.                                                         high=high+2;
  239.                                                         for(j=0;j<5;j++)
  240.                                                         {              P3_6=0;
  241.                                                         convert(ADC0808());                 //每1s启动A/D转换一次,把读入数据转换为显示数据/
  242.                                                   display();
  243.                                                         delay(10);                  //              调用显示子函数/
  244.                                                         }                              
  245.                                              }
  246.                                           if(high==34)
  247.                                           {
  248.                                                    P3_6=1;
  249.                                          P3_7=0;
  250.                                                                       delay(100);
  251.                                                                       TR0=0;
  252. }
  253.                                              }
  254.                               
  255.                             if(P3_4==1)
  256.                                           { TR0=0;
  257.                                             TR1=1;
  258.                                           P3_6=1;
  259.                                           EA=1;
  260.                                           high1=high1+4;
  261.                                           if(high1==40)
  262.                                           high1=16;
  263.                                           if(P3_3==1)
  264.                                           {P3_7=1;            
  265.                                           goto du;
  266.                                           }
  267.                                           while(P3_4!=0)
  268.                                  {};
  269.                                           convert(ADC0808());                 //每1s启动A/D转换一次,把读入数据转换为显示数据/
  270.                                             display();              //              调用显示子函数/
  271.                                                         }
  272.                                           convert(ADC0808());                 //每1s启动A/D转换一次,把读入数据转换为显示数据/
  273.                                             display();              //              调用显示子函数/                                         
  274.                               }               
  275.   }
复制代码


评分

参与人数 2黑币 +2 收起 理由
@常佩婷663730 + 1 共享资料的黑币奖励!
201730645473 + 1 很给力!

查看全部评分

回复

使用道具 举报

ID:130231 发表于 2017-3-16 10:30 | 显示全部楼层
挺好的,感谢分享。
回复

使用道具 举报

ID:300456 发表于 2018-4-30 11:21 | 显示全部楼层
仿真图有没有更大更清晰的啊
回复

使用道具 举报

ID:310363 发表于 2018-5-3 10:54 | 显示全部楼层
能提供一下,原始图档吗?方便我们更好的学习,谢谢!
回复

使用道具 举报

ID:418175 发表于 2018-10-30 21:39 | 显示全部楼层
超级棒,这个总的电路原理图有吗
回复

使用道具 举报

ID:414011 发表于 2018-11-6 13:23 | 显示全部楼层
好样的
回复

使用道具 举报

ID:457099 发表于 2018-12-28 15:28 | 显示全部楼层
可以提供一下proteus里面可以打开的仿真图么
回复

使用道具 举报

ID:487837 发表于 2019-3-19 19:06 | 显示全部楼层
膜拜大神
回复

使用道具 举报

ID:626139 发表于 2019-10-18 13:55 | 显示全部楼层
厉害&#128077;
回复

使用道具 举报

ID:608425 发表于 2020-1-4 15:27 | 显示全部楼层
可以的
回复

使用道具 举报

ID:713378 发表于 2020-3-22 14:16 | 显示全部楼层
非常有用谢谢
回复

使用道具 举报

ID:693628 发表于 2020-3-22 20:00 来自手机 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

ID:975653 发表于 2021-10-28 17:12 | 显示全部楼层

大佬,可以提供一下proteus里面可以打开的仿真图么
回复

使用道具 举报

ID:23303 发表于 2022-3-10 14:27 | 显示全部楼层
学习一下,请楼主多帮助,谢谢!
回复

使用道具 举报

ID:1009680 发表于 2022-3-11 13:30 | 显示全部楼层
zqy181818 发表于 2017-3-16 10:30
挺好的,感谢分享。

这个挺好的 不错
回复

使用道具 举报

ID:1009425 发表于 2022-10-6 14:09 | 显示全部楼层
真厉害。能够把简单的电路写成几千字的文章
回复

使用道具 举报

ID:824664 发表于 2023-3-14 08:40 | 显示全部楼层
思路清晰,值得好好学习。
回复

使用道具 举报

ID:1028811 发表于 2023-12-20 22:26 来自手机 | 显示全部楼层
膜拜,好厉害,不过我能在网上查看这些文献吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表