1. 问题现象与背景分析
最近在调试TI的C2000系列电机控制方案时,遇到一个典型问题:使用TI官方提供的MotorControl SDK驱动电机运行时,当电机在平地上正常运转但遇到坎阶(如地面凸起或沟坎)时,系统会报出短路故障(Short Circuit)。这种情况在AGV小车、服务机器人等移动平台上尤为常见。
注意:这种故障往往不是真正的硬件短路,而是电机负载突变导致的误触发。TI的电机库内置了多重保护机制,但默认参数可能不适合所有应用场景。
2. 短路保护机制原理解析
2.1 TI电机库的三重保护设计
TI的MotorControl SDK中集成了以下保护机制:
- 硬件比较器触发:通过C2000内置的CMPSS模块实时监测相电流
- 软件过流检测:在PWM中断服务程序中检查电流采样值
- 故障诊断逻辑:结合电压、电流、位置信号进行综合判断
c复制// 典型保护代码结构(来自TI例程)
if(EST_getFault(estHandle) != FAULT_CLEAR) {
PWM_setTripZoneAction(pwmHandle, PWM_TripZoneAction_ClearTripped);
DEVICE_DELAY_US(100);
PWM_clearTripZoneFlag(pwmHandle);
}
2.2 过坎时电流突变特性
当电机驱动负载突然遇到障碍时,电流波形会呈现以下特征:
- 上升沿斜率(di/dt)超过正常值3-5倍
- 峰值电流可能达到额定值的2-3倍
- 持续时间通常在50-200μs之间
3. 关键参数调试方法
3.1 硬件比较器参数配置
在hal.c文件中找到CMPSS配置部分,重点关注以下寄存器:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| CMPSS.DACVAL | 根据电机额定电流调整 | 建议初始设为额定电流的1.5倍 |
| CMPSS.HYSTCTL | 0x03 | 增加滞后区间防止误触发 |
| CMPSS.CTRIPFIL | 0x05 | 增加滤波周期(约1.6μs) |
c复制// 示例配置代码
CMPSS_configDACValue(myCmpss, CMPSS_DAC_VALUE_1, 1500); // 1.5倍额定电流
CMPSS_configHysteresis(myCmpss, 100); // 100mV滞回区间
3.2 软件保护阈值调整
在motor_vars.h中修改以下关键参数:
c复制#define USER_OVER_CURRENT_LIMIT_A (1.8f * MOTOR_RATED_CURRENT) // 过流阈值
#define USER_OVER_VOLTAGE_LIMIT_V (1.2f * DC_BUS_VOLTAGE) // 过压阈值
#define USER_START_UP_DELAY_MS 500 // 启动延时
3.3 PWM死区时间优化
过坎时容易发生上下管直通,建议在syscfg文件中调整:
c复制PWM_setDeadBandDelay(handle, PWM_DBCTL_OUT_MODE, 100); // 死区时间设为100ns
EPWM_setRisingEdgeDelay(handle, 50); // 上升沿延迟50ns
4. 动态响应优化技巧
4.1 电流环参数整定
- 增加积分时间常数:
c复制CTRL_setGain(ctrlHandle, CTRL_Type_PID, 0.5f, 0.01f, 0.001f); - 启用抗饱和补偿:
c复制CTRL_enableAntiWindup(ctrlHandle, true);
4.2 速度观测器调校
在observer.h中调整滑模观测器参数:
c复制#define OBSERVER_SLIDING_GAIN 1000.0f // 降低增益减少抖动
#define OBSERVER_LPF_CUTOFF_HZ 50.0f // 降低截止频率
5. 典型问题排查流程
当遇到短路误报时,建议按以下步骤排查:
-
确认硬件连接
- 检查电流传感器接线
- 测量MOSFET栅极波形
- 验证电源去耦电容
-
采集故障瞬间数据
c复制// 在故障中断中添加数据记录 void faultISR(void) { LOG_recordWaveform(EST_getCurrent(estHandle)); LOG_recordWaveform(EST_getVoltage(estHandle)); } -
分析故障特征
- 使用CCS的Graph工具查看电流波形
- 检查故障时的转子位置
- 对比正常与异常时的PWM占空比
6. 进阶优化方案
6.1 动态阈值调整算法
在运行过程中根据速度动态调整保护阈值:
c复制float dynamicOCThreshold(float speed) {
float base = MOTOR_RATED_CURRENT * 1.5f;
float factor = 1.0f + fabsf(speed) / MOTOR_MAX_SPEED;
return base * factor;
}
6.2 故障预测机制
通过监测电流变化率提前预警:
c复制bool predictFault(float i_a, float i_b, float dt) {
static float prev_i = 0.0f;
float di_dt = fabsf(i_a - prev_i) / dt;
prev_i = i_a;
return (di_dt > MAX_DI_DT) ? true : false;
}
7. 实测案例分享
在某扫地机器人项目中,通过以下调整解决了过坎误报问题:
- 将硬件比较器阈值从10A提升到15A
- 增加软件滤波窗口从3个周期改为5个周期
- 调整死区时间从50ns增加到80ns
- 加入速度相关的动态保护算法
调整前后对比如下:
| 指标 | 调整前 | 调整后 |
|---|---|---|
| 误报次数/小时 | 15-20次 | 0-1次 |
| 过坎成功率 | 65% | 98% |
| 响应延迟 | 50μs | 75μs |
经验分享:在保证安全的前提下,适当放宽保护阈值可以显著提升系统鲁棒性。建议先用示波器捕获实际电流波形,再针对性调整参数。
