找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 24053|回复: 14
收起左侧

基于单片机的恒流开关电源 BUCK电路设计论文

  [复制链接]
ID:137342 发表于 2017-7-8 09:05 | 显示全部楼层 |阅读模式
中文题目:基于单片机的恒流开关电源
英文题目:MCU-based switching power supply design

专业班级
指导教师
提交日期

基于单片机的恒流开关电源
摘要

本开关电源设计采用STC12C5A60S2单片机发生47KHZ的PWM脉冲信号,经过IR2104控制MOS,从而控制整个BUCK(降压式变换)电路。单片机内部自带的10位ADC能通过电压电流检测电流实时反馈电流和电压数值,并由此调整输出的PWM的占空比,形成电流电压闭环控制系统。按键能设置输出电流从0.2A到2A,以0.01A递增,输出最大10V,液晶能显示实时输出电流与电压。根据测试,满载的供电效率为88%。按键设置的输出电流的误差小于0.01A。

关键词:开关电源,BUCK,STC单片机,IR2104,恒流源


          MCU-based switching power supply design
Abstract

The switching power supply design uses STC12C5A60S2 microcontroller PWM pulse signal 47KHZ happen, after MOS driver IC IR2104 control the whole BUCK circuit. MCU comes with 10 internal ADC voltage detection current by real-time feedback current and voltage values, and thereby adjust the output PWM duty cycle, forming a voltage closed-loop control system. Button can set the output voltage from 0V to 10V limit of, 1V steps, the LCD can display real-time output voltage and current. 10W at the rated power output, full load power efficiency of 81%. Buttons to set the output voltage error is less than 0.1V..

Key words: Switching power supply  BUCK  STC microcontroller  IR2104 Adjustable output
目录
1 前言
1.1课题研究意义
1.2研究现状及存在问题
1.3研究内容和方式
2系统分析
2.1 系统论述
2.2 Buck工作原理
2.3 Buck波形分析
2.4 Buck稳压分析
2.5小结
3硬件设计
3.1总统框架
3.2各部分电路的选择
3.3小结
4软件设计
4.1电压电流双闭环控制算法设计
4.2主程序程序设计
4.3按键子程序设计
4.4  ADC中断程序
4.5  关键程序
5系统测试
5.1实物图片
5.2电压调整率测试
5.3  负载调整率测试
5.4  电路效率测试
6 总结
6.1结论
6.2创新点
6.3存在问题
致谢
参考文献
附录
附  C语言程序源代码


1 前言

1.1课题研究意义

开关电源顾名思义,开关电源便是使用半导体开关器件(如晶体管、场效应管、可控硅闸流管等),经过控制电路,使半导体开关器件不停地“导通”和“关闭”,让半导体开关器件对输入的电压进行脉冲调制,从而完成直流到交流、直流到直流电压变换,和输出电压可调和自动稳压。

开关电源一般有三种工作模式:频率、脉冲宽度固定模式,频率固定、脉冲宽度可变模式,频率、脉冲宽度可变模式。前一种工作模式多用于直流交流逆变电源,或直流/直流电压变换;后面两种工作模式一般用在开关稳压电源。另外,开关电源输出电压也有三种工作式样:直接输出电压的方式、平均值输出电压的方式、幅值输出电压的方式。同样的,前一种工作方式经常用在直流/交流逆变电源,或直流/直流电压变换;后两种工作模式经常用于开关稳压电源[1]。

1.2研究现状及存在问题

近半个世纪以来,国内外学者对开关电源进行了很多的研究,取得了很多的成果。

1.2.1国外研究现状

上个世纪的50年代初,美国宇航局为了搭载火箭,开关电源诞生了,这便是开关电源诞生的起源,此开关电源以小型化、轻巧化为目标。在历史进程中进行了近半个多世纪后,开关电源技术越来越成熟,更因具备了性能稳定、小、发热较低、轻、转换效率高等优点慢慢的在取代了传统电源技术下所制造的不间断工作电源,并在电子设备等各领域有了广泛的应用。最终在80年代,率先完成了大部分电子产品的电源换代,同时也完成了全面开关电源普及化。在到来的20世纪90年代,开关电源更是进入了快速发展的黄金时间,家电、电子设备都得到更广泛的应用。又经历了几十年的努力下,现在的开关电源技术都有了技术性的重大突破与发展。更多新技术的发现与开发将当代开关电源又带上了另一个全新的时期,在高新技术领域的应用更是推动了高新技术产品的发展,其中以其小型化、简便化的特征尤为突出。

1.2.2国内研究现状

国内学者有关开关电源的研究,有以下研究状况:

伴跟着开关电源的诞生,1960年代初期,我国开始对开关稳压电源进行的设计,研制并加以生产。直到60年代中期才开始慢慢地进入了实用的阶段。在对开关电源有了一定认识后,我国在70年代初期便试着开始对无工频降压变换器进行深入研究应用在开关稳压电源上,继而对其进行设计、研制和生产。最终在1974年,我国第一台工频降压变压器式的开关电源被研发出来了,输出电流是5v,工作频率是10KHz。跟着我国开关电源的向前发展,我国许多研究所、工厂等在近十年发展中也纷纷研制出来了无工频降压变换器的开关稳压电源,这种开关电源的工作频率大概在20K左右,输出的功率在1000W以下,但是其型号与用途众多,都投入电子设备、电视机、通信等领域进行广泛的使用。跟着时期的发展,因为我国半导体与工艺跟不上时期的潮流,导致了自己生产与研制的开关稳压电源的关键元器件大部分仍要经过国外进口,导致当代开关电源技术与一些先进国家相比仍存有巨大的差距。

