基于单片机的双档输出数字直流电压源设计

基于单片机的双档输出数字直流电压源设计

点击链接下载资料:https://download.csdn.net/download/m0_51061483/91933134


1. 系统功能概述

本系统设计的核心目标是实现一个基于单片机控制的双档输出数字直流电压源,能够在 0~1V 和 1~36V 两个档位之间切换,并通过数字化方式精确控制输出电压大小。系统支持用户自定义电压设定、实时电压显示、过载保护及精确测量功能,确保电压源的安全性与稳定性。

主要功能包括:

  1. 双档输出范围:系统通过继电器或电子开关实现 0~1V 与 1~36V 两档输出切换。
  2. 数字化调节输出:采用单片机控制 DAC 数字-模拟转换模块,输出精确控制电压。
  3. 高功率输出:最大输出功率不低于 10W,可满足大负载条件下稳定供电。
  4. 实时监测:通过 ADC 模块采集输出电压信号,反馈至单片机进行实时校准与显示。
  5. 数据显示:LCD1602 或数码管显示当前输出电压、工作档位及状态信息。
  6. 智能保护机制:当检测到输出异常(如电压超限、短路或负载过大)时,系统自动关闭输出,保护电路安全。

该设计具有结构简洁、成本低、精度高、扩展性强等特点,适合电子实验室、电源调试及教学演示等场景使用。


2. 系统电路设计

整个系统以 STC89C52 单片机 为核心控制单元,配合 数模转换电路(DAC0832)电压放大模块ADC 检测模块显示模块按键输入模块 实现双档数字直流电压输出与监测功能。各模块的设计如下所述。


2.1 单片机控制模块

系统采用 STC89C52 单片机作为核心控制器。该芯片基于 8051 内核,具有 8 位并行数据总线、丰富的 I/O 接口以及支持外部中断的能力,非常适合数字电压控制系统。

主要功能包括:

  • 控制 DAC 输出电压;
  • 采集 ADC 电压反馈信号;
  • 通过按键读取用户设定电压;
  • 控制档位切换继电器;
  • 驱动显示模块;
  • 执行保护逻辑。

为了保证系统运行的稳定性,单片机电源部分采用稳压芯片 AMS1117-5.0 提供稳定的 5V 电源,并在输入输出端配置电容滤波,抑制干扰。


2.2 数字-模拟转换模块(DAC0832)

DAC0832 是一款 8 位分辨率的数模转换芯片,用于将单片机输出的数字信号转化为模拟电压信号。通过调节 DAC0832 的输入数据,能够生成与之对应的精确电压输出。

在本系统中,DAC0832 的输出范围为 0~5V,通过后级放大电路可扩展到 0~36V 范围。单片机通过并行数据线 P0 口输出电压数据,经由 DAC0832 转换为对应的模拟电压信号,从而实现电压的精确调节。


2.3 放大与稳压输出模块

DAC 输出的 0~5V 电压经过运算放大电路(采用 LM324OPA2134)进行比例放大。放大倍数由反馈电阻确定,以满足 0~36V 的输出需求。

同时,输出端采用功率型三极管(如 2N3055TIP41C)作为电流放大器,保证在大负载(如 10W 输出)下仍能稳定供电。此外,为了防止负载短路或过压,输出端配置了稳压管与保险丝双重保护。


2.4 电压采样与检测模块(ADC0832)

系统使用 ADC0832 模数转换芯片,将输出电压信号进行采样反馈。ADC0832 是一款 8 位双通道 ADC,可通过 SPI 通讯与单片机通信。单片机实时读取输出电压并进行与设定值对比,实现闭环控制。

此外,系统设计中还增加了采样电阻分压网络,将高电压信号(如 36V)降低到 ADC 可接受范围内(0~5V),确保数据采集安全可靠。


2.5 档位切换模块

