主要内容
本内容是基于单片机的开关电源设计
包含:
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);//设置系统中断优先级分组2delay_init(168);//初始化延时函数OLED_Init();//OLED初始化OLED_Clear();//清屏KEY_Init();LED_Init();//GPIO初始化Adc_Init(); //初始化ADCuart_init(9600);//初始化串口波特率为115200TIM_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';
实物焊接
私聊获取全套资料~