1.2.3目前存在的问题

综上所述,目前国内外学者研究的开关电源普遍存在以下四大方面的问题:

1)多数使用模拟IC控制,控制式样不够智能化;

2)不能显示输入和输出的电流电压状况;

3)多数开关电源为固定输出;

4)可调的开关电源只能通过电位器模拟调整,不能直接得到准确的预设电压。

1.3研究内容和方式

为了设计一种更加智能化的开关电源,必须进行更深入的开关电源机理研究,下文字阐述了具体的研究内容以及研究方法。

1.3.1研究方案

设计出一种基于STC系列51单片机的BUCK型直流降压开关电源是本课题所要研究的主要内容。本系统需要达到的预期目标是:在系统完成后,系统能预置电压,其步进的电压为1V,输出的电压的限度为0V~10V,输出电流为0~1A。同时液晶显示屏上可以显示出所预置的电压,另有实时的输入输出电压,实时的电流,来使得本系统可以让调整速度加快、提升精准度,同时也能使得电压和负载的调整率降低,提升系统的效率,不在附加额外的电源板,最后还可以让输出的纹波变小等。

1.3.2内容安排

1.              首先了解课题研究的意义,和国内国外相关发展动态。

2.              大致的概述设计的开关电源的系统方案。

3.              系统的硬件设计,包括输出电路,直流斩波电路,PWM发生电路,显示电路设计等。

4.              系统的软件设计,对应用的编程软件进行流程图讲解,对所用方式进行概述所。

5.              系统调试与测试,对做好的机开关电源进行调试与数据测试并对结果进行分析。

6.              最后简要的总结本系统设计的工作要点和所得收获。


2系统分析

2.1 系统论述

直流/直流变换是将固有的直流电压转换成可调整的电压,又叫做直流斩波。它有多种拓扑结构,本系统应用的是BUCK(降压式变换电路)型直流/直流,其特征是输出的电压比输出电压低。如图2-1所示。

1.001.jpg
图2-1 BUCK电路拓扑
2.2 Buck工作原理

当Mos管或者三级管导通很长很长时间后,所有的元器件均处在一种理想状态的情况下,此时电容的电压会等于输入的电压。在这样的条件下,我们使用BUCK变换器的充电和放电这两个阶段来对这个电路进行说明:

2.2.1在电感充电的情况下

当BUCK变压器处于充电的过程时,将开关闭合,此时三级管处于导通的状态,可以用一条导线来替代,替代后的等效图如下。当输入的电压经过电感这时刻,二级管因为反接,所以没起到作用,这里删去。再加上输入的是直流,因此电感发生的电感电流是成比率上升的,具体上升多少与电感的大小有关系,电感相当于一个恒定电流源,起传递能量作用,电容等于恒定电压源,在电路里起到滤波的作用。BUCK变换器充电阶段等效图如图2-2所示。

1.002.jpg
图2-2  BUCK变换器充电阶段等效图
2.2.2在电感放电的情况下

当BUCK变压器处于放电的过程中,开关管子已经断开,此时的三级管处于截止状态,这里把它拿掉,等效电路图如下。在开关断开的时间里,因为电感的保持电流不变特征,电感上的电感电流不会一下子下降到零,而是把充电完成后所累积的电流值慢慢下降到0。在这个过程中,因为原来的电路已经断开了,因此电感沿着之前的方向,经过二极管D形成一个新的回路的,即流过电容对电容进行充电,从而保证了负载端获得连续的不间断的电流。BUCK变换器放电阶段等效图如图2-3所示。

1.003.jpg
图2-3  BUCK变换器放电阶段等效图

综上所述,BUCK变换器的升压过程便是电感能量储存和释放的过程。在充电的过程时。电感通过流过它自身的电流不断储存能量,在放电的过程时,假如电容容量足够大,那电容的两端就可以在放电的过程中保持一个持续不间断的电流放电,假如这个通断的过程不断的被重复,那么就可以够让电容两端的电压低输出的电压,从而完成降压的目的。

2.3 Buck波形分析

波形如下所示。

1.004.jpg
1.005.jpg
1.006.jpg 导通时Q电流

1.007.jpg
闭合时C电流

L的电流和输出电流的关系:
1.008.jpg 1.009.jpg


输出电压与输入电压的关系 1.010.jpg
1.011.jpg 2.4 Buck稳压分析

本设计采用串连型开关电源,其稳压原理框图如图2-4所示。在MOS管导通的时刻,电感L将流过的电流转换成磁能进行能量储存,电容C将流过电感L的部分电流转换成电荷储存。在MOS管关断的时刻,电感L发生反向电动势,输送给负载R并与续流二极管D组成回路,同时电容C将电荷转换成电流向负载供电。

经过不断导通与关断MOS管,使uo发生脉动电压,经过LC滤波电路使脉动电压转变成较稳定的直流电压Uo输送给负载,输出电压Uo的电压值与MOS管在一个周期内导通的时间成正比。当外部因素使输出电压或电流发生变化时,经过单片机自带的10位ADC实时采集输出的电压和电流,实时调整开关K导通的占空比,从而组成闭环电压控制电路,使输出电压能达到稳定。

1.012.jpg
图2-4开关电源模块稳压原理
2.4.1  LC滤波电路参数推导
采用输入电压25V,输出电压最大为10V,根据推导公式如式(2-1)所示:此中Ton为PWM一个周期内导通时间、Ui为输入电压、Uo为输出电压、Ud为肖特基二极管的电压降(约等于0.6V)、Io为一个直流/直流模块的输出电流。
1.013.jpg                    (2-1)
PWM的占空比为D:
1.014.jpg                                    (2-2)
代入数据后得到
1.015.jpg                                        (2-3)
              一般而言,开关电源的频率越高,电感的感量可以越小,效率也可以越高。此单片机能输出的PWM最高频率为47KHZ,所以本设计选择让单片机输出47KHZ的PWM。那么f=47Khz导通时间Ton为
