在双向直流电源中,通过软件实现过载保护需结合电流采样、实时计算、分级保护策略和抗干扰设计,确保在输出电流超过安全范围时及时响应,同时避免误动作。以下是具体实现步骤及关键技术要点:
模拟信号采样(ADC配置):
c// 示例:STM32 HAL库配置ADC采样霍尔传感器电压ADC_HandleTypeDef hadc1;void ADC_Init() { hadc1.Instance = ADC1; hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; hadc1.Init.Resolution = ADC_RESOLUTION_12B; // 12位分辨率 hadc1.Init.ScanConvMode = DISABLE; hadc1.Init.ContinuousConvMode = ENABLE; // 连续采样 HAL_ADC_Init(&hadc1); // 配置ADC通道(假设霍尔传感器输出接ADC1_CH0) ADC_ChannelConfTypeDef sConfig = {0}; sConfig.Channel = ADC_CHANNEL_0; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; HAL_ADC_ConfigChannel(&hadc1, &sConfig);}
数字信号通信(如SPI读取数字霍尔传感器):
c// 示例:SPI初始化(以STM32 HAL库为例)SPI_HandleTypeDef hspi1;void SPI_Init() { hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.Direction = SPI_DIRECTION_2LINES; hspi1.Init.DataSize = SPI_DATASIZE_16BIT; // 假设传感器输出16位数据 hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; HAL_SPI_Init(&hspi1);}// 读取霍尔传感器数据int16_t Read_Hall_Sensor() { uint8_t tx_buf[2] = {0x00, 0x00}; // 命令字节(根据传感器手册) uint8_t rx_buf[2] = {0}; HAL_SPI_TransmitReceive(&hspi1, tx_buf, rx_buf, 2, HAL_MAX_DELAY); return (int16_t)((rx_buf[0] <<8) | rx_buf[1]); // 组合为16位有符号数}
移动平均滤波(抑制随机噪声):
c#define CURRENT_WINDOW_SIZE 8float current_buffer[CURRENT_WINDOW_SIZE];uint8_t current_index = 0;float Filtered_Current() { float sum = 0; for (int i = 0; i
校准与线性化:
c// 模拟信号校准示例(假设霍尔传感器输出0-5V对应-50A~+50A)float Voltage_To_Current(uint32_t adc_value) { float voltage = (adc_value / 4095.0) * 3.3; // 假设ADC参考电压3.3V // 线性转换(需根据实际传感器参数调整) float current = (voltage - 1.65) / 0.033; // 1.65V对应0A,0.033V/A return current;}
| 保护级别 | 电流阈值 | 持续时间 | 响应动作 | 恢复条件 |
|---|---|---|---|---|
| 预警 | 1.1×In(如11A,In=10A) | 10s | 降低输出功率(如限流至80%) | 电流降至1.0×In以下 |
| 保护 | 1.2×In(如12A) | 5s | 关断输出,触发报警(如LED/蜂鸣器) | 电流降至0.9×In以下 |
| 紧急保护 | 1.5×In(如15A) | 1s | 强制关断并锁定,需手动复位 | 电流降至0.5×In以下 |
c#define CURRENT_WARNING_THRESHOLD 11.0 // 预警阈值(A)#define CURRENT_PROTECT_THRESHOLD 12.0 // 保护阈值(A)#define CURRENT_EMERGENCY_THRESHOLD 15.0 // 紧急保护阈值(A)#define WARNING_TIME_MS 10000 // 预警持续时间(ms)#define PROTECT_TIME_MS 5000 // 保护持续时间(ms)#define EMERGENCY_TIME_MS 1000 // 紧急保护持续时间(ms)typedef enum { CURRENT_STATE_NORMAL, CURRENT_STATE_WARNING, CURRENT_STATE_PROTECT, CURRENT_STATE_EMERGENCY} CurrentState_t;CurrentState_t current_state = CURRENT_STATE_NORMAL;uint32_t warning_timer = 0, protect_timer = 0, emergency_timer = 0;void Check_Current(float filtered_current) { switch (current_state) { case CURRENT_STATE_NORMAL: if (filtered_current >= CURRENT_WARNING_THRESHOLD) { current_state = CURRENT_STATE_WARNING; warning_timer = HAL_GetTick(); // 记录开始时间 Limit_Output_Power(80); // 限流80% } break; case CURRENT_STATE_WARNING: if (filtered_current >= CURRENT_PROTECT_THRESHOLD) { current_state = CURRENT_STATE_PROTECT; protect_timer = HAL_GetTick(); Shutdown_Output(); // 关断输出 Trigger_Alarm(); // 触发报警 } else if ((HAL_GetTick() - warning_timer) > WARNING_TIME_MS) { current_state = CURRENT_STATE_NORMAL; Remove_Power_Limit(); // 恢复功率 } else if (filtered_current <(CURRENT_WARNING_THRESHOLD * 0.9)) { current_state = CURRENT_STATE_NORMAL; Remove_Power_Limit(); } break; case CURRENT_STATE_PROTECT: if (filtered_current >= CURRENT_EMERGENCY_THRESHOLD) { current_state = CURRENT_STATE_EMERGENCY; emergency_timer = HAL_GetTick(); Lock_System(); // 锁定系统,需手动复位 } else if ((HAL_GetTick() - protect_timer) > PROTECT_TIME_MS) { current_state = CURRENT_STATE_NORMAL; // 需手动确认后恢复输出(避免反复触发) } else if (filtered_current <(CURRENT_PROTECT_THRESHOLD * 0.8)) { current_state = CURRENT_STATE_NORMAL; // 需手动确认后恢复输出 } break; case CURRENT_STATE_EMERGENCY: // 仅在电流降至安全值且手动复位后退出 if (filtered_current <(CURRENT_EMERGENCY_THRESHOLD * 0.3) && Manual_Reset_Pressed()) { current_state = CURRENT_STATE_NORMAL; Unlock_System(); } break; }}
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 电流跳变触发误保护 | 采样噪声或滤波不足 | 增加滤波窗口大小(如从N=8增至N=16),或改用中值滤波。 |
| 保护后无法恢复 | 迟滞量设置不当或恢复条件严格 | 调整迟滞量(如从10%增至20%),或增加手动恢复按钮。 |
| 多采样通道数据不一致 | 传感器布局不合理或故障 | 优化传感器布局(如靠近功率器件),增加故障检测逻辑(如一致性校验)。 |
| 动态负载下保护延迟 | 采样周期过长或滤波响应慢 | 缩短采样周期(如从10ms减至5ms),或改用快速滤波算法(如卡尔曼滤波)。 |