基于STM32的数控DC-DC供电系统设计

引言

本项目设计了一个基于STM32的数控DC-DC供电系统。该系统可以通过数字信号控制DC-DC转换器的输出电压,实现对电源的精准调节。用户可以通过按键或远程命令调整输出电压,系统通过ADC实时监测输出电压和电流,并在OLED显示屏上显示当前的输出状态。该项目适用于电池充电、实验室电源调试等场合。

环境准备

1. 硬件设备
  • STM32F103C8T6 开发板(或其他 STM32 系列)
  • DC-DC转换模块(如 LM2596 可调模块)
  • DAC 模块(如 MCP4725,用于数字控制DC-DC模块)
  • 电压、电流检测模块(如 INA219,用于测量输出电压和电流)
  • OLED 显示屏(用于显示电压、电流和状态信息)
  • 按键(用于调节电压)
  • 面包板和杜邦线
  • USB-TTL 串口调试工具
2. 软件工具
  • STM32CubeMX:用于初始化 STM32 外设。
  • Keil uVision 或 STM32CubeIDE:用于编写和下载代码。
  • ST-Link 驱动程序:用于下载程序到 STM32。

项目实现

1. 硬件连接
  • DAC 模块连接:将 MCP4725 的 SDA 和 SCL 引脚连接到 STM32 的 I2C 接口(如 PB6 和 PB7),用于控制 DC-DC 输出电压。
  • 电压、电流检测模块连接:将 INA219 的 SDA 和 SCL 引脚连接到 STM32 的 I2C 接口(如 PB6 和 PB7),用于监测 DC-DC 的输出电压和电流。
  • DC-DC模块连接:连接输入电源(如12V直流电源)到DC-DC模块,DC-DC模块的输出端接入负载,调节引脚由 DAC 输出控制。
  • 按键连接:将增加和减少电压的按键连接到 STM32 的 GPIO 引脚(如 PA0 和 PA1)。
  • OLED 显示屏连接:将 OLED 的 SDA 和 SCL 引脚连接到 STM32 的 I2C 接口(如 PB6 和 PB7),用于显示当前电压和电流。
2. STM32CubeMX 配置
  • 打开 STM32CubeMX,选择你的开发板型号。
  • 配置系统时钟为 HSI,确保系统稳定运行。
  • 配置 GPIO 引脚用于按键输入。
  • 配置 I2C 用于与 MCP4725 DAC、INA219 电压电流检测模块和 OLED 显示屏通信。
  • 配置 ADC 用于测量输出电压(如果需要)。
  • 生成代码,选择 Keil 或 STM32CubeIDE 作为工具链。
3. 编写主程序

在生成的项目基础上,编写输出电压调节、数据采集、显示以及按键输入处理的代码。以下是数控DC-DC供电系统的基本代码示例:

#include "stm32f1xx_hal.h"
#include "mcp4725.h"
#include "ina219.h"
#include "oled.h"

// 定义初始电压
#define INITIAL_VOLTAGE 3.3
#define VOLTAGE_STEP 0.1 // 每次按键调整的电压步长

// 定义引脚
#define BUTTON_UP_PIN GPIO_PIN_0
#define BUTTON_DOWN_PIN GPIO_PIN_1
#define BUTTON_PORT GPIOA

// 函数声明
void System_Init(void);
void Set_Output_Voltage(float voltage);
float Read_Output_Voltage(void);
float Read_Output_Current(void);
void Display_Status(float voltage, float current);
uint8_t Check_Button(uint16_t pin);
void Adjust_Voltage(uint8_t direction);

// 全局变量
float target_voltage = INITIAL_VOLTAGE;

void System_Init(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_I2C1_Init();
    
    OLED_Init();
    MCP4725_Init();
    INA219_Init();
    
    OLED_ShowString(0, 0, "DC-DC System Ready");
    Set_Output_Voltage(target_voltage);  // 初始化输出电压
}

// 设置输出电压
void Set_Output_Voltage(float voltage)
{
    uint16_t dac_value = (voltage / 5.0) * 4095; // 假设 DAC 最大输出电压为 5V,12位分辨率
    MCP4725_SetOutput(dac_value);
}