1.016.jpg                (2-4)
电感量L为:
1.017.jpg                                 (2-5)
因此将各参数代入式(2-5)得式(2-6):
1.018.jpg           (2-6)
              计算得到32uH电感,这里采用5倍以上余量,采用150uH的电感,可降低电感温度。另外本设计采用铜线和磁芯做成的电感以增大电感的储能能量提升供电的效率。
              按照串连型开关电源的电容推导公式如式(2-7)所示,此中C为电容容量、Io为一个模块个输出电压、△Up-p为输出纹波电压,T为PWM一个周期的时间。
1.019.jpg                              (2-7)
              输出电压最大为10V,我们设定纹波电压为0.1V,将各参数代入式(2-7)得式(2-8)结果:
1.020.jpg                        (2-8)
              本设计采用2个1000 1.021.jpg 的电容,达到降低纹波电压的目的。
2.5小结

综合以上的分析论证,本单片机的开关电源设计采用BCUK拓扑,经过原理分析和认证,最终推导选择了合适的电容和电感。


3硬件设计
31总统框架

基于单片机的开关电源设计,由STC单片机、变压器,整流滤波电路,BUCK主回路、降压稳压电路、按键电路、液晶电路、电压检测电路、电流检测电路等组成。总体设计框图如3-1图所示。下面分别论证这些方面的详细方案选择。

1.022.jpg
图3-1总体设计构架图
32各部分电路的选择3.2.1  单片机

STC12C5A60S2单片机,在指令代码的方面可以完全兼容传统8051,同时它的速度比传统的8051单片机要快8-12倍,体现了其高速度的一面。这系列单片机其里面有专用的集成复位电路,另有8路高速的10位ADC转换,同时还兼有2路的PWM等,它的功能之强大远超传统的8051系列。

1.023.jpg
图3-2 STC12C5A60S2单片机实物图
3.2.2  IR2104半桥驱动电路

1.024.jpg
IR2104是一种高性能的半桥驱动芯片,该芯片内部是采用被动式泵荷升压原理。上电时,电源流过快恢复二极管D向电容C充电,C上的端电压很快升至接近Vcc,这时假如下管导通,C负级被拉低,形成充电回路,会很快充电至接近Vcc,当PWM波形翻转时,芯片输出反向电平,下管截止,上管导通,C负极电位被抬高到接近电源电压,水涨船高,C正极电位这时已超过Vcc电源电压。因有D的存在,该电压不会向电源倒流,C此时开始向芯片里面的高压侧悬浮驱动电路供电,C上的端电压被充至高于电源高压的Vcc,只要上下管一直轮流导通和截止,C就会不断向高压侧悬浮驱动电路供电,使上管打开的时刻,高压侧悬浮驱动电路电压一直大于上管的S极。采用该芯片降低了整体电路的设计难道,只要电容C选择恰当,该电路运行稳定。IR2104应用电路图如3-3所示。

图3-3 IR2104应用电路图
3.2.3  电路供电电源的选择

线性降压芯片7805。这个稳压IC需要的外围元件很少,IC内部还有过流、过热及调整管的保护措施,不但价廉且输出电压很稳定。78系列的稳压集成块要考虑输出与输入压差带来的功率损耗,所以一般输入输出之间压差要大于2V。其应用电路图如图3-4所示。

1.025.jpg

图3-4  7805应用电路
3.2.4  电流检测电路

方案一:霍尔电流传感器。电流流过霍尔传感器的线圈发生磁场,磁场随电流的大小变化而变化,磁场汇集在磁环内,霍尔元件输出跟着磁场变化的电压信号。经过检测电压值,能得到电流的大小。

方案二:电阻分压检测电路。经过在输出回路中串连采样电阻,将经过电阻的电流转换成两端的电压,经过检测电压值从而获得电流值。该检测方式电路和程序控制都比较简洁。

要完成对输出电压和电流的闭环控制,务必对输出电流和电压进行采样反馈。本设计采用如下图所示的电流电压检测电路。为了便于MCU采集,分压电阻发生的电压经过由LM358组成的同相比例放大器放大后,输入到MCU的ADC端口。

LM358内部集成的是双运放,单电源和双电源都能使其工作。

1.026.jpg
图3-5 Lm358引脚图及引脚功能
要完成对输出电压和电流的闭环控制,务必对输出电流经过运放放大后进行采样反馈。本设计采用如图3-6所示的电流检测电路。

1.027.jpg
图3-6 电流检测电路

输出最大电流为2A。本设计采用电阻分压的式样对输出的电压进行实时检测,因为采样电压直接输送给单片机10位ADC进行检测,单片机供电电源为5V,所以其内部自带的检测的最高电压也为5V, 这个电路中,LM358由5V电压供电,最大输出电压和供电电源电压之前有1.2V压差,所以能输出最大电压为:

