4、母线电压与相电压检测故障
电压检测这块,说实话是FOC系统里最容易出幺蛾子的地方。我做过好几个项目,最后排查下来,问题都出在电压采样链路上。你想想看,如果母线电压都测不准,那电流环、速度环算得再准也没用。
今天咱们就聊聊母线电压和相电压检测中常见的故障,以及怎么设计保护电路。
4.1 母线电压采样分压电阻失效
母线电压采样,最常用的就是电阻分压。简单、便宜、可靠。但可靠是相对的,我遇到过好几次分压电阻出问题的情况。
4.1.1 分压电阻的典型电路
先看一个典型的分压电路:
// 母线电压采样分压电路
// Vbus = 48V,分压比 1:10
// R1 = 100kΩ (上分压)
// R2 = 10kΩ (下分压)
// VADC = Vbus * R2 / (R1 + R2) = 48 * 10 / 110 ≈ 4.36V
// 实际项目中我常用 1% 精度的电阻
// 上分压用 4 个 100kΩ 串联,耐压更安全
// 下分压用 10kΩ + 1kΩ 可调,用于校准
4.1.2 分压电阻失效模式
分压电阻失效,主要有这么几种情况:
- 电阻开路:最常见。上分压开路,ADC读到0V;下分压开路,ADC读到3.3V(或参考电压)。
- 电阻值漂移:温度变化、老化导致阻值变化。我见过一个案例,用了普通贴片电阻,高温下阻值漂了5%,电压采样直接偏了。
- 焊点虚焊:振动、热胀冷缩导致接触不良。这个最坑,时好时坏,排查起来很头疼。
- PCB漏电:潮湿环境下,分压节点对地漏电,导致采样值偏低。
注意: 分压电阻的耐压值一定要选够。我曾经图省事用了0805封装的100kΩ电阻,结果在60V母线电压下,电阻两端电压差太大,直接击穿了。后来全部换成1206封装,耐压200V以上。
4.1.3 故障检测方法
怎么检测分压电阻是否失效?我个人习惯用软件冗余检测:
// 母线电压故障检测伪代码
#define VBUS_NORMAL_MIN 42.0f // 正常范围下限
#define VBUS_NORMAL_MAX 54.0f // 正常范围上限
#define VBUS_FAULT_THRESHOLD 5 // 连续故障次数
uint8_t vbus_fault_count = 0;
void Vbus_Detection(void)
{
float vbus = Get_Vbus_Voltage();
// 1. 范围检测
if (vbus < VBUS_NORMAL_MIN || vbus > VBUS_NORMAL_MAX)
{
vbus_fault_count++;
if (vbus_fault_count >= VBUS_FAULT_THRESHOLD)
{
// 触发故障保护
Motor_Stop();
Set_Error_Flag(ERROR_VBUS_FAULT);
}
}
else
{
vbus_fault_count = 0;
}
// 2. 变化率检测(防止电阻突然开路)
static float last_vbus = 0;
float delta = fabs(vbus - last_vbus);
if (delta > 5.0f) // 短时间内变化超过5V
{
// 可能是分压电阻失效
vbus_fault_count++;
}
last_vbus = vbus;
}
4.2 相电压重构电路故障
相电压重构,说白了就是通过母线电压和开关状态,反推出三相电压。这个技术在无传感器FOC里用得很多。
4.2.1 重构原理
相电压重构的基本原理:
// 相电压重构公式
// Va = Vbus * (Sa - 0.5) // Sa为A相占空比,范围0~1
// Vb = Vbus * (Sb - 0.5)
// Vc = Vbus * (Sc - 0.5)
// 但实际中要考虑死区时间、管压降等因素
// 我一般会加一个补偿表
4.2.2 常见故障
相电压重构电路,常见故障有:
- 运放失调:相电压采样运放的输入失调电压,会导致重构误差。我遇到过运放温漂太大,低温下正常,高温下偏了0.1V。
- RC滤波参数变化:采样电路中的RC低通滤波,电容老化后容值变化,导致相位延迟。
- 隔离放大器故障:高压侧和低压侧的隔离放大器,如果供电不稳,输出会异常。
- ADC参考电压漂移:这个容易被忽略。ADC的参考电压如果漂了,所有采样值都跟着偏。
经验分享: 我习惯在相电压采样电路上加一个自检功能。每次上电时,先让电机处于零矢量状态(所有开关管关闭),然后采样相电压。正常情况下应该接近0V。如果偏差超过0.1V,说明采样电路有问题。
4.2.3 故障诊断流程
相电压重构故障的诊断,我一般按这个流程来:
- 检查ADC读数:先看ADC原始值是否在合理范围。如果读到0或满量程,大概率是采样电路开路或短路。
- 检查参考电压:用万用表测ADC参考电压,看是否稳定。
- 检查运放输出:在电机静止时,测运放输出端电压,应该接近0V。
- 检查RC滤波:用示波器看相电压波形,看是否有异常毛刺或相位偏移。
- 检查隔离供电:隔离放大器两侧的供电,纹波不能太大。
4.3 过压/欠压保护阈值设定
过压和欠压保护,是FOC系统最基本的安全措施。阈值设得太宽,保护不及时;设得太窄,容易误触发。
4.3.1 阈值设定原则
我个人习惯的阈值设定方法:
| 参数 | 典型值 | 说明 |
|---|---|---|
| 额定电压 | 48V | 系统标称工作电压 |
| 过压保护阈值 | 54V (112.5%) | 留12.5%余量,防止误触发 |
| 欠压保护阈值 | 42V (87.5%) | 留12.5%余量,防止误触发 |
| 过压恢复阈值 | 52V | 带滞回,防止频繁切换 |
| 欠压恢复阈值 | 44V | 带滞回,防止频繁切换 |
4.3.2 滞回设计
为什么要加滞回?你想想看,如果阈值是精确的54V,电压在53.9V和54.1V之间波动,系统就会频繁进入和退出保护状态。这会导致电机抖动,甚至损坏。
// 带滞回的过压/欠压保护
#define VBUS_OV_THRESHOLD 54.0f // 过压阈值
#define VBUS_OV_RECOVER 52.0f // 过压恢复阈值
#define VBUS_UV_THRESHOLD 42.0f // 欠压阈值
#define VBUS_UV_RECOVER 44.0f // 欠压恢复阈值
typedef enum {
VBUS_NORMAL,
VBUS_OVER_VOLTAGE,
VBUS_UNDER_VOLTAGE
} Vbus_State_t;
Vbus_State_t vbus_state = VBUS_NORMAL;
void Vbus_Protection(float vbus)
{
switch (vbus_state)
{
case VBUS_NORMAL:
if (vbus > VBUS_OV_THRESHOLD)
{
vbus_state = VBUS_OVER_VOLTAGE;
Motor_Stop();
Set_Error_Flag(ERROR_OVER_VOLTAGE);
}
else if (vbus < VBUS_UV_THRESHOLD)
{
vbus_state = VBUS_UNDER_VOLTAGE;
Motor_Stop();
Set_Error_Flag(ERROR_UNDER_VOLTAGE);
}
break;
case VBUS_OVER_VOLTAGE:
if (vbus < VBUS_OV_RECOVER)
{
vbus_state = VBUS_NORMAL;
Clear_Error_Flag(ERROR_OVER_VOLTAGE);
}
break;
case VBUS_UNDER_VOLTAGE:
if (vbus > VBUS_UV_RECOVER)
{
vbus_state = VBUS_NORMAL;
Clear_Error_Flag(ERROR_UNDER_VOLTAGE);
}
break;
}
}
4.3.3 保护响应时间
保护响应时间也很关键。过压时,如果响应太慢,MOS管可能已经烧了。我一般这样设定:
- 硬件保护:用比较器直接触发,响应时间 < 1μs
- 软件保护:ADC采样+软件判断,响应时间 < 100μs
- 慢速保护:用于监测电池电量等,响应时间 1~10ms
核心要点: 过压保护一定要硬件和软件双重保险。硬件保护是最后一道防线,软件保护是日常防护。我见过一个项目,只做了软件保护,结果ADC采样偶尔卡死,过压时没触发保护,直接炸了MOS管。
4.4 知识体系总览
下面这张图,把母线电压和相电压检测的核心逻辑串起来了:
这张图把三个核心模块的关系画清楚了。母线电压采样是基础,相电压重构是进阶,保护阈值是安全底线。三者缺一不可。
我的建议: 在设计阶段就把电压检测的故障诊断逻辑写进去,不要等出了问题再补。我早期一个项目就是吃了这个亏,样机测试时好好的,量产100台后有3台出现电压采样异常,排查了整整两周才发现是分压电阻焊盘设计不合理。
好了,电压检测这块就聊到这儿。记住一句话:电压测不准,FOC就是空中楼阁。下一节咱们聊聊电流检测的故障诊断,那个坑更多。
公众号:蓝海资料掘金营,微信deep3321