为实现 0~1V 与 1~36V 双档输出,系统采用 继电器控制电路。当用户按键选择不同档位时,单片机控制继电器切换对应的放大路径。

  • 低压档(0~1V):DAC 输出经限幅放大电路直接输出;
  • 高压档(1~36V):DAC 输出经功率放大模块进行二级放大。

继电器切换时,系统会暂时断开输出,以防止档位切换过程中产生电压突变损坏负载。


2.6 显示与人机交互模块

系统采用 LCD1602 显示模块,用于实时显示设定电压值、实际输出电压以及工作档位等信息。LCD1602 通过 4 位或 8 位数据总线与单片机连接,指令与数据分离传输,保证显示稳定。

按键模块包括:

  • "档位切换键":用于在 0~1V 与 1~36V 之间切换;
  • "电压调节键":用于增加或减少输出设定值;
  • "确认键":用于锁定输出。

同时系统配有 LED 指示灯,用于显示当前档位与输出状态(如"运行""待机""过载"等)。


3. 系统程序设计

程序部分采用 C 语言 编写,基于 Keil uVision 开发环境。程序主要分为五个功能模块:主控制程序、DAC 控制模块、ADC 检测模块、LCD 显示模块、按键输入模块。程序设计强调结构清晰、逻辑严谨及可移植性强。


3.1 主控制程序

主控制程序是系统运行的核心部分,负责协调各模块之间的数据交互与控制逻辑。其主要流程包括系统初始化、档位检测、电压输出控制、实时监测与显示更新。

核心代码如下:

复制代码
#include <reg52.h>
#include "lcd1602.h"
#include "dac0832.h"
#include "adc0832.h"
#include "key.h"

unsigned char mode = 0;     // 档位标志:0=低压档,1=高压档
unsigned int set_voltage = 0;   // 设定电压
unsigned int real_voltage = 0;  // 实际电压

void main()
{
    LCD_Init();
    DAC0832_Init();
    ADC0832_Init();
    Key_Init();

    LCD_ShowString(0,0,"Digital PSU");
    while(1)
    {
        mode = Key_Scan_Mode(); 
        set_voltage = Key_Scan_Voltage();
        DAC0832_Output(set_voltage, mode);
        real_voltage = ADC0832_Read();

        LCD_ShowVoltage(set_voltage, real_voltage, mode);
        Check_Protection(real_voltage, set_voltage);
    }
}

3.2 DAC 控制程序设计

DAC0832 模块的核心在于将数字信号转换为模拟电压输出。通过并行接口将 8 位电压数据写入 DAC0832 寄存器,即可获得相应电压。

复制代码
#include <reg52.h>
#define DAC_PORT P0
sbit WR = P2^6;
sbit CS = P2^7;

void DAC0832_Output(unsigned int voltage, unsigned char mode)
{
    unsigned char data_value;
    if(mode == 0)
        data_value = (unsigned char)(voltage * 255 / 1000);  // 低压档
    else
        data_value = (unsigned char)(voltage * 255 / 36000); // 高压档

    CS = 0;
    DAC_PORT = data_value;
    WR = 0;
    WR = 1;
    CS = 1;
}

3.3 ADC 检测程序设计

ADC0832 采样模块用于读取输出电压反馈值,转换为数字信号供单片机使用。程序采用 SPI 通讯方式实现。

复制代码
#include <reg52.h>
sbit CLK = P3^0;
sbit DI  = P3^1;
sbit DO  = P3^2;
sbit CS  = P3^3;

unsigned int ADC0832_Read()
{
    unsigned char i, dat=0;
    CS = 0;
    CLK = 0;
    DI = 1; CLK = 1; CLK = 0;
    DI = 0; CLK = 1; CLK = 0;
    DI = 0; CLK = 1; CLK = 0;

    for(i=0;i<8;i++)
    {
        CLK=1;
        dat = (dat<<1) | DO;
        CLK=0;
    }
    CS=1;
    return dat;
}

