一、系统概述

开关柜应急电源是电力系统关键设备,用于在市电中断时提供临时电力,确保开关柜保护装置、监控系统持续运行。本设计基于RT-Thread实时操作系统与NB-IoT低功耗广域网,实现市电监测、电池管理、逆变输出、远程监控一体化功能,具备高可靠性、低功耗、易维护特点,适用于变电站、工业配电房等场景。

二、系统架构与硬件设计

1. 系统架构

电压检测

控制

充电管理

DC-AC逆变

输出

传感器采集

通信

MQTT

JSON

显示/输入

供电

供电

供电

供电

供电

供电

供电

市电输入 220V

STM32主控 RT-Thread

电池组 12V/20Ah锂电池

TP5100充电芯片

纯正弦波逆变器 300W

开关柜负载

电压/电流/温度传感器

NB-IoT模组 BC95

云平台 华为云IoT

手机APP/Web监控端

LCD1602+OLED

电源管理 5V/3.3V

2. 核心硬件选型

模块 型号/参数 功能
主控 STM32L431RCT6(Cortex-M4,80MHz,256KB Flash,64KB RAM) 运行RT-Thread,处理电源控制、通信、传感器数据
电池 12V/20Ah磷酸铁锂电池组 应急电源(支持300W负载30分钟)
充电管理 TP5100(2A锂电池充电芯片) 市电正常时给电池充电,过充/过放保护
逆变模块 纯正弦波逆变器(12V→220V/300W) 将电池直流电转换为交流电输出
传感器 电压检测(分压电路+ADC)、ACS712(电流检测)、DS18B20(温度) 监测输入/输出电压、电流、电池温度
通信 NB-IoT模组(BC95,UART接口) 低功耗远程通信(MQTT协议,支持PSM模式)
显示 LCD1602(2行16列)+0.96寸OLED(128×64) 本地显示状态(电压、电量、故障)
电源 明纬5V/3A适配器+AMS1117-3.3V 系统供电(主控/传感器3.3V,逆变器5V)

3. 关键电路设计

(1)市电检测与逆变控制
  • 市电检测:通过电压互感器(PT) 将220V市电降压至0-3.3V,接入STM32的PA0(ADC1_IN0),检测市电有无;

  • 逆变控制:STM32的PB0(GPIO输出) 控制逆变器启停(高电平启动,低电平停止),PB1(PWM输出) 调节逆变输出(可选)。

(2)电池管理电路
  • 充电电路:TP5100的VIN接市电整流后5V,BAT接电池组,STAT引脚接STM32的PA1(GPIO输入),用于检测充电状态(充满/充电中/故障);

  • 电量检测:通过电压采样电路(10kΩ+5kΩ分压)将电池电压(0-12V)转换为0-3.3V,接入PA2(ADC1_IN2),结合温度补偿估算SOC(荷电状态)。

(3)NB-IoT通信电路
  • BC95模组TXD接STM32的PA9(USART1_RX)RXDPA10(USART1_TX),波特率9600bps;RESETPA3(GPIO输出),用于复位模组;PWRKEYPA4(GPIO输出),低电平3秒开机。

三、软件设计(基于RT-Thread的C语言实现)

1. 开发环境

  • OS:RT-Thread 4.0.3(支持STM32L431,含AT指令库、cJSON、MQTT客户端)

  • IDE:RT-Thread Studio 2.2.6

  • 工具链:ARM GCC 10.2.1

  • 关键组件device(设备驱动)、finsh(命令行调试)、at_device(AT指令驱动NB-IoT)、paho.mqtt.embedded-c(MQTT协议)

2. 系统初始化与线程创建

#include <rtthread.h>
#include <board.h>
#include <rtdevice.h>
#include "drv_adc.h"
#include "drv_uart.h"
#include "battery.h"
#include "inverter.h"
#include "nb_iot.h"
#include "sensor.h"
#include "lcd.h"

// 系统状态结构体
typedef struct {
    uint8_t mains_status;  // 市电状态(0:断电,1:正常)
    uint8_t inverter_status; // 逆变状态(0:停止,1:运行)
    float battery_voltage;  // 电池电压(V)
    float battery_soc;     // 电池电量(%)
    float output_voltage;  // 输出电压(V)
    float output_current;  // 输出电流(A)
    float temperature;     // 电池温度(℃)
    uint8_t fault_code;     // 故障码(0:无故障,1:过压,2:过流,3:过温)
} SystemState;

SystemState sys_state = {0};

