基于RT-Thread与NB-IoT的开关柜应急电源系统设计
一、系统概述
开关柜应急电源是电力系统关键设备,用于在市电中断时提供临时电力,确保开关柜保护装置、监控系统持续运行。本设计基于RT-Thread实时操作系统与NB-IoT低功耗广域网,实现市电监测、电池管理、逆变输出、远程监控一体化功能,具备高可靠性、低功耗、易维护特点,适用于变电站、工业配电房等场景。
二、系统架构与硬件设计
1. 系统架构
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),RXD接PA10(USART1_TX),波特率9600bps;RESET接PA3(GPIO输出),用于复位模组;PWRKEY接PA4(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)便于云平台集成,可广泛应用于电力系统、工业控制等领域,为关键设备提供可靠的应急电力保障。
更多推荐
所有评论(0)