3.4 LCD 显示模块程序

LCD 模块用于输出系统信息,显示设定电压、实际电压和档位。显示函数如下:

复制代码
void LCD_ShowVoltage(unsigned int set, unsigned int real, unsigned char mode)
{
    char str[16];
    LCD_SetCursor(0,0);
    sprintf(str,"Set:%2uV  Mode:%u",set,mode);
    LCD_ShowString(0,0,str);

    LCD_SetCursor(0,1);
    sprintf(str,"Real:%2uV",real);
    LCD_ShowString(0,1,str);
}

3.5 按键控制模块

按键模块负责读取用户输入,包括电压增减、档位切换、确认操作。程序利用消抖与状态检测保证输入可靠。

复制代码
#include <reg52.h>
sbit KEY_ADD = P1^0;
sbit KEY_SUB = P1^1;
sbit KEY_MODE = P1^2;

unsigned int Key_Scan_Voltage()
{
    static unsigned int voltage = 0;
    if(KEY_ADD == 0) { voltage += 1; while(KEY_ADD==0); }
    if(KEY_SUB == 0) { voltage -= 1; while(KEY_SUB==0); }
    if(voltage > 36000) voltage = 36000;
    return voltage;
}

unsigned char Key_Scan_Mode()
{
    static unsigned char mode = 0;
    if(KEY_MODE == 0) { mode = !mode; while(KEY_MODE==0); }
    return mode;
}

4. 系统运行原理与特点

当系统上电后,单片机完成初始化并进入主循环。用户可通过按键设定电压值与输出档位。单片机根据设定参数控制 DAC0832 输出对应电压,经放大模块输出至负载。ADC0832 同时采集输出电压反馈数据,与设定值进行比较,并实时在 LCD 上显示。若检测到输出异常(如超压或过载),系统会自动切断输出并显示报警信息。

系统特点如下:

  1. 双档可调输出,兼顾高精度与大功率;
  2. 数字化控制,电压设定简便直观;
  3. 实时监测闭环反馈,输出稳定可靠;
  4. 模块化设计,便于扩展与维护;
  5. 安全保护完善,有效防止误操作与损坏。

5. 总结

本设计实现了一个基于 51 单片机的双档输出数字直流电压源系统,通过软硬件结合,实现了电压的数字化控制与精确输出。系统具有良好的稳定性与扩展性,不仅能满足实验室精密电压调节需求,也可作为教学与科研平台,展示数字电源的控制原理与应用。

相关推荐
牛马大师兄3 小时前
STM32独立看门狗IWDG与窗口看门狗WWDG知识梳理笔记
笔记·stm32·单片机·嵌入式硬件·嵌入式·看门狗
夜月yeyue3 小时前
STM32 Flash 访问加速器详解(ART Accelerator)
linux·单片机·嵌入式硬件·uboot·bootloard
国科安芯7 小时前
ASP4644芯片低功耗设计思路解析
网络·单片机·嵌入式硬件·安全
充哥单片机设计7 小时前
【STM32项目开源】基于STM32的智能厨房火灾燃气监控
stm32·单片机·嵌入式硬件
毕设源码-江学长8 小时前
计算机毕业设计java共享茶室预约微信小程序 微信小程序中的共享茶室预订平台 茶室共享预约小程序的设计与开发
java·微信小程序·课程设计
CiLerLinux15 小时前
第四十九章 ESP32S3 WiFi 路由实验
网络·人工智能·单片机·嵌入式硬件
时光の尘15 小时前
【PCB电路设计】常见元器件简介(电阻、电容、电感、二极管、三极管以及场效应管)
单片机·嵌入式硬件·pcb·二极管·电感·三极管·场效应管
Lu Zelin15 小时前
单片机为什么不能跑Linux
linux·单片机·嵌入式硬件
Wave84520 小时前
STM32--智能小车
stm32·单片机·嵌入式硬件