【毕设】基于单片机的开关电源设计(源码+电路图+全套资料+说明文档)

该内容详述了一种使用STM32F407单片机设计的开关电源系统,通过PWM控制BUCK电路实现电压调节。系统包括整流滤波、驱动电路、电压电流检测、液晶显示及按键控制等功能,利用ADC转换数据反馈给单片机以稳定输出电压。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要内容

本内容是基于单片机的开关电源设计
包含:
1 设计源码
2 电路图
3 配套程序
4 全套说明资料
(私聊获取资料)

方案分析

选用STM32F407单片机作为控制芯片,前段整流部分使用直流电源给入,主控电路输出PWM波信号,即稳定的电压值,经增强驱动力后,再经BUCK电路输出需要的电压电流值,这些电压电流值经ADC转换电路发送给主控电路,在电路系统中构成电压,电流反馈系统。最后在液晶屏显示实时数据。按键电路信息直接发给主控电路,主控电路做出反应,达到按键调节的数据。

系统整体结构

启睿工作室
通过按键控制单片机输出PWM,由此即可控制BUCK电路的电压。本电路由单片机最小系统电路、IR2104驱动电路,整流滤波电路、BUCK降压稳压电路、按键电路、液晶显示电路、电压电流检测电路等组成。

电路原理介绍

典型BUCK电路如图2所示。
在这里插入图片描述

图2 BUCK电路拓扑
图中的T就是一个开关管,可以把电流看成水流,通过不停的开关水闸,水的流量就会有很大的变化,同理,电流在这个电路里也会有很大的变化。
开关电源电压调节和线性电源的电压调节的基本原理是面积等效原理,即脉冲相同,形状不同的脉冲应用于惯性环节,效果基本相同,当想要从电源10V中获取5V的输出电压时,把10V的电压分成5个部分看,5V所占的面积大概在1/2,当PWM方波的占空比为50%时,所得到的电压就是5V,在电路的后面加上滤波电容,是电压输出的波纹变低。等效面积图如图3所示。
在这里插入图片描述

图3 BUCK等效面积图
BUCK电路中的开关管闭合时,输出的电压Vin流过电感对电容进行充电并储藏电能在电感中,同时还提供着负载所需要的能量。
当开关T断开时,电感的电流不会消失而是继续给电容提供能量,继续为负载供电,这样就可以通过对电感充电的多少来控制电压。
接下来我们说下PWM波形,通过控制T2的长度就可以控制电压了,就是所谓的方波占空比,BUCK开关信号波形如图4所示。
在这里插入图片描述

图4 BUCK开关信号波形

通过实时监测输出端的电压变化,反馈给单片机,单片机调整PWM方波的占空比即可达到稳定输出电压的目的,系统降压工作如图5所示.
在这里插入图片描述

图5 系统降压工作原理

硬件电路图

私聊获取各模块电路说明

私聊获取各模块电路说明

主程序流程图

主程序为PWM发生和电压即电流检测,本设计所使用的STM32F407的单片机内部自带了PWM发生引脚,频率高达72kHZ,使用时先写出PWM初始化程序,电源设计中所使用的控制方式为按键控制,显示方式是OLED液晶屏显示,软件中还要初始化液晶屏和PWM。
在这里插入图片描述

源程序关键代码

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "pwm.h"
#include "exti.h"
#include "OLED_I2C.h"
#include "string.h"
#include "stdlib.h"
#include "stdio.h"
#include "adc.h"
//全局变量定义区
char  buf[20];//缓存数组
int pwmval=1000;
float cs;
u16 adcx;

void System_SoftReset(void)
{
 __set_FAULTMASK(1); //关闭所有中断
 NVIC_SystemReset(); //复位
}
float volt,ys_vol=5.0;
int Alot;



int main(void)
{   
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
    delay_init(168);//初始化延时函数

    OLED_Init();//OLED初始化
    OLED_Clear();//清屏
  KEY_Init();
    LED_Init();//GPIO初始化
    Adc_Init();         //初始化ADC
    uart_init(9600);//初始化串口波特率为115200
    TIM_PWM_Init(1000,4);//PWM初始化
    PID_init();//PID初始化
    SD=0;
    sprintf(buf,"预设:%.1fV ",ys_vol);
    OLED_ShowCH(0,0,buf);   
    OLED_ShowCH(0,6,"状态:暂停");   
   while(1) //
    {
  adcx=Get_Adc_Average(ADC_Channel_5,20);//获取通道5的转换值,20次取平均
    volt=adcx/203.5;
    adcx=Get_Adc_Average(ADC_Channel_6,20);//获取通道5的转换值,20次取平均
    if(adcx<20){adcx=0;}
    Alot=adcx/4;
    if(Alot<20){Alot=0;}
    sprintf(buf,"电压:%.1fV ",volt);
    OLED_ShowCH(0,2,buf);    
    sprintf(buf,"电流:%dmA  ",Alot);
    OLED_ShowCH(0,4,buf);   

    if(KEY0==0){
            SD=!SD;
            if(SD){
                OLED_ShowCH(0,6,"状态:启动");   
            }else{
              OLED_ShowCH(0,6,"状态:暂停"); 
            }
            while(KEY0==0);
    }
    if(KEY1==0){
        ys_vol-=0.1;
        if(ys_vol<0){ys_vol=0;}
        sprintf(buf,"预设:%.1fV ",ys_vol);
      OLED_ShowCH(0,0,buf);
    }
    if(KEY2==0){
      ys_vol+=0.1;if(ys_vol>12.0){ys_vol=12.0;}
        sprintf(buf,"预设:%.1fV ",ys_vol);
      OLED_ShowCH(0,0,buf);
    }
    
    
         if(SD==1){
            pwmval-=PID_realize(ys_vol,volt);if(pwmval<1){pwmval=1;}if(pwmval>999){pwmval=999;}//PID控制输出5V
          }
      TIM_SetCompare4(TIM2,pwmval);
        LED0=!LED0;
    }
}



var foo = 'bar';

实物焊接

在这里插入图片描述
私聊获取全套资料~

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值