当前位置: 首页 > article >正文

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

引言

本项目旨在基于STM32微控制器设计一个数控DC-DC供电系统。该系统使用STM32作为核心控制单元,通过PWM控制DC-DC转换器的输出电压,结合反馈电路对输出电压和电流进行检测,实现精准的数控调节。系统可以设置输出电压、电流限值,并实现自动保护功能,以适应多种电源供电场景。本文将从硬件设计、软件控制算法、系统实现及故障排查等方面详细阐述本系统的实现过程。


环境准备

1. 硬件设备
  • STM32F103C8T6 开发板(或其他 STM32 系列):用于实现PWM控制、数据采集和反馈控制。
  • DC-DC升降压转换模块:通过PWM控制的方式调节输出电压。
  • 分流电阻:用于输出电流的测量。
  • 电压检测电路(如分压电路):用于检测输出电压。
  • 电流检测电路(如霍尔传感器或分流器):用于输出电流检测。
  • LCD显示屏(如1602或OLED屏幕):用于显示输出电压、电流和状态信息。
  • 电位器或旋钮:用于用户设置目标电压和电流限值。
  • 稳压电源模块:为系统供电。
2. 软件工具
  • STM32CubeMX:用于配置STM32的外设,并生成代码框架。
  • Keil uVision 或 STM32CubeIDE:用于编写、调试和下载代码。
  • ST-Link驱动程序:用于将程序下载至STM32开发板。
  • 串口调试工具:用于调试数据输出和查看系统状态。

项目实现

1. 硬件连接
  1. DC-DC转换器控制:DC-DC模块的控制引脚连接至STM32的PWM输出引脚(如PA0),通过调整PWM占空比来控制DC-DC模块的输出电压。

  2. 电压检测电路:将DC-DC模块的输出电压通过分压电路连接至STM32的ADC引脚(如PA1),用于实时检测输出电压。

  3. 电流检测电路:通过分流电阻或霍尔电流传感器检测输出电流,将电流信号输入STM32的ADC引脚(如PA2),用于电流监控和保护。

  4. LCD显示屏:通过I2C或SPI连接STM32,用于显示当前输出的电压、电流和系统状态信息。

  5. 用户输入设置:通过旋钮或电位器输入目标电压和电流限值,连接到STM32的ADC引脚(如PA3、PA4),供用户调节参数。

2. STM32CubeMX 配置
  1. 选择开发板型号:在STM32CubeMX中选择STM32F103C8T6。
  2. 配置系统时钟:设置系统时钟为HSI,确保系统的稳定性。
  3. 配置PWM:设置用于DC-DC转换器控制的PWM输出频率和占空比。
  4. 配置ADC:分别用于读取电压反馈、电流反馈以及用户设定值。
  5. 配置I2C或SPI:用于连接LCD显示屏。
  6. 生成代码:选择Keil或STM32CubeIDE作为工具链,生成代码框架。
3. 编写主程序

基于生成的代码框架,编写电压电流检测、PWM调节和保护逻辑代码。以下为数控DC-DC供电系统的核心代码示例:

#include "stm32f1xx_hal.h"

// 定义引脚
#define PWM_PIN GPIO_PIN_0             // 控制DC-DC模块的PWM输出引脚
#define VOLTAGE_ADC_CHANNEL ADC_CHANNEL_1  // 电压检测的ADC通道
#define CURRENT_ADC_CHANNEL ADC_CHANNEL_2  // 电流检测的ADC通道
#define TARGET_VOLTAGE_CHANNEL ADC_CHANNEL_3 // 目标电压设置的ADC通道
#define TARGET_CURRENT_CHANNEL ADC_CHANNEL_4 // 目标电流设置的ADC通道
#define GPIO_PORT GPIOA

// 变量声明
float output_voltage = 0.0;
float output_current = 0.0;
float target_voltage = 0.0;
float target_current = 0.0;
uint8_t pwm_duty_cycle = 0;

// 函数声明
void PWM_SetDutyCycle(uint8_t duty);
float Read_ADC_Value(uint32_t channel);
void Display_Data(void);
void Control_Loop(void);

// PWM占空比设置函数
void PWM_SetDutyCycle(uint8_t duty) {
    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, duty);
}

// 读取ADC值并转换为电压或电流
float Read_ADC_Value(uint32_t channel) {
    ADC_ChannelConfTypeDef sConfig = {0};
    sConfig.Channel = channel;
    sConfig.Rank = ADC_REGULAR_RANK_1;
    sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
    HAL_ADC_ConfigChannel(&hadc1, &sConfig);
    
    HAL_ADC_Start(&hadc1);
    HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
    uint32_t adc_value = HAL_ADC_GetValue(&hadc1);
    
    // 根据采集到的ADC值换算成实际电压或电流
    return (float)(adc_value * 3.3 / 4095); // 假设3.3V供电,12位ADC
}

// 控制逻辑
void Control_Loop(void) {
    // 读取目标电压和目标电流
    target_voltage = Read_ADC_Value(TARGET_VOLTAGE_CHANNEL);
    target_current = Read_ADC_Value(TARGET_CURRENT_CHANNEL);
    
    // 读取输出电压和电流
    output_voltage = Read_ADC_Value(VOLTAGE_ADC_CHANNEL);
    output_current = Read_ADC_Value(CURRENT_ADC_CHANNEL);
    
    // 控制电压,逐步调整PWM占空比使得输出电压接近目标值
    if (output_voltage < target_voltage) {
        pwm_duty_cycle++;
    } else if (output_voltage > target_voltage) {
        pwm_duty_cycle--;
    }
    PWM_SetDutyCycle(pwm_duty_cycle);

    // 过流保护
    if (output_current > target_current) {
        PWM_SetDutyCycle(0);  // 超过电流限值则关断PWM
    }
}

