摘要
本报告详细描述了基于STM32单片机的数控直流电源的设计过程。该电源具有输出电压0V~30.0V可调、恒压模式步进控制、最大输出电流1.5A、LCD1602显示、按键控制、温度检测报警、输出过流保护以及恒流恒压切换等功能。通过本设计,我们实现了一个功能丰富、性能稳定的数控直流电源。
一、引言
随着电子技术的快速发展,数控直流电源在科研、教学和工业生产等领域的应用越来越广泛。传统的直流电源调节精度低、操作不便,难以满足现代电子设备的需求。因此,设计一款基于STM32单片机的数控直流电源具有重要的实用价值和意义。
二、系统总体设计
本系统以STM32单片机为核心控制器,通过变压器将220V市电降至安全电压,再经过整流、滤波和稳压电路得到稳定的直流输出电压。系统通过按键控制输出电压的步进增减,并通过LCD1602液晶显示屏实时显示输出电压和电流。同时,系统还具备温度检测和过流保护功能,确保电源的安全可靠运行。
三、硬件设计
-
STM32单片机:作为系统的核心控制器,负责接收按键输入、控制输出电压、显示数据以及处理温度检测和过流保护等功能。
-
电源电路:通过变压器将220V市电降至安全电压,再经过整流、滤波和稳压电路得到稳定的直流输出电压。
-
按键电路:采用“加、减”两键控制输出电压的步进增减,同时设置模式切换键实现恒流恒压模式的切换。
-
LCD1602显示电路:用于实时显示输出电压和电流,方便用户观察电源的工作状态。
-
温度检测电路:采用温度传感器检测关键器件的温度,当温度超过设定值时触发声光报警。
-
过流保护电路:通过电位器调节过流保护阈值,当输出电流超过设定值时自动切断输出,保护电源和负载设备。
四、软件设计
-
初始化:对STM32单片机进行初始化,包括GPIO口、定时器、中断等配置。
-
按键处理:通过轮询方式检测按键状态,根据按键的不同执行相应的功能,如输出电压步进增减、模式切换等。
-
LCD显示:实时将输出电压和电流数据发送至LCD1602显示屏进行显示。
-
温度检测与报警:定时读取温度传感器数据,当温度超过设定值时触发声光报警。
-
过流保护:通过电位器设定过流保护阈值,当输出电流超过该值时切断输出,并通过LCD显示错误信息。
五、测试结果与分析
经过实际测试,本系统能够稳定输出0V~30.0V的直流电压,恒压模式步进控制准确,纹波小于30mV,最大输出电流达到1.5A。LCD1602显示屏能够实时显示输出电压和电流,按键控制方便快捷。同时,系统的温度检测和过流保护功能有效,确保了电源的安全可靠运行。
六、结论与展望
本设计成功实现了一款基于STM32单片机的数控直流电源,具有输出电压可调、步进控制、液晶显示、温度检测和过流保护等功能。在实际应用中,该电源能够满足多种电子设备的需求,具有较高的实用价值。未来,可以考虑进一步优化电源的性能和稳定性,增加更多的功能,如远程控制、通信接口等,以满足更广泛的应用场景。
#include <string.h>
#include "Hal_key/hal_key.h"
#include "Hal_Usart/hal_uart.h"
#include "Hal_Watchdog/hal_watchdog.h"
#include "delay/delay.h"
#include "myiic.h"
#include "SHT2x.h"
#include "LCD1602.h"
#include "adc.h"
#include "main.h"
/* 用户区当前设备状态 */
u16 Board_Temp=0; //板上元件温度
u16 Model=0; //模式 0:电压模式 1:电流模式
u16 In_Voltage=0; //输入电源电压
u8 Beep_Flag=1; //温度报警开关,默认打开 1
unsigned char LCD1602_Table[]="0123456789";
unsigned int DA_Date=0; //传入TLC5615的值
u16 DA_Current=0; //设置电流时,传入DA值
u16 DATA = 0;
u16 Out_Voltage=0; //输出电压(mV)
unsigned char Short_Flag=0; //过流标识. 1:过流
u16 Out_Current=0; //输出电流
u16 Set_Current=0; //设置输出电流
/* 按键相关定义 */
#define GPIO_KEY_NUM 2 ///< 定义按键成员总数
keyTypedef_t singleKey[GPIO_KEY_NUM]; ///< 定义单个按键成员数组指针
keysTypedef_t keys; ///< 定义总的按键模块结构体指针
/**@} */
u16 Volue=0;
void PID_Init(void); //pid参数初始化
u16 PID_realize(u16 current); //pid运算
///****************PID用*************************/
typedef struct
{
u16 SetSpeed; //定义设定值
u16 ActualSpeed; //定义实际值
int err; //定义偏差值
int err_last; //定义上一个偏差值
u8 Kp,Ki,Kd; //定义比例、 积分、 微分系数
int voltage; //定义电压值(控制执行器的变量)
int integral; //定义积分值
} PID ;
PID pid; //声明pid结构体
/* PID参数初始化 */
void PID_Init()
{
pid.SetSpeed=0;
pid.ActualSpeed=0;
pid.err=0;
pid.err_last=0;
pid.voltage=0;
pid.integral=0;
pid.Kp=5; //5
pid.Ki=1; //1
pid.Kd=0;
}
/* PID控制算法 */
u16 PID_realize(u16 current)
{
int index = 0 ;
pid.SetSpeed=current;
pid.err=pid.SetSpeed-pid.ActualSpeed;
index=1;
pid.integral+=pid.err;
pid.voltage=pid.Kp*pid.err+index*pid.Ki*pid.integral; //+pid.Kd*(pid.err-pid.err_last);
printf("pid.err=%d-%d=%d\r\n",pid.SetSpeed,pid.ActualSpeed,pid.err);
printf("pid.integral=%d\r\n",pid.integral);
printf("pid.voltage=%d\r\n",pid.voltage);
if(pid.voltage<0)
pid.voltage=0;
//pid.err_last=pid.err;
pid.ActualSpeed=pid.voltage>>6;
printf("pid.ActualSpeed=%d\r\n",pid.ActualSpeed);
return pid.ActualSpeed;
}
部分程序
资料下载地址:
https://docs.qq.com/doc/p/ffc421513a628b30450ae742547c0b850456d7c8