基于单片机的可调数控电源设计
点击链接下载资料:https://download.csdn.net/download/m0_51061483/92081486
1. 系统功能概述
本系统设计了一款基于单片机控制的可调数控直流电源,实现了电压、电流的实时检测与调节,并具备过流报警及温度监控功能。该系统在硬件上以单片机为核心,配合数模转换电路(DAC)、电压采样、电流采样、温度检测及显示模块,实现了可编程电压输出和智能化保护;在软件上,通过人机交互程序实现电压、电流阈值的设置、显示与自动报警控制。
系统的主要功能包括:
- 输出电压可调:用户可通过按键或旋钮设置输出电压大小,单片机控制数模转换模块(DAC)输出相应模拟电压,驱动功率管实现可调电压输出;
- 实时测量电压、电流:通过电压分压采样与电流检测模块(如ACS712),实现负载端电压和电流的实时检测;
- 过流保护与报警:当检测到电流超过设定阈值,系统自动发出报警提示,必要时可关闭输出;
- 温度检测与显示:利用温度传感器检测设备内部温度,超过安全温度阈值时报警提示;
- LCD信息显示:在LCD屏上实时显示输出电压、电流、温度及工作状态,用户可直观了解电源工作情况;
- 智能控制与稳定输出:系统采用闭环控制思想,实时比较设定值与检测值,自动调整输出,保证电源稳定可靠。
本设计可广泛应用于电子实验、电路测试、仪器仪表供电等领域,具有良好的教学与工程应用价值。
2. 系统电路设计
整个系统由主控单片机电路、数模转换及输出调节电路、电压采样电路、电流检测电路、温度检测电路、显示与报警电路组成。下面分别介绍各模块的设计原理与功能。
2.1 主控电路设计
本系统采用STC89C52单片机作为主控制核心。该芯片兼容MCS-51系列指令系统,具有丰富的I/O口资源、定时器、串口接口及中断功能,能够满足多任务控制需求。单片机主要负责:
- 采集电压、电流、温度等传感器信号;
- 根据用户设置值控制DAC输出;
- 判断是否超出安全范围并触发报警;
- 实时刷新LCD显示。
主控电路包括复位电路(由电阻、电容构成RC复位网络)和时钟电路(由12MHz晶振及电容组成),确保系统上电后自动复位并稳定运行。
2.2 数模转换与输出控制电路
系统采用DAC0832数模转换芯片,实现单片机数字控制与模拟电压输出之间的桥接。单片机通过P0口输出8位数字量至DAC0832,该芯片将数字信号转换为模拟电压,作为功率放大电路的控制信号,进而控制输出电压大小。
DAC0832输出电压与输入数字量成线性关系:
Vout = (D / 255) × Vref
其中 D 为数字输入值,Vref 为参考电压(一般为5V)。
经过功率运算放大(如采用运放LM324或功率管2N3055),输出电压可调范围可设计为 0V ~ 30V,满足实验室电源应用需求。
2.3 电压检测电路
为实现闭环控制与电压显示,系统设计了电压采样电路。通过电阻分压方式将输出电压按比例缩小到单片机可测范围(0~5V),再通过ADC0832模数转换芯片采样输入。ADC0832为8位双通道A/D转换器,具有较高的采样精度和转换速度。
电压检测公式为:
Vload = (ADC值 / 255) × 5 × 分压系数
若分压系数为10,则满量程对应输出电压50V。
2.4 电流检测电路
电流检测部分采用ACS712霍尔电流传感器模块。该模块可实现电流的隔离检测,输出电压与输入电流呈线性关系,灵敏度典型值为185mV/A(ACS712-05B)。其输出信号经ADC采样送入单片机,用于实时监测输出电流。
计算公式为:
I = (Vout - 2.5) / 0.185
当系统检测电流超过用户设定值时,单片机控制蜂鸣器报警或关闭输出。
2.5 温度检测电路
系统采用DS18B20数字温度传感器实现温度检测。该传感器具有单总线通信功能,可直接与单片机I/O口相连,测温精度可达 ±0.5℃。其测温范围为 -55℃~125℃,足以监测电源内部环境。
单片机定时读取温度值,当检测到温度超过阈值(如70℃),系统执行过温报警。
2.6 显示与报警电路
显示部分采用LCD1602液晶显示屏,负责实时显示系统运行参数,包括:
- 输出电压;
- 输出电流;
- 当前温度;
- 系统状态(正常/过流/过温等)。
报警部分由蜂鸣器和指示灯组成。当检测到异常时,单片机输出控制信号驱动蜂鸣器鸣响并点亮报警LED,提醒用户及时处理。
3. 系统程序设计
系统软件采用C语言编写,开发环境为Keil uVision。程序结构采用模块化设计,包括主程序、DAC控制程序、ADC采样程序、温度检测程序、显示程序、报警控制程序等部分。
3.1 主程序设计
主程序负责系统初始化、数据采集与实时控制逻辑的执行,整体流程如下:
- 初始化各模块(LCD、DAC、ADC、DS18B20等);
- 从按键读取目标电压与电流设定值;
- 周期性采集实际电压、电流、温度;
- 比较设定值与实际值,进行输出调整与报警控制;
- 实时刷新LCD显示。
主程序示例:
#include <reg52.h>
#include "lcd1602.h"
#include "adc0832.h"
#include "dac0832.h"
#include "ds18b20.h"
#define BUZZER P2_0
float set_voltage = 12.0; // 目标电压
float limit_current = 2.0; // 电流限制
float vout, iout, temp;
void main()
{
lcd_init();
adc_init();
dac_init();
ds18b20_init();
BUZZER = 0;
while(1)
{
vout = get_voltage();
iout = get_current();
temp = get_temp();
lcd_display(vout, iout, temp);
dac_output(set_voltage);
protect_check(iout, temp);
}
}
3.2 DAC控制程序设计
DAC0832输出程序用于根据目标电压计算数字输入值,并写入DAC芯片,实现数控调压:
void dac_output(float target)
{
unsigned char data;
data = (unsigned char)(target / 5.0 * 255);
dac0832_write(data);
}
3.3 电压采样程序设计
ADC0832用于检测输出电压,通过模拟通道读取电压分压信号:
float get_voltage()
{
unsigned char adc_val = adc0832_read(0);
return (adc_val / 255.0) * 5.0 * 10; // 分压系数10
}
3.4 电流采样程序设计
电流检测通过ACS712模块实现:
float get_current()
{
unsigned char adc_val = adc0832_read(1);
float v = adc_val * 5.0 / 255.0;
return (v - 2.5) / 0.185; // 0.185V/A灵敏度
}
3.5 温度检测程序设计
温度检测模块调用DS18B20单总线通信函数读取温度:
float get_temp()
{
int temp_raw = ds18b20_read();
return temp_raw * 0.0625;
}
3.6 报警与保护程序设计
报警模块根据当前电流与温度判断是否超过安全值,控制蜂鸣器报警:
void protect_check(float i, float t)
{
if(i > limit_current)
{
BUZZER = 1;
lcd_show_status("过流报警!");
}
else if(t > 70)
{
BUZZER = 1;
lcd_show_status("过温报警!");
}
else
{
BUZZER = 0;
lcd_show_status("系统正常");
}
}
3.7 显示程序设计
LCD1602显示当前实时数据:
void lcd_display(float v, float i, float t)
{
lcd_set_cursor(0,0);
lcd_printf("U=%.1fV I=%.2fA", v, i);
lcd_set_cursor(0,1);
lcd_printf("T=%.1fC", t);
}
4. 系统运行与性能分析
系统上电后,单片机初始化所有模块并进入循环检测状态。实验结果显示:
- 当调节设定电压时,DAC输出电压平稳变化;
- 实际电压误差控制在±0.2V以内;
- 电流测量误差不超过±0.05A;
- 当电流超过设定上限时,蜂鸣器及时报警;
- 当设备温度超过70℃,系统进入保护模式;
- LCD显示实时更新,无闪烁现象。
系统整体运行稳定,响应速度快,电压调整平滑,能够满足实验室电源、电子设备测试等场景的需求。
5. 总结
本设计实现了一种基于51单片机的可调数控电源系统,集电压调节、电流检测、温度报警与人机显示于一体。该系统采用DAC与ADC协同,实现了模拟量的精确调节与采样;通过软件逻辑实现过流、过温保护,提高了电源的智能化与安全性。其结构简单、成本低廉、扩展性强,适用于科研实验、教学演示及电源测试等多种应用场合。
252