int main(void) {
    HAL_Init();
    SystemClock_Config();
    
    MX_GPIO_Init();
    MX_ADC1_Init();
    MX_TIM1_Init();
    MX_I2C1_Init(); // 假设使用I2C显示屏
    
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);  // 开启PWM
    
    while (1) {
        Control_Loop();     // 调用控制循环
        Display_Data();     // 显示数据
        HAL_Delay(100);     // 控制循环延时
    }
}
4. 电压和电流检测

电压和电流的检测通过ADC采样实现,检测信号通过分压电阻(电压)和分流电阻(电流)获得。通过计算公式将ADC值转换为实际电压或电流值。

#include "stm32f1xx_hal.h"

// 读取ADC并转换为实际电压或电流
float Read_ADC_Value(uint32_t channel) {
    ADC_ChannelConfTypeDef sConfig = {0};
    sConfig.Channel = channel;
    sConfig.Rank = ADC_REGULAR_RANK_1;
    HAL_ADC_ConfigChannel(&hadc1, &sConfig);
    
    HAL_ADC_Start(&hadc1);
    HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
    uint32_t adc_value = HAL_ADC_GetValue(&hadc1);
    
    return (float)(adc_value * 3.3 / 4095); // 假设3.3V参考电压,12位ADC
}
5. LCD显示功能

使用I2C或SPI接口连接LCD显示屏,通过串行协议向显示屏发送电压、电流等信息。

#include "i2c_lcd.h"

void Display_Data(void) {
    char buffer[16];
    
    // 显示电压
    sprintf(buffer, "Voltage: %.2f V", output_voltage);
    I2C_LCD_WriteString(buffer, 0, 0); // 假设0行显示电压
    
    // 显示电流
    sprintf(buffer, "Current: %.2f A", output_current);
    I2C_LCD_WriteString(buffer, 1, 0); // 假设1行显示电流
}
6. 智能控制原理
  • 电压控制:通过调节PWM的占空比控制DC-DC模块的输出电压,使得输出电压稳定在目标值附近。
  • 过流保护:实时检测输出电流,当电流超过限值时自动关断PWM输出,避免电源和负载损坏。
  • 用户输入设置:用户可以通过旋钮设定目标电压和电流限值,系统根据设定值调整PWM并控制输出。
  • 数据反馈显示:实时显示输出电压、电流和系统状态,方便用户观察系统运行情况。

常见问题与解决方法

  • 输出电压不稳定

    • 检查DC-DC模块的反馈电路,确保反馈信号连接正确。
    • 检查PWM输出频率和占空比设置,确认与DC-DC模块兼容。
  • 电流过大导致关断频繁

    • 检查负载情况,确保电流设置在安全范围内。
    • 检查分流电阻或电流传感器是否接触良好。
  • 显示屏无显示

    • 检查I2C或SPI的引脚连接,确保通信协议正确。
    • 检查LCD显示屏驱动代码,确保初始化无误。

结论

本数控DC-DC供电系统基于STM32控制器,通过PWM控制DC-DC模块的输出,实现了输出电压的精确调节、过流保护及数据实时显示。系统采用电压反馈和电流限制,实现了稳定、可靠的电源输出。该系统适用于实验室电源、嵌入式设备供电等多种应用场景,展示了STM32在工业控制中的广泛应用潜力。


http://www.kler.cn/a/378902.html

相关文章:

  • 【Linux】命令行参数 | 环境变量
  • 代码随想录第十五天| 110.平衡二叉树 、 257. 二叉树的所有路径 、404.左叶子之和、222.完全二叉树的节点个数
  • Linux curl命令下载显示时间/速度/大小
  • Linux:网络协议socket
  • 2、liunx网络基础
  • SpringKafka生产者、消费者消息拦截
  • 【MyBatis源码】SqlSession实例创建过程
  • 《Python修炼秘籍》01踏上编程之旅
  • 大零售时代下融合发展的新路径:定制开发技术的应用与思考
  • IT 运维:流量回溯与视频质量监控的秘籍
  • vue3项目中实现el-table分批渲染表格
  • scrapy服务器重试机制失效问题
  • 【生物学&水族馆】观赏淡水鱼检测系统源码&数据集全套:改进yolo11-dysample
  • Python规整电商编码
  • docker 启动 neo4j
  • STM32 透传简易实现的软件方法
  • 基于SpringBoot的“CSGO赛事管理系统”的设计与实现(源码+数据库+文档+PPT)
  • ESP8266 自定义固件烧录-Tcpsocket固件
  • java脚手架系列12-mongoDB
  • 10天进阶webpack---(1)为什么要有webpack
  • 【数据分享】2024年我国省市县三级的休闲娱乐设施数量(免费获取/18类设施/Excel/Shp格式)
  • 中文词向量质量的评估
  • 服务器开启SSH允许远程连接服务
  • Springboot 内置缓存与整合Redis作为缓存
  • 7-12 检查密码
  • LeetCode 203. 移除链表元素(java)