1. 项目概述
欠压自恢复自合闸功能是电力系统中一项重要的保护机制,它能够在电网电压异常时自动切断电路,并在电压恢复正常后自动重新闭合。作为一名嵌入式开发者,我最近完成了一个基于单片机的欠压自恢复测试系统,通过模拟欠压和恢复电压状态来验证这一功能的可靠性。
这个项目的核心在于通过软件控制模拟电压变化,测试设备在欠压条件下的响应逻辑。我选择了STM32系列单片机作为主控芯片,配合电压采样电路和继电器控制模块,构建了一个完整的测试平台。下面我将详细介绍这个测试机制的设计思路和实现细节。
2. 硬件设计与选型
2.1 主控芯片选择
我选择了STM32F103C8T6作为主控芯片,主要基于以下几点考虑:
- 丰富的外设资源:具备多个ADC通道、定时器和通信接口
- 足够的处理能力:72MHz主频完全满足实时控制需求
- 成熟的生态系统:丰富的开发资料和社区支持
- 成本效益:价格适中,适合批量生产
提示:在实际项目中,如果对成本更敏感,也可以考虑国产替代芯片如GD32系列,但需要注意外设寄存器的差异。
2.2 电压采样电路设计
电压采样是整个系统的关键部分,我采用了以下设计方案:
- 使用电压互感器将市电220V降压到安全范围
- 通过精密电阻分压网络将信号调整到0-3.3V范围
- 添加RC低通滤波电路消除高频干扰
- 使用TVS二极管进行过压保护
电路参数计算示例:
- 假设互感器变比为220V:3.3V
- 目标采样范围180V-220V对应ADC输入2.7V-3.3V
- 分压电阻选择:R1=10kΩ,R2=20kΩ,获得1/3分压比
2.3 继电器驱动电路
继电器控制部分需要注意:
- 使用光耦隔离确保高低压部分电气隔离
- 添加续流二极管保护开关管
- 驱动电流计算:继电器线圈电阻100Ω,工作电压5V,需要50mA驱动电流
- 选用S8050三极管作为开关元件,β值>100,基极电阻选择1kΩ
3. 软件架构与实现
3.1 主程序流程设计
系统软件采用状态机架构,主要状态包括:
- 正常供电状态(220V)
- 欠压检测状态(<198V)
- 断电保护状态
- 电压恢复检测状态
- 自动合闸状态
状态转换条件:
c复制if(voltage_rms < 198) { // 欠压阈值90% of 220V
current_state = UNDER_VOLTAGE;
} else if(voltage_rms > 210 && current_state == UNDER_VOLTAGE) {
current_state = VOLTAGE_RECOVERY;
}
3.2 电压采样处理
ADC采样采用DMA方式提高效率,关键处理逻辑:
- 配置ADC为连续扫描模式
- 设置DMA循环缓冲
- 应用数字滤波算法(移动平均)
- 有效值计算:
c复制#define SAMPLE_NUM 64
uint32_t sum = 0;
for(int i=0; i<SAMPLE_NUM; i++) {
sum += adc_buffer[i] * adc_buffer[i];
}
voltage_rms = sqrt(sum / SAMPLE_NUM) * VOLTAGE_SCALE_FACTOR;
3.3 测试模式实现
项目中的测试模式通过标志位控制,模拟欠压和正常电压状态:
c复制extern u8 test_1; // 测试模式标志
if(test_1 == 1) {
// 模拟欠压状态180V
V2_1_meter_datas[cur_read_BL0939_addr*2].voltage_rms = 180;
V2_1_meter_datas[cur_read_BL0939_addr*2+1].voltage_rms = 180;
} else {
// 正常电压220V
V2_1_meter_datas[cur_read_BL0939_addr*2].voltage_rms = 220;
V2_1_meter_datas[cur_read_BL0939_addr*2+1].voltage_rms = 220;
}
4. 关键功能实现细节
4.1 欠压检测算法
欠压检测需要考虑电网波动,避免误动作:
- 设置滞回比较:欠压阈值198V,恢复阈值210V
- 延时确认:连续检测到欠压状态超过200ms才触发动作
- 快速采样:每10ms采样一次,确保实时性
实现代码片段:
c复制#define UNDER_VOLTAGE_THRESHOLD 198
#define RECOVERY_THRESHOLD 210
#define DEBOUNCE_TIME 20 // 20*10ms=200ms
static uint8_t under_voltage_counter = 0;
if(voltage_rms < UNDER_VOLTAGE_THRESHOLD) {
if(under_voltage_counter < DEBOUNCE_TIME) {
under_voltage_counter++;
} else {
trigger_protection();
}
} else {
under_voltage_counter = 0;
}
4.2 自恢复逻辑
电压恢复后的自合闸需要考虑安全因素:
- 电压稳定检测:连续5次采样都在正常范围
- 延时合闸:等待2秒确保电压真正恢复
- 负载检查:确认无短路等异常情况
- 分步合闸:先合主触点,再合辅助触点
4.3 通信接口设计
系统通过UART4与上位机通信,实现参数配置和状态监控:
c复制void V2_1_UART4_ReveiveHandle() {
// 接收数据处理
if(rx_buffer[0] == 0xAA && rx_buffer[1] == 0x55) {
// 解析命令
switch(rx_buffer[2]) {
case 0x01: // 设置电压
set_test_voltage(rx_buffer[3]);
break;
case 0x02: // 查询状态
send_device_status();
break;
}
}
}
5. 测试与验证方法
5.1 测试环境搭建
完整的测试系统需要:
- 可调交流电源:模拟电压波动
- 负载模拟器:验证不同负载条件下的表现
- 示波器:监测关键信号波形
- 数据记录仪:记录长时间运行数据
5.2 测试用例设计
主要测试场景包括:
- 正常-欠压-恢复全流程测试
- 快速电压波动测试(模拟电网闪变)
- 边界值测试(198V、210V附近)
- 长时间稳定性测试(72小时连续运行)
- 极端情况测试(瞬间断电、电压骤降)
5.3 测试数据分析
测试中需要记录的关键参数:
- 欠压检测响应时间
- 保护动作时间
- 自恢复合闸时间
- 误动作次数
- 电压测量精度
建议记录格式:
| 测试项目 | 标准要求 | 实测值 | 结果 |
|---|---|---|---|
| 欠压响应时间 | ≤300ms | 215ms | 合格 |
| 恢复合闸时间 | 2s±10% | 2.1s | 合格 |
6. 常见问题与解决方案
6.1 误动作问题
现象:系统在电压正常时误触发保护
可能原因:
- 电压采样受到干扰
- 阈值设置不合理
- 硬件滤波不足
解决方案:
- 检查PCB布局,确保模拟部分远离数字信号
- 增加软件滤波算法(如中值滤波)
- 调整滞回比较阈值
6.2 自恢复失败
现象:电压恢复后未能自动合闸
排查步骤:
- 检查电压采样值是否准确
- 验证继电器驱动电路
- 检查状态机逻辑
- 确认无闭锁信号
6.3 通信异常
现象:上位机无法读取设备状态
诊断方法:
- 用逻辑分析仪抓取UART信号
- 检查波特率设置(双方一致)
- 验证接线(TX/RX是否交叉)
- 测试终端电阻(长距离通信时)
7. 性能优化建议
7.1 软件优化
- 使用硬件定时器替代软件延时
- 将频繁调用的函数声明为inline
- 优化ADC采样触发方式(定时器触发)
- 使用查表法替代实时计算
7.2 硬件改进
- 采用更高精度的电压基准源
- 增加EMC防护设计(如共模扼流圈)
- 使用隔离型ADC提高安全性
- 优化电源设计(LDO+滤波)
7.3 扩展功能
- 增加GSM模块实现远程报警
- 添加电能计量功能
- 支持多组参数配置
- 实现固件远程升级
在实际项目中,我发现欠压保护功能的可靠性很大程度上取决于电压采样的准确性。经过多次测试迭代,最终将电压测量误差控制在±1%以内,完全满足设计要求。对于需要更高精度的应用,可以考虑使用专用计量芯片如BL0939替代普通ADC方案。