// 读取输出电压
float Read_Output_Voltage(void)
{
    return INA219_ReadBusVoltage();  // 从 INA219 读取电压值
}

// 读取输出电流
float Read_Output_Current(void)
{
    return INA219_ReadCurrent();  // 从 INA219 读取电流值
}

// 显示状态
void Display_Status(float voltage, float current)
{
    OLED_Clear();
    OLED_ShowString(0, 0, "Voltage:");
    OLED_ShowFloat(64, 0, voltage, 2);
    OLED_ShowString(0, 1, "Current:");
    OLED_ShowFloat(64, 1, current, 2);
}

// 检查按键输入
uint8_t Check_Button(uint16_t pin)
{
    return HAL_GPIO_ReadPin(BUTTON_PORT, pin) == GPIO_PIN_RESET;
}

// 调节输出电压
void Adjust_Voltage(uint8_t direction)
{
    if (direction && target_voltage < 5.0)  // 增加电压,假设最大电压为 5V
    {
        target_voltage += VOLTAGE_STEP;
    }
    else if (!direction && target_voltage > 0.0)  // 减少电压,假设最小电压为 0V
    {
        target_voltage -= VOLTAGE_STEP;
    }
    Set_Output_Voltage(target_voltage);
}

int main(void)
{
    System_Init();
    
    while (1)
    {
        // 读取输出电压和电流
        float voltage = Read_Output_Voltage();
        float current = Read_Output_Current();
        
        // 显示当前状态
        Display_Status(voltage, current);
        
        // 检查按键,调节输出电压
        if (Check_Button(BUTTON_UP_PIN))
        {
            Adjust_Voltage(1);  // 增加电压
            HAL_Delay(300);  // 防抖延时
        }
        if (Check_Button(BUTTON_DOWN_PIN))
        {
            Adjust_Voltage(0);  // 减少电压
            HAL_Delay(300);  // 防抖延时
        }
        
        HAL_Delay(1000);  // 每秒更新一次显示
    }
}
4. DAC 模块控制

通过 MCP4725 模块实现 DAC 输出电压调节:

#include "mcp4725.h"

// 初始化 MCP4725
void MCP4725_Init(void)
{
    // 配置 I2C 设备地址和其他初始化参数
}

// 设置 DAC 输出
void MCP4725_SetOutput(uint16_t value)
{
    // 将 12 位数值发送给 MCP4725
}
5. 电压和电流测量

使用 INA219 模块精确测量输出电压和电流:

#include "ina219.h"

// 初始化 INA219
void INA219_Init(void)
{
    // 配置 INA219 模块,设置电流和电压范围
}

// 读取总线电压
float INA219_ReadBusVoltage(void)
{
    // 从 INA219 读取总线电压
    return 3.3; // 返回读取的电压值
}

// 读取电流
float INA219_ReadCurrent(void)
{
    // 从 INA219 读取电流值
    return 0.5; // 返回读取的电流值
}
6. OLED 显示处理

OLED 显示屏用于显示实时的电压和电流:

#include "oled.h"

// 初始化 OLED
void OLED_Init(void)
{
    // OLED 初始化代码
}

// 显示字符串
void OLED_ShowString(uint8_t x, uint8_t y, char *str)
{
    // 在 OLED 上显示字符串
}

// 显示浮点数
void OLED_ShowFloat(uint8_t x, uint8_t y, float num, uint8_t decimal_places)
{
    // 显示带小数点的数值
}

⬇帮大家整理了单片机的资料

包括stm32的项目合集【源码+开发文档】

点击下方蓝字即可领取,感谢支持!⬇

点击领取更多嵌入式详细资料

问题讨论,stm32的资料领取可以私信!

 

7. 系统工作原理
  • 输出电压控制:通过 MCP4725 DAC 模块输出电压来调节 DC-DC 转换器的反馈电压,从而改变 DC-DC 转换器的输出电压。
  • 数据采集与监测:使用 INA219 模块实时监测 DC-DC 转换器的输出电压和电流,并通过 I2C 接口读取数据。
  • 用户交互:用户可以通过按键调整输出电压,OLED 显示屏实时显示当前的输出电压和电流,便于用户进行精确控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值