1.028.jpg                     (3-1)
2A电流经过0.02Ω电阻得到的电压为
1.029.jpg                     (3-2)
该电压要经过放大后才能更容易被单片机检测到,在这个应用中运放的放大倍数应该小于
1.030.jpg                        (3-3)
这里选择R12和R10为33K和1K,放大倍数为
1.031.jpg                        (3-4)
因为 1.032.jpg > 1.033.jpg , 符合设计要求。
即当电流为2A时,运放输出电压为:
1.034.jpg                     (3-5)
3.2.5  电压检测电路
输入电压最大为10V,而单片机的采样电压最高位5V,故电压采样电阻比例应该小于
1.035.jpg                            (3-6)
这里取R1和R5是47K 和10K,
1.036.jpg                        (3-7)
因为 1.037.jpg 1< 1.038.jpg 2,所以满足条件。
当10V输出时,单片机检测到的电压是,
1.039.jpg                     (3-8)
电压分压检测电路如图3-7所示。
1.040.jpg
图3-7 电压检测电路
3.2.6  按键电路

目前单按键这种模式的键盘使用方便,响应的快并且接口还简洁。综合以上本系统采用的是非编码式键盘。本系统设计应用了3 个按键,按照软件来定义它的功能,键盘与单片机的P2.3、P2.2、P2.1键盘是若干按键的集合,是向系统提供操作人员干预命令的接口设备。

S1为开关按键,按一下即有输出,按第二下即输出停止,如此循环

S2为输出电流增加。

S3为输出电压减少。

如图3-8所示

                        1.041.jpg
图3-8 按键电路
3.2.7  液晶显示模块

系统采样1602液晶显示。液晶驱动电流较小,能显示较大信息量,无需增外设电路。

能显示多行数据,方便用户进行更多的操作。

能显示输入输出的实时电压,输出的实时电流,预设的输出电压。如图3-9所示

1.042.jpg

图3-9 1602液晶显示
33小结

综上所述,本开关电源设计采用STC12C5A60S2单片机发生47KHZ的PWM脉冲信号,经过IR2104控制MOS,从而控制整个BUCK(降压式变换)电路。单片机内部自带的10位ADC能通过电压电流检测电流实时反馈电流和电压数值,并由此调整输出的PWM的占空比,形成电流电压闭环控制系统。按键能设置输出电流从0.2A到2A,以0.01A递增,输出最大10V,液晶能显示实时输出电流与电压。总体电路图如3-10所示。

1.043.jpg

图3-10 总体电路图

4软件设计

51的语言主要有汇编和C两种。汇编虽然运行快,但是编程繁琐,移植性差;C具备良好的可读性和移植性。本系统采用C语言编写程序,Keil C51作为集成开发环境。

41电压电流双闭环控制算法设计
              由于题目要求输出电压在10V以内,输出电流应该在0.2~2A以内,所以应该具有如下C-V曲线特性,在电流和电压的双闭环控制中。
1.044.jpg
使得输出电流在2A范围内,电压在10V范围内;
控制模式如下:

电流
电压
PWM
条件
>2A
>10V
++
<=10V
--
<=2A
>10V
--
<=10V
--

软件设计包括:主程序设计,按键子程序设计,ADC中断程序设计

42主程序程序设计

主程序主要处理对时间要求不敏感的数据,例如按键检测,和显示电压电流状况,

此中显示这些数据时刻采用数字平均滤波算法,采集50个数据,继而取平均值,使得到的数据更加接近真实状况,使得显示出来的电压和电流不会乱跳,抗干扰能量得很大的提升。

1.045.jpg

43按键子程序设计

按键子程序中,按加键的话,增加输出电压预设;按减键的话,降低输出电压预设;按开关键的话,能控制IR2104的工作与否,从而控制整个BUCK的工作与否。

1.046.jpg

44  ADC中断程序

ADC中断程序中,因为有输入电压,输出电压,输出电流这3个数据要监测,所以采用通道轮流询问的办法完成。

于此同时,要完成电流电压检测的双闭环的话,要在ADC程序中加入PWM处理程序,使得当输出负载变动,引起检测到的输出电压ADC值变动,PWM需要实时响应这个变化,所以在ADC程序中,要加入PWM的重装数据的语句。

1.047.jpg
4.5  关键程序

void ADC_interrupt()interrupt 5                            //ADC转换完后ADC_FLAG由硬件自动置位,

{                                                      

              uint ADC_value;                                                        //ADC转换结果              10位

              ADC_CONTR&=!ADC_FLAG;                                             //clear ADCflag

              ADC_value=(ADC_RES<<2)+ADC_RESL;                                                           //              ADC_value=(ADC_RES<<2)+ADC_RESL;

              switch(channel)

              {

                            case 0:              Battery_voltage=ADC_value;            

                                                        channel=1;                                                                     

                                                        break;

                            case 1:              Boost_Buck_current=ADC_value;

                                                        if(!lock)

                                                        {                                                      

              if((Boost_voltage<370)&&(Boost_Buck_current<(OUT_Current<<1))) //((Boost_voltage<boost_temp)&&[ size][="" p][p="20," null,="" left][size="12pt]" {[="" pwm_temp--;[="" if(pwm_temp250)  PWM_temp=250;            

                                                                      }

                                                                      CCAP1H = CCAP1L =PWM_temp;

                                                        }

                                                        channel=2;                           

                                                        break;                                                      

                            case 2:Boost_voltage=ADC_value;

                                                        channel=0;

                                                        break;            

                            default:break;

              }

              ADC_CONTR=0xE8|channel;

              ADC_ready=1;                           

}

STC12C5A60S2单片机内部自带的10位ADC能通过电压电流检测电流实时反馈电流和电压数值,并由此调整输出的PWM的占空比,形成电流电压双闭环控制系统。按键能设置输出电流从0.2A到2A,以0.01A递增,输出最大10V,液晶能显示实时输出电流与电压。

5系统测试51实物图片

实物由万用板手工焊接,板子的正面(a)和背面(b)如图5-1所示。