int main(void) {
    // 1. RT-Thread初始化
    rtthread_startup();

    // 2. 硬件初始化(由RT-Thread自动完成,或手动补充)
    MX_GPIO_Init();
    MX_ADC1_Init();
    MX_USART1_Init();
    MX_I2C1_Init();

    // 3. 创建系统线程
    rt_thread_t thread_mains = rt_thread_create("mains_mon", mains_monitor_thread, NULL, 1024, 3, 10);
    rt_thread_t thread_battery = rt_thread_create("bat_manage", battery_manage_thread, NULL, 1024, 4, 10);
    rt_thread_t thread_inverter = rt_thread_create("inv_ctrl", inverter_control_thread, NULL, 1024, 3, 10);
    rt_thread_t thread_sensor = rt_thread_create("sensor", sensor_collect_thread, NULL, 1024, 2, 10);
    rt_thread_t thread_nbiot = rt_thread_create("nbiot", nb_iot_thread, NULL, 2048, 5, 10);
    rt_thread_t thread_display = rt_thread_create("display", display_thread, NULL, 1024, 1, 10);

    // 4. 启动线程
    rt_thread_startup(thread_mains);
    rt_thread_startup(thread_battery);
    rt_thread_startup(thread_inverter);
    rt_thread_startup(thread_sensor);
    rt_thread_startup(thread_nbiot);
    rt_thread_startup(thread_display);

    return 0;
}

3. 关键线程实现

(1)市电监测线程(mains_monitor_thread)

功能:检测市电状态,市电断电时自动启动逆变,市电恢复时停止逆变并切换回市电。

void mains_monitor_thread(void *param) {
    float mains_voltage;
    while (1) {
        // 1. 采集市电电压(ADC采样,分压后0-3.3V对应0-220V)
        mains_voltage = adc_get_mains_voltage();  // 自定义函数,读取PA0的ADC值并转换
        
        // 2. 判断市电状态(<50V视为断电)
        if (mains_voltage < 50.0f) {
            sys_state.mains_status = 0;  // 市电断电
            if (sys_state.inverter_status == 0) {
                inverter_start();  // 启动逆变
                sys_state.inverter_status = 1;
                rt_kprintf("Mains lost! Inverter started.\n");
            }
        } else {
            sys_state.mains_status = 1;  // 市电正常
            if (sys_state.inverter_status == 1) {
                inverter_stop();  // 停止逆变
                sys_state.inverter_status = 0;
                rt_kprintf("Mains restored! Inverter stopped.\n");
            }
        }
        rt_thread_mdelay(1000);  // 1秒检测一次
    }
}
(2)电池管理线程(battery_manage_thread)

功能:监测电池电压、温度,估算SOC,实现过充/过放/过温保护。

void battery_manage_thread(void *param) {
    float voltage, temp;
    while (1) {
        // 1. 采集电池电压(PA2的ADC值,分压后0-3.3V对应0-12V)
        voltage = adc_get_battery_voltage();
        sys_state.battery_voltage = voltage;
        
        // 2. 采集电池温度(DS18B20,单总线)
        temp = ds18b20_get_temp();
        sys_state.temperature = temp;
        
        // 3. 估算SOC(简化:电压-电量曲线拟合,12V=100%,10.5V=0%)
        if (voltage >= 12.0f) sys_state.battery_soc = 100.0f;
        else if (voltage <= 10.5f) sys_state.battery_soc = 0.0f;
        else sys_state.battery_soc = (voltage - 10.5f) / 1.5f * 100.0f;
        
        // 4. 保护逻辑
        if (voltage > 14.4f) {  // 过压保护(磷酸铁锂满电约14.4V)
            sys_state.fault_code = 1;
            inverter_stop();
            rt_kprintf("Fault: Battery overvoltage! Inverter stopped.\n");
        } else if (voltage < 10.5f) {  // 过放保护
            sys_state.fault_code = 2;
            inverter_stop();
            rt_kprintf("Fault: Battery undervoltage! Inverter stopped.\n");
        } else if (temp > 60.0f) {  // 过温保护
            sys_state.fault_code = 3;
            inverter_stop();
            rt_kprintf("Fault: Battery overtemperature! Inverter stopped.\n");
        } else {
            sys_state.fault_code = 0;  // 无故障
        }
        
        rt_thread_mdelay(2000);  // 2秒检测一次
    }
}
(3)NB-IoT通信线程(nb_iot_thread)

功能:通过NB-IoT模组连接云平台,上报状态数据,接收远程控制指令。

#include "at_device_bc95.h"
#include "paho_mqtt.h"

