摘 要:主控为STC15W408AS,调节PWM占空比控制BUCK电路的开关管通断,实现不同电压输出。采样反馈电压与设定输出电压通过PID控制器,输出设定电压。采样反馈电流作为过流保护,保护电路。12864液晶显示电压、电流、功率。
关键词: STC15W408AS、BUCK、PID控制、12864液晶
题目要求:
(1)输出电压0~12V,步进0.1V,输出纹波不大于30mV.
(2)输出电流:500mA;
(3)LCD12864显示电压、电流及功率;
(4)由“+”、“-”两键分别控制输出电压步进增减;
(5)输出电压可预置在0~12V之间的任意一个值;
(6)具有过载保护功能;
一、系统结构图:

二、硬件电路设计:
1、BUCK电路和LDO线性电路方案对比
(1)、共同点:降压型电路
LDO与Buck电路都属于降压型电路,因为都是输入电压大于输出电压,因此都是降压型电路。
(2)、不同点:工作区域
LDO的串联管工作放大区(线性区),而Buck电路中的串联管工作饱和与截止区。
(3)、工作效率:DCDC电路效率高
LDO的输入电流与输出电流基本相同,效率=(输出电压输出电流)/(输入电压输电流),效率等于输出电压与输入电压的比值,当串联管之间的压差较大时,效率较低,消耗的能量以热能散出去。Buck电路的效率相对来说较高,较高达90%,是因为管子处于饱和和截止区时,此时电流很小,几乎是mA级的。DCDC电路输出电压可随意在一个范围内调节,可以输出0~12V。
结论:BUCK电路效率高、输入电压范围宽、输出电压可调、驱动能力强、静态电流小,故BUCK电路满足该项目需求。
2、STM32F103单片机、AT89C51单片机和STC15W408AS单片机方案对比
方案一:stm32是32位ARM内核的主控器,Timer,CAN,ADC,SPI,I2C,USB,UART等多种外设功能,价格较贵,但是项目需求只用到PWM和ADC外设功能,性价比不高。
方案二:AT89C51是8位51内核的单片机,有串口、定时器等外设功能,价格较低,但是没有ADC采样外设,不适合项目需求。
方案三:STC15W408AS也是8位51内核的单片机,有串口、定时器、ADC、PCA、SPI等外设功能,价格时钟,复合项目需求。
(1)电源供电电路:输入电压15~24V,通过LM7805稳压到5V,给MCU、运算放大器、12864液晶显示屏供电。输入端串联二极管1N4007防止正负极接反,烧坏电路。输入端输出端接电容稳定LM7805内部放大器的工作状态。输出端接红色LED指示灯,方便观察上电情况。

(2)BUCK电路:通过BUCK电路的拓扑来改造,通过开关管的通断时间进行斩波来调节降低输出电压,配合上无功元件电感电容储能,续流二极管实现。单片机输出PWM控制NPN 8050三极管通断,R8和R9作用防止单片机上电瞬间有高电平电压突变使得三级管导通。三极管的作用防止电流倒灌损坏单片机管脚。开关管上面需要并联一个电容吸收开关管通断瞬间的浪涌电压。R4和R2作用为了钳住基级的电压,稳定基极导通电压。转换公式Vout=D*Vin

(3)电流采样电路:由于输出电流过小,通过0.1欧姆采样电阻,把电流转换为电压,再经过反比例运算放大器放大10倍给单片机ADC管脚读取显示,用作过载保护。计算公式采样电流I=-R12/R13*Vin

(4)输出电压采样:由于输出电压过大,单片机AD转换引脚只能测量5V以下的电压所以通过电阻分压的缩小电压的方法测量输出电压。单片机ADC管脚采集电压值通过计算得到输出电压,显示输出电压到12864液晶屏幕到上面。计算公式输出电压实际液晶显示电压Vout=((Vin/1024)*5)*3

(5)12864液晶显示模块:由于单片机引脚过少,使用串行通讯模式与液晶屏通讯。功能作用显示电压电流功率。

(6)调试电路:按钮用于步进+10mV和-10mV,LED灯用于开发时调试作用,STC15单片机输出电流可达到20mA,可以驱动LED指示灯,注意整个单片机输出电流不要超过90mA。

(7)主控MCU:供电由LM7805提供5V,内部有35MHz的内部晶振,有上电自动复位功能,所以该单片机最小系统,只需要有电源供电即可工作。

(8)烧录接口:USB-TTL串口烧录器接单片机15和16脚,下载程序。

三、BUCK电路原理分析
1、BUCK变换器
(1)降压式变换器,输出电压小于输入电压的单管不隔离直流变换器。

Q为开关管,驱动电压为PWM,信号周期Ts,信号频率f=1/Ts,导通时间为Ton,关断为Toff,Ts=Ton+Toff,占空比Dy=Ton/Ts。
开关管导通,电感激磁,电流线性上升 
开关管关断,电感去磁,电流线性下降

伏秒平衡:
(2)波形图:

(3)两种工作模式:CCM和DCM。
CCM模式:重负载电流时出现,电感电流总是由正方向流动,电感电流不会降到0,PWM控制,恒定开关频率工作,改变占空比调节输出。

DCM模式:轻负载电流时出现,电感电流完全,电感电流不放电到0,在电流降到0时刻,二极管自然关断,阻挡电感电流的反向流动,输出由电容提供,纹波大,开关频率及输出电压和负载电流相关。

(4)闭环控制思想
①电流电压双闭环的模式
②首先需要满足电压环路控制,使得输出电压输出稳定设定值,后面再通过调整负载满足电流环控制
③当电路出现故障时,电流环先作用,保护电路,使输出电压较低。

四、软件程序设计
程序结构流程图:

1、位置式PID和增量式PID算法对比区别。
①位置式PID控制的输出与整个过去的状态有关,用到了误差的累加值;而增量式PID的输出只与当前拍和前两拍的误差有关,因此位置式PID控制的累积误差相对更大;

②增量式PID控制输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机等,而位置式PID适用于执行机构不带积分部件的对象,如电液伺服阀。

项目需求通过实际采样电压与设定电压来调节占空比,占空比累积值是一个增量的过程。故选用增量式PID。
2、模块软件设计
(1)PWM产生:8位的PWM,最小的分辨率可以达到1/256。可以根据单片机数据操作
void Pwm_Init(void);//PWM寄存器初始化设置。
void pwm_Set(u8 value);//PWM占空比设定。
(2)ADC电压采集:10位ADC采集外设功能,最小采样分辨率为1/1024。
void Adc_Init();//ADC电压采样
float code Get_Adc_Average(u8 ch,u8 times);//获取数据ADC
(3)12864液晶显示:串行通行模式
void Lcd_Init(void); //12864液晶初始化
void LCD_Display_Words(u8 x,u8 y,u8*str);//显示字符串
void SendByte(u8 byte) ; //发送一个字节数据
void Lcd_WriteCmd(u8 Cmd ) ; //写指令函数
void Lcd_WriteData(u8 Dat ) ; //写数据函数
(4)UART收发数据:串口接收和发送数据触发中断,然后处理收发数据。
void uart_init(); //串口初始化函数
char putchar(char c ); //方便调试
void Uart() interrupt 4 using 2; //串口中断函数
void SendString(char *s); //串口发送字符串
void RecData(); //串口接收数据
(5)EXIT外部中断:按钮触发下降沿中断
void exit_init(); //KEY0、KEY1外部中断
void key1_exit1() interrupt 2; //外部中断1服务程序 每次加10mV
void key0_exit0() interrupt 0; //外部中断0服务程序 每次减10mV
(6)PID控制算法:增量式PID算法
void pid_init(void); //PID控制算法初始化
float pid_realize(void); //PID增量计算
四、实验数据
输入电压15V,输出电压可在0~12V可调,电流超过400mA过载保护,可以预设3.3V、5V、8V、12V输出电压,不管负载和输入电压如何变化输出电压还是预设的电压(PID算法调节占空比)。PWM输出频率32KHz。
六、总结
(1)BUCK电路设计上需要注意问题:空载时需要并联2个1k电阻消耗电容能量才能实现降压,采样电流输出经过运放需要滤波,电压采样电阻分压采样后也需要滤波。
(2)PID算法上,使用增量式PID,而不是位置式PID。需要用软件串口调式和示波器观察波形来实现PID三个参数的调节。
附件:
1、原理图

2、PCB

3、电路板

#include "stc15.h"
#include "lcd.h"
#include "adc.h"
#include "pwm.h"
#include "uart.h"
//#include "exit.h"
#include <stdio.h> //printf用
#include "pid.h"
void delay_ms(unsigned int time); //延时函数
void main()
{
u8 res=20;
u8 value=0;
float pwm=0;
P1=0;
P2=0;
//P3=0;//开启之后串口1传输不了数据
Lcd_Init();
Pwm_init();
Adc_Init();
uart_init();
exit_init();//外部中断
pwm_Set(128);
pid_init();
//time2_init();
while(1)
{
//KEY_JZ();
showVolSet();//串口接收设定电压,显示设定目标电压值,传设定值给PID
readADC();//采样实际电压值
pwm=pid_realize(); //接收实际值和设定值,PID调节之后输出PWM占空比
Set_Vol(pwm); //调节占空比 输出PWM
showADC(); //显示输出电压和输出电流和功率
}
}
void delay_ms(unsigned int time) //延时函数
{
unsigned int x,y;
for(x=time;x>0;x--)
{
for(y=70;y>0;y--);
}
}
本文介绍了一种使用STC15W408AS单片机控制的数控直流稳压电源设计,通过BUCK电路实现0-12V、500mA的输出,并采用PID控制保持电压稳定性。12864液晶显示器显示电压、电流和功率。设计中包含过载保护功能,以及“+”、“-”按键控制电压增减。
3513

被折叠的 条评论
为什么被折叠?