1.048.jpg 1.049.jpg
1.050.jpg

  (a)板子正面                         (b)板子背面
图5-1 总体电路图
1.051.jpg 52电压调整率测试
电压调整率,来源于电源在满载时,其输出电压因该电源的供电电压波动引起的变化,是稳压性能优劣的重要指标。
5.2.1  测试仪器
需要测试电源的电压调整率,需要直流可调压供电电源,要万用表和负载。
可调压电源:本实验采用兆信30/5A数显线性电源。如图5-1所示。
万用表:深圳胜利VC980+数字万用表,数量为4个。
负载:负载为100W 50Ω的环形滑动变阻器。
                           图5-2  可调压电源
5.2.2  测试方式
测试示意图

测量电路点如图5-3所示(3、4、5、6、7为测量点):

1.052.jpg

图5-3测量电路

测试步骤

第一步:在3、4点间用电压表测输出电压,在3、4点串入电流表在5、6点间用电压表测输出电压,在5、7点串入电流表;

第二步:在1、2点源接入市电;

第三步:调整可调变压器电阻,使电源满载输出;

第四步:调整稳压电源电压,使电压为12V,记录输入与输出电压;

第五步:逐步增大电源电压,每隔一段做一次的记录,直到输出电压的上限19V。

5.2.3  测试结果
输出输入电压测试结果如下表所示:

表5-1 输出输入电压记录表

U2(V)

12.96

13.01

14.04

15.05

16.04

17.01

18.01

19.01

Uo(V)

10.01

9.98

10.06

9.94

10.02
10.06
10.03
10.07

(测试条件为输出电压10V,输出电流为1.00A)

电压调整率推导:

1.053.jpg                (5-1)

5.3  负载调整率测试
负载调整率:电源负载的变化会引起电源输出的变化,负载增加,输出降低,相反负载减少,输出升高。好的电源负载变化引起的输出变化较小,通常指标为3%--5%。
负载调整率是衡量电源好坏的指标。好的电源输出接负载时电压降较小。
5.3.1  测试仪器
需要测试电源的负载调整率,需要带隔离低压电源、
1.054.jpg 万用表、负载和示波器。
可调压电源:本实验采用兆信30/5A数显线性电源。
万用表:深圳胜利VC980+数字万用表,数量为4个。
负载:负载为100W 50Ω的环形滑动变阻器。
示波器:单片机输出的载波频率为40KHZ,实
验采用Siglent双通道200M示波器,如图5-4所示。         图5-4 Siglent双通示波器
5.3.2  测试方式
测试示意图

测量电路如图5-3所示。

测试步骤

第一步:在3、4点间用电压表测输出电压,在3、4点串入电流表在5、6点间用电压表测输出电压,在5、7点串入电流表;

第二步:在1、2点间接上市电;

第三步:测试单片机输出的PWM波形、mos管脚的驱动波形。

第四步:输入电压为额定值10V,输出电流取最小值,记录最小负载量的输出电压;

第五步:调整负载为50%满载,记录对应的输出电压;

第六步:调整负载为满载,记录对应的输出电压;

测试数据记录如表5-2。

表5-2 不同负载下输出电压记录表

输出电流(A)

1.00

0.53

0.04

输出电压(V)

9.995

10.001

9.959

负载调整率推导:

1.055.jpg      

5.3.3  测试结果

把示波器的其中一个探针接到单片机的PWM输出口,地接到另外一个端口,得到的测试波形如5-5、 把探针放在上下mos管脚G极的驱动波形波形如图5-6所示。

1.056.jpg        1.057.jpg

图5-5 单片机输出的PWM波形            图5-6 上下mos管脚G极的驱动波形

5.4  电路效率测试5.4.1  测试仪器
需要测试电源的带载性能及效率,需要万用表和负载。
可调压电源:本实验采用兆信30/5A数显线性电源。
万用表:数字万用表。
负载:负载为30W 50Ω的环形滑动变阻器。
示波器:单片机输出的载波频率为47KHZ。
5.4.2  测试方式:
测试示意图

测量电路如图5-3所示。

测试步骤

第一步:在3、4点间用电压表测输出电压,在3、4点串入电流表在5、6点间用电压表测输出电压,在5、7点串入电流表;

第二步:在1、2点间接入市电;

第三步:输入电压为额定值18V,

第四步:调整负载由大至小记录对应的输出电压、输入电流、输出电压、输出电流;

第五步:返回第四步,直到输出电流达到自保护的状态。

5.4.3  测试结果
测试额定功率下的供电效率,测试结果如表3所示。


表5-3供电效率测试数据
供电电压/V
供电电流/A
总输出电压/V
总输出电流/A
实际效率
12.2
1.01
10.02
1.00
0.81
12.2
0.95
9.01
1.03
0.80
12.2
0.85
8.05
1.02
0.79
12.2
0.78
7.07
1.04
0.77
12.2
0.67
6.02
1.02
0.75
12.2
0.56
4.98
1.01
0.74
12.2
0.48
3.97
1.00
0.68
12.2
0.38
3.00
1.04
0.67
12.2
0.25
2.01
1.02
0.66
12.2
0.13
1.02
1.00
0.63
12.2
0.01
0.04
1.01
0.64

由以上数据得到:满载输出情况下,供电效率为81%。

输出噪声纹波电压峰-峰值的测试,把示波器的测试输出电压波形如图5-6所示。

1.058.jpg

                                                                                                    图5-6 输出电压波形

由以上数据得到:该电源的电压调整率为0.069%,负载调整率为3.164%,满载输出情况下,供电效率为81%,当输出电流大于2A时,保护电路启动。输出电压为0。输出纹波峰峰值为290Mv。实际电路的调试图如图5-7所示。