void nb_iot_thread(void *param) {
    at_device_t *dev;
    mqtt_client_t *client;
    char mqtt_msg[256];
    
    // 1. 初始化NB-IoT模组(AT指令)
    dev = at_device_bc95_create("bc95");  // 创建BC95设备对象
    at_device_open(dev);  // 打开设备
    at_obj_exec_cmd(dev, "AT+CFUN=1");  // 全功能模式
    at_obj_exec_cmd(dev, "AT+CGATT=1");  // 附着网络
    at_obj_exec_cmd(dev, "AT+CGDCONT=1,\"IP\",\"CTNB\"");  // 设置APN(电信NB-IoT)
    
    // 2. 连接MQTT服务器(华为云IoT)
    client = mqtt_client_new();
    mqtt_client_connect(client, "iot-mqtts.cn-north-4.myhuaweicloud.com", 1883, "client_id", "username", "password");
    
    while (1) {
        // 3. 上报状态数据(JSON格式)
        sprintf(mqtt_msg, "{\"mains_status\":%d,\"inverter_status\":%d,\"battery_voltage\":%.1f,\"battery_soc\":%.1f,\"output_voltage\":%.1f,\"output_current\":%.2f,\"temperature\":%.1f,\"fault_code\":%d}",
                sys_state.mains_status, sys_state.inverter_status,
                sys_state.battery_voltage, sys_state.battery_soc,
                sys_state.output_voltage, sys_state.output_current,
                sys_state.temperature, sys_state.fault_code);
        mqtt_client_publish(client, "/switchgear/eps/status", mqtt_msg);
        
        // 4. 接收远程控制指令(如启动/停止逆变)
        char *cmd = mqtt_client_subscribe(client, "/switchgear/eps/control");
        if (cmd != NULL) {
            cJSON *root = cJSON_Parse(cmd);
            cJSON *action = cJSON_GetObjectItem(root, "action");
            if (cJSON_IsString(action) && strcmp(action->valuestring, "start_inverter") == 0) {
                inverter_start();
            } else if (strcmp(action->valuestring, "stop_inverter") == 0) {
                inverter_stop();
            }
            cJSON_Delete(root);
            free(cmd);
        }
        
        rt_thread_mdelay(30000);  // 30秒上报一次
    }
}
(4)低功耗管理(RT-Thread低功耗模式)

功能:市电正常时,系统进入STOP模式,仅保留RTC和必要外设,降低功耗。

void enter_low_power_mode(void) {
    // 1. 配置RTC唤醒(5分钟后唤醒)
    rt_rtc_set_alarm(5 * 60);  // 5分钟=300秒
    
    // 2. 关闭非必要外设时钟
    HAL_RCC_DeInit();
    __HAL_RCC_GPIOA_CLK_DISABLE();
    __HAL_RCC_GPIOB_CLK_DISABLE();
    // ... 保留RTC、IWDG时钟
    
    // 3. 进入STOP模式
    HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
    
    // 4. 唤醒后恢复系统
    SystemClock_Config();  // 恢复系统时钟
    MX_GPIO_Init();        // 恢复GPIO配置
    // ... 其他外设恢复
}

参考代码 RT-T、NB-Iot的开关柜应急电源设计 www.youwenfan.com/contentcst/161000.html

四、系统测试与优化

1. 测试指标

参数 指标 测试方法
市电检测响应时间 <1秒 切断市电,用示波器测量逆变启动时间
逆变输出稳定性 220V±5%,50Hz±1% 用示波器测量输出电压/频率
电池续航时间 30分钟(300W负载) 满电状态下带载测试,记录放电时间
NB-IoT通信距离 ≥1公里(空旷) 不同距离测试数据上报成功率
待机功耗 <5mA(STOP模式) 万用表串联测量电源电流

2. 优化方向

  • 电池SOC估算:采用库仑计(如MAX17043)替代电压估算法,提高精度;

  • 通信可靠性:增加重传机制(3次重发)和数据校验(CRC16),避免丢包;

  • 低功耗优化:NB-IoT模组启用PSM模式(省电模式,电流<5μA),延长电池寿命;

  • 故障诊断:增加历史故障记录(存储于EEPROM),支持远程查询。

五、总结

本设计基于RT-Thread实时操作系统与NB-IoT通信,实现了开关柜应急电源的自动切换、电池管理、远程监控功能。系统通过多任务调度确保实时性,低功耗设计延长续航,标准化协议(MQTT+JSON)便于云平台集成,可广泛应用于电力系统、工业控制等领域,为关键设备提供可靠的应急电力保障。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