1.059.jpg

图5-7实际电路的调试图


   6 总结61结论

经过研究国内外关于开关电源的方式,本开关电源设计采用STC12C5A60S2单片机发生47KHZ的PWM脉冲信号,经过IR2104控制MOS,从而控制整个BUCK(降压式变换)电路。单片机内部自带的10位ADC能通过电压电流检测电流实时反馈电流和电压数值,并由此调整输出的PWM的占空比,形成电流电压闭环控制系统。按键能设置输出电流从0.2A到2A,以0.01A递增,输出最大10V,液晶能显示实时输出电流与电压。根据测试,满载的供电效率为88%。按键设置的输出电流的误差小于0.01A。

因此,本文所研究的基于单片机的开关电源设计满足了当初的设计预想,达到了较好的效果。

62创新点

论文主要的创新点有以下三点:

1)使得开关电源硬件更加智能化,直接用单片机控制;

2)能显示输入和输出的电流电压状况,实时监测电源的运作;

3)能经过按键数字化地设置预设输出电压,能得到精确的设定电压。

63存在问题

因为时间与能量有限,本文所设计的控制系统另有待于进一步的改进:

比如,

  • 比如可以加大电感L,使得输出纹波进一步降低;
  • 采用PCB板制作实物,使得其稳定性进一步提升,等等
致谢

本论文的全部工作得到了指导老师的悉心指导和亲切关怀,同时也衷心感谢学校的所有老师在这四年来对我的学习、工作、生活上给予的无私帮助和无微不至的关怀。我的论文选题和论文写作都是在导师的指导下完成的,他崇高的师德和高深的学术造诣给我在我身上留下了深深的烙印,对我的学术训练和研究能量的培养会让我受用终身。

在我大学生涯中,得到了专业课老师在电子技术上给予的悉心指导,特此感谢。

在完成该课题的时刻,得到舍友们,同班同学们和学长们的帮助,在此深表感谢。

感谢惠州学院的老师们同学们,在学习工作的时,从他们身上我学习到了不少开发项目的方式和新的开发技术。

谢谢所有帮助和关心我的老师和同学。

参考文献

[1]陈永真,孟丽囡.高效率开关电源设计与制作[M].北京:中国电力出版社,

2008:4-150.

[2]刘胜利.当代高频开关电源实用技术.北京:电子工业出版社,2001:151-154.

[3]赵同贺.新型开关电源典型电路设计与应用[M].北京:机械工业出版社,

2010:50-80.

[4]王水平,贾静,方海燕等.开关稳压电源原理及设计[M].北京:人民邮电出版社,

2008:1-170

[5]张占松,蔡宣二等.开关电源的原理与设计.北京:电子工业出版社, 2004:1-3.

[6]刘胜利,李龙文.高频开关电源新技术应用[M].北京:中国电力出版社,2008:2-69.

[7]王有绪,许杰等. PIC系列单片机接口技术及应用系统设计.北京:北京航空航天大学出版社,2000:5-8.

[8]田界容.开关电源电磁干扰的抑制.当代电子技术,2005,(8):112-113.

[9]全国大学生电子设计竞赛组委会.全国大学生电子设计竞赛获奖作品选编(2007)[M].北京:北京理工大学出版社,2008

[10]余孟尝.数字电子技术[M].北京:高等教育出版社,2007:31-62.

    [11]电子技术基础模拟部分(第五版).北京:高等教育出版社,2006


  C语言程序源代码


  1. /*************手工焊板BUCK-BOOST******/
  2. #include <STC12C5A60S2.H>
  3. #include <intrins.h>                    /*use _nop_() function*/
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define ADC_FLAG      0X10

  7. /*****************************************
  8. 端口功能设定
  9. *****************************************/
  10. sbit PWM_1                            =              P1^4;       //PWM1_Boost/Buck
  11. sbit SD_1                              =              P1^3;       //SD1_Boost_Buck
  12. sbit Key_1                            =              P2^1;       //Key_1
  13. sbit Key_2                            =              P2^2;       //Key_2
  14. sbit Key_3                            =              P2^3;       //Key_3

  15. uint ADC_value;
  16. uchar PWM_temp=2;
  17. uchar last_key;                                                        //按键变量
  18. uchar channel=0;                                          //第一通道
  19. uchar Caes=0;                                                                      //菜单
  20. uchar  OUT_Current=100;
  21. uint  Battery_voltage;                            //输入电压            
  22. uint  Boost_voltage;                            //Boost电压                           
  23. uint  Boost_Buck_current;              //Buck_Boost电流8位
  24. uint  A_value=90;
  25. bit lock=1;                                       //PWM输出锁定
  26. bit ADC_ready=0;                         //ADC完毕
  27. bit K;
  28. void delay();
  29. void Key_1_();
  30. void Key_2_();
  31. void Key_3_();
  32. void init_pca();
  33. void init_timer();
  34. /**********************************************************
  35. 函数说明: 延时程序
  36. **********************************************************/
  37. void delay(uchar t)
  38. {
  39.               uint j;
  40.               uchar i;
  41.               for(i=0;i<t;i++)
  42.                             for(j=0;j<1000;j++);
  43. }
  44. /**********************************************************
  45. 函数说明: PWM初始化
  46. **********************************************************/
  47. void init_pwm()
  48. {
  49.   CCON = 0;
  50.               CL = 0;
  51.               CH = 0;
  52.               CMOD = 0X08; //0X08:43KHZ // 0X02,22KHZ // 0X0A,10KHZ //
  53.               CCAPM1              =0x42;//8位PWM输出,无中断
  54.               CCAP1L               =CCAP1H =250;//初始化spwm输出的占空比
  55.               CR=1;
  56. }
  57. /**********************************************************
  58. 函数说明: 中断 始化函数
  59. **********************************************************/
  60. void InitADC()
  61. {
  62.               P1M1=0x83;
  63.               P1M0=0x00;
  64.               P1ASF=0X07;                                //选择ADC通道012
  65.               ADC_RES=0;
  66.               ADC_CONTR=0X88;                               //1110 0000                 E8 开电源,最高速
  67.               EA=1;
  68.               EADC=1;
  69. }
  70. /**************************************
  71. 1602液晶
  72. **************************************/
  73. sbit RS = P2^5;                           
  74. sbit RW = P2^6;
  75. sbit E  = P2^7;
  76. /**************************************
  77. 短延时
  78. **************************************/
  79. void delay5ms()  
  80. {
  81.     uchar i,v,k;
  82.     for(i=1;i>0;i--)
  83.         for(v=168;v>0;v--)
  84.             for(k=22;k>0;k--);
  85. }
  86. /**************************************
  87. 写指令
  88. **************************************/
  89. void lcd_Write_com(uchar com)               
  90. {
  91.               RS=0;                              //定义指令寄存器
  92.               RW=0;                                                    //写允许
  93.               P0=com;                                                                        //写指令
  94.               delay5ms();              E=1;                            //片选端上拉
  95.               delay5ms();              E=0;                            //下降沿锁存
  96. }
  97. /**************************************
  98. 写数据
  99. **************************************/
  100. void lcd_write_date(uchar date)            
  101. {
  102.               RS=1;                                                                      //定义数据寄存器
  103.               RW=0;                                                                      //写允许
  104.               P0=date;                                                        //写数据
  105.               delay5ms();              E=1;                            //片选端上拉
  106.               delay5ms();              E=0;                            //下降沿锁存
  107. }
  108. /**************************************
  109. 显示程序
  110. **************************************/
  111. void dis_lcd1602(uchar x,uchar y,uchar dat)
  112. {
  113.               uchar add;
  114.               if(y==1)               add=(0x80+x);
  115.               if(y==2)               add=(0xc0+x);
  116.               lcd_Write_com(add);                            //写指令
  117.               lcd_write_date(dat);              //写数据
  118. }
  119. /**************************************
  120. 液晶初始化
  121. **************************************/
  122. void lcd1602_init()
  123. {
  124.               lcd_Write_com(0x38);              //设置8位格式,2行,5*7
  125.               lcd_Write_com(0x01);              //清屏
  126.               lcd_Write_com(0x0c);              //整体显示,关光标,不闪烁
  127.               lcd_Write_com(0x06);              //设定输入方式,增量不移位
  128.               lcd_Write_com(0x80);              //初始坐标
  129. }
  130. /**************************************
  131. 液晶显示汉字程序
  132. **************************************/
  133. void hz_lcdDis(uchar x,uchar y,uchar *p) //汉字显示
  134. {
  135.    uchar i=0,temp;
  136.    if(x)temp = 0x40;   else temp = 0;
  137.    for(i=y;*p!='\0';i++,p++)
  138.    {
  139.                             lcd_Write_com(i|0x80+temp);
  140.                             lcd_write_date(*p);
  141.                             delay5ms();                                          
  142.    }
  143. }
  144. /**************************************
  145. 液晶显示数字程序
  146. **************************************/
  147. void  num_lcdDis(uchar X,uchar Y,uint num,uchar n)            
  148. {
  149.               uint i=0,temp,hang;   
  150.               n +=1;
  151.                  if(X)hang = 0x40;else hang = 0;
  152.                  for(i=(n-1);i>0;i--)
  153.     {               
  154.                               lcd_Write_com((i+Y-1)|0x80+hang);                //从个位开始显示
  155.                               temp = num%10+0x30;
  156.                               lcd_write_date(temp);            
  157.                             delay5ms();
  158.                               num/=10;                                                                     
  159.               }            
  160. }
  161. /**********************************************************
  162. 函数说明: 平均滤波函数
  163. **********************************************************/
  164. #define N 50
  165. uint Filter(uint adc_data)
  166. {
  167.               uint value=0;
  168.               uchar count,count_ADC;
  169.               for(count=0;count<N;count++)
  170.               {
  171.                             for(count_ADC=0;count_ADC<2;count_ADC++)
  172.                             {
  173.                                           while(!ADC_ready){}
  174.                                           ADC_ready=0;
  175.                             }
  176.                             value+=adc_data;               
  177.               }
  178.               return (value);
  179. }
  180. /**********************************************************
  181. 函数说明:按键延时防抖动
  182. P3^5       Key_1
  183. P3^6       Key_2
  184. P3^7       Key_3

  185. **********************************************************/
  186. void key_scan()
  187. {
  188.               uchar temp;
  189.               temp = P2&0x0F;
  190.               if(temp != 0x0F)
  191.               {
  192.                             delay(10);
  193.                             temp = P2&0x0F;
  194.                             if(temp!= 0x0F)
  195.                             {
  196.                                           switch(temp)
  197.                                           {
  198.                                                         case 0x0D: Key_1_();              break;              //21
  199.                                                         case 0x0B: Key_2_();              break;              //22
  200.                                                         case 0x07: Key_3_();              break;              //23
  201.                                                         default:break;
  202.                                           }
  203.                             }
  204.               }
  205. //              last_key = temp;
  206. }

  207. /**********************************************************
  208. 函数说明: +按键程序
  209. **********************************************************/
  210. void Key_1_()
  211. {
  212.               if(K)              {SD_1=0;              lock=1;                            CCAP1L               =CCAP1H =128;              hz_lcdDis(0,11,"Stop!");}
  213.               else               {SD_1=1;              lock=0;              hz_lcdDis(0,11,"Start");}
  214.               K=~K;            
  215. }
  216. void Key_2_()
  217. {
  218.               OUT_Current=OUT_Current+1;
  219.               if(OUT_Current>200)OUT_Current=200;            
  220. }
  221. void Key_3_()
  222. {
  223.               OUT_Current=OUT_Current-1;
  224.               if(OUT_Current<20)OUT_Current=20;                           
  225. }
  226. /**********************************************************
  227. 函数说明: 主函数
  228. **********************************************************/
  229. void main(void)
  230. {
  231.               uint U1,U2,u1,u2,u3,i1;
  232.               SD_1=0;
  233.               lcd1602_init();
  234.               hz_lcdDis(0,4,"Welcome!");
  235.               init_pwm();
  236.               InitADC();
  237.               delay(250);            
  238. //              delay(250);
  239.               EA=1;//开总中断
  240.               lcd_Write_com(0x01);              //清屏
  241. //              SD_1=1;
  242.               hz_lcdDis(0,0,"IN=  . V   Stop!");
  243.               hz_lcdDis(1,0,"OU=  . V I= .  A");
  244.               while(1)//主循环
  245.               {                           
  246.                             U1=Filter(Battery_voltage);            
  247.                             U2=Filter(Boost_voltage);
  248. //                            I1=Filter(Boost_Buck_current);              //检测Boost_Buck电流
  249. //                            num_lcdDis(0,11,OUT_Current,3);
  250. //                            num_lcdDis(0,3,U1,5);
  251. //                            num_lcdDis(1,3,U2,5);
  252. //                            num_lcdDis(1,11,I1,5);
  253.                             u1=U1/91;              //检测电池电压  1:2采样电阻                                                                                   
  254.                             num_lcdDis(0,3,u1/10,2);
  255.                             num_lcdDis(0,6,u1%10,1);            
  256.                             u2=U2/172;
  257.                             num_lcdDis(1,3,u2/10,2);
  258.                             num_lcdDis(1,6,u2%10,1);
  259.                             num_lcdDis(1,11,OUT_Current/100,1);
  260.                             num_lcdDis(1,13,OUT_Current%100,2);
  261. //                            if((u2-u1)<40)               hz_lcdDis(0,10,"Error!");
  262. //                            else                                            hz_lcdDis(0,10,"OK    ");
  263.                             key_scan();
  264.               }
  265. }
  266. /****************************************************************
  267. 函数说明: ADC中断
  268. 实现功能:执行ADC采集并做电压和电流的调整。
  269. ****************************************************************/
  270. void ADC_interrupt()interrupt 5                            //ADC转换完后ADC_FLAG由硬件自动置位,须由软件清零
  271. ……………………

  272. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

完整论文下载(word格式 可编辑):
基于单片机的恒流开关电源.docx (3.83 MB, 下载次数: 294)
回复

使用道具 举报

ID:194774 发表于 2017-7-18 16:04 | 显示全部楼层
NICE,居然有论文
回复

使用道具 举报

ID:194774 发表于 2017-7-18 18:52 | 显示全部楼层
最近一直找15年国赛的相关论文,没想到在这里找到了,开心,受教了
回复

使用道具 举报

ID:216892 发表于 2017-12-13 16:03 | 显示全部楼层
楼主 有没有这个的仿真?求
回复

使用道具 举报

ID:254630 发表于 2017-12-14 08:37 | 显示全部楼层
本帖最后由 秘密方法 于 2017-12-14 09:20 编辑

相当有水平. 个人感觉图纸中电流采样(0.02欧姆得到的电压)电路 图3-6 中与 LOAD(负载)相接的网络应该为 电源的功率电压输出端,不应该为"VCC". 这个估计是笔误.   
回复

使用道具 举报

ID:56696 发表于 2018-10-8 16:36 | 显示全部楼层
挺不错的,赞一个。
回复

使用道具 举报

ID:671962 发表于 2020-1-8 20:51 | 显示全部楼层
演技派 发表于 2017-12-13 16:03
楼主 有没有这个的仿真?求

你好我也想要这个仿真,你有吗
回复

使用道具 举报

ID:648281 发表于 2020-1-8 22:53 | 显示全部楼层
ssssmmyy 发表于 2020-1-8 20:51
你好我也想要这个仿真,你有吗

你好!这个电路内的相关器件没法仿真,所以只能做实物
回复

使用道具 举报

ID:452173 发表于 2020-2-4 01:14 | 显示全部楼层
收藏了,谢谢分享,内容很详细
回复

使用道具 举报

ID:406132 发表于 2020-6-2 15:41 | 显示全部楼层
这。。。非常不错,虽然不会软件。。。
回复

使用道具 举报

ID:58730 发表于 2020-8-4 14:32 | 显示全部楼层
谢谢分享,内容很详细
回复

使用道具 举报

ID:416121 发表于 2020-8-21 11:06 | 显示全部楼层
IR2104没有下管,确定上管能自举?
回复

使用道具 举报

ID:128989 发表于 2020-10-18 22:17 | 显示全部楼层
学生的DIY小玩意,能做这种水平不错了
回复

使用道具 举报

ID:4572 发表于 2021-4-25 16:52 | 显示全部楼层
谢谢分享,内容很详细
回复

使用道具 举报

ID:1100061 发表于 2023-11-16 23:49 | 显示全部楼层
这个很棒呀
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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