工业级伺服电机 I2T 保护怎么做

工业级伺服电机 I2T 保护怎么做

1. I2T 保护到底保护什么

电机过载时,最先需要保护的是绕组铜耗导致的温升。铜耗近似为:

P_cu = I_rms^2 * R_phase

其中:

I_rms:电机相电流 RMS,或 dq 电流等效值 R_phase:相电阻,随温度升高而增大

所以过载热量与I^2 * t强相关,这就是 I2T 这个名字的来源。

但工业级伺服里的 I2T 并不只是简单累计I^2。真正要解决的是:

1. 堵转时局部热点升温很快,温度传感器滞后 2. 旋转时热量分布更均匀,允许更长过载 3. 电机短时峰值性能要释放,不能一律按最保守工况限流 4. 热状态恢复需要时间,不能清故障后立即满血

因此工业级做法一般是“热模型 + 动态降额 + 温度传感器兜底”。

2. 简单 I2T 和工业级 I2T 的区别

简单做法:

电流超过某档 -> 固定速度累计 I2T_cnt I2T_cnt 到阈值 -> 直接限到额定电流或报故障

这种做法实现简单,但有明显问题:

1. 不区分堵转和旋转 2. 不区分平均温升和局部热点 3. 限流动作突兀,力矩会突然掉 4. 冷却恢复不准确 5. 对短时峰值性能利用不足

工业级做法:

1. 计算电机热状态 thermal_state 2. 根据速度修正连续电流和散热能力 3. 堵转热点和平均绕组可以分别建模 4. 热状态接近上限时逐渐降额 5. 温度传感器作为最终兜底

典型输出不是一个简单故障位,而是动态电流上限:

I_limit = f(thermal_state, speed, temperature)

FOC 电流环最终执行:

iq_ref = clamp(iq_ref, -I_limit, I_limit)

3. 推荐的工业级 I2T 架构

建议至少分三层:

第一层:快速硬件保护 DRV 过流、母线异常、MOS 保护、ADC 饱和等,直接关断或进 ERROR。 第二层:电机热模型 I2T 提前预测绕组和堵转热点温升,输出动态电流上限。 第三层:温度传感器保护 NTC/PTC/KTY/热敏电阻作为真实温度兜底,处理模型误差和异常环境。

对于堵转发热不均匀的电机,建议做双热模型:

thermal_avg:绕组平均热状态 thermal_hotspot:堵转局部热点热状态

最终限流取更严格的一个:

I_limit = min(I_limit_avg, I_limit_hotspot)

4. 需要测试哪些数据

想做工业级 I2T,测试数据不能只有一个电流-时间表。至少需要覆盖“加热、冷却、速度、环境、初始温度、重复过载”几个维度。

4.1 堵转过载时间

堵转是热点最危险的工况,必须测。

推荐记录:

电流点:I1, I2, I3 ... 允许时间:t_limit 结束条件:绕组热点温度、壳体温度、NTC 温度、是否损坏

示例:

电流堵转允许时间
60A67s
80A21s
100A16s
120A13s
140A6s
160A2s
200A1s

4.2 不同速度下的过载时间

只测堵转不够,因为旋转后热分布改善,过载能力明显提高。

建议至少测:

0RPM / 堵转 1RPM 5RPM 10RPM 50RPM 100RPM 额定转速附近

如果测试资源有限,最低建议:

堵转 10RPM 50RPM 额定转速附近

数据用途:

1. 得到 I_continuous(speed) 2. 得到 overload_time(current, speed) 3. 判断堵转热点模型和平均热模型的切换速度

4.3 冷却曲线

工业级 I2T 很重视恢复过程。不能只知道多久热,还要知道多久冷。

建议测试:

热到 90℃ -> 停止输出 -> 记录降到 80℃、70℃、60℃ 的时间 热到 90℃ -> 限到额定电流运行 -> 记录冷却曲线 热到 90℃ -> 低速旋转空载 -> 记录冷却曲线

冷却数据用于拟合热时间常数:

T(t) = T_ambient + (T0 - T_ambient) * exp(-t / tau_cool)

4.4 不同初始温度

工业现场很少每次都是冷机启动。需要测热机再过载。

建议:

25℃ 冷机开始 60℃ 热机开始 80℃ 热机开始

如果 80℃ 初始温度下还能允许的过载时间远低于冷机,模型必须保留热记忆,不能清故障后重置为 0。

4.5 不同环境温度

环境温度会影响散热裕量。建议至少测:

25℃ 40℃ 整机最高规格环境温度,例如 50℃ 或 55℃

可以将热模型初始状态或连续电流按环境温度降额:

I_cont_derated = I_cont_25C * sqrt((T_limit - T_ambient) / (T_limit - 25))

4.6 重复过载循环

这类测试最能验证模型是否靠谱:

100A 5s -> 30A 20s -> 100A 5s -> 30A 20s -> repeat

观察:

1. 模型热状态是否逐步累积 2. 温度是否稳定在安全范围 3. 降额是否平滑 4. 清故障后是否存在过快恢复

5. 关键公式

5.1 基础 I2T 积分

最简单形式:

I2T += I^2 * Ts

如果以连续电流归一化:

thermal += ((I / I_cont)^2) * Ts / tau_heat

其中:

thermal = 1.0 表示达到热极限 I_cont 是当前速度下的连续电流 tau_heat 是热时间常数 Ts 是控制周期

5.2 带冷却的一阶热模型

更标准的离散模型:

thermal += Ts / tau * ((I / I_cont(speed))^2 - thermal)

解释:

(I / I_cont)^2:当前发热相对连续热平衡点的强度 thermal:当前热状态 Ts / tau:热模型更新系数

I = I_cont时,thermal会趋近 1。
I < I_cont时,thermal会下降。
I > I_cont时,thermal会继续上升。

5.3 基于实测过载时间反推热模型

假设初始热状态为 0,电流恒定,忽略冷却,达到极限时间为t_limit

thermal_rate = 1 / t_limit

如果每周期执行一次:

thermal += Ts / t_limit

这就是查表式 I2T 的本质。

如果保留冷却项,一阶模型达到 thermal=1 的时间为:

thermal(t) = A * (1 - exp(-t / tau)) A = (I / I_cont)^2

给定实测t_limit,可以反推:

1 = A * (1 - exp(-t_limit / tau))

整理:

tau = -t_limit / ln(1 - 1 / A)

注意:只有A > 1时才会过热。

5.4 速度相关连续电流

堵转和旋转散热不同,可以建立:

I_cont = f(speed)

简单做法是查表插值:

speed: 0RPM, 10RPM, 50RPM, ratedRPM Icont: 30A, 45A, 60A, 70A

也可以用平滑函数:

I_cont(speed) = I_stall + (I_rated - I_stall) * clamp(speed / speed_base, 0, 1)

5.5 动态降额

不要等到thermal >= 1才突然限流,建议提前折返:

thermal < 0.7:允许峰值电流 0.7 <= thermal < 1.0:线性降到连续电流 thermal >= 1.0:限制到连续电流或报 overload

公式:

k = (1.0 - thermal) / (1.0 - derate_start) I_limit = I_cont + (I_peak - I_cont) * clamp(k, 0, 1)

6. 示例代码:查表式 I2T + 动态降额

这类适合用实测过载时间快速落地。

typedefstruct{floatthermal;// 0.0 ~ 1.0floatcurrent_limit;// Auint8_toverload;}MotorThermalState;staticfloatinterp(floatx,floatx0,floaty0,floatx1,floaty1){if(x1<=x0){returny1;}returny0+(x-x0)*(y1-y0)/(x1-x0);}staticfloatlookup_time(floatcurrent,constfloat*current_tab,constfloat*time_tab,intn){inti=0;if(current<=current_tab[0]){returntime_tab[0];}for(i=1;i<n;i++){if(current<=current_tab[i]){returninterp(current,current_tab[i-1],time_tab[i-1],current_tab[i],time_tab[i]);}}returntime_tab[n-1];}staticfloatget_overload_time(floatcurrent,floatrpm){staticconstfloatcurrent_tab[]={50,60,80,100,120,140,160,180,200,220};staticconstfloatrotate_time[]={3600,500,61,30,18,13,10,7,5,3.5f};staticconstfloatstall_time[]={260,67,21,16,13,6,2,2,1,1};constintn=sizeof(current_tab)/sizeof(current_tab[0]);constfloatstall_rpm=1.0f;constfloatrotate_rpm=10.0f;floatts=lookup_time(current,current_tab,stall_time,n);floattr=lookup_time(current,current_tab,rotate_time,n);floatk=0.0f;if(rpm<=stall_rpm){returnts;}if(rpm>=rotate_rpm){returntr;}k=(rotate_rpm-rpm)/(rotate_rpm-stall_rpm);returntr+k*(ts-tr);}voidmotor_i2t_update(MotorThermalState*m,floatid,floatiq,floatrpm,floatts,floati_cont,floati_peak){constfloatderate_start=0.70f;floati_rms=sqrtf(id*id+iq*iq);floatt_limit=0.0f;floatk=0.0f;if(i_rms>i_cont){t_limit=get_overload_time(i_rms,rpm);m->thermal+=ts/t_limit;}else{// Cooling rate should be fitted from cooling tests.m->thermal-=ts/120.0f;}if(m->thermal<0.0f){m->thermal=0.0f;}elseif(m->thermal>1.0f){m->thermal=1.0f;}if(m->thermal>derate_start){k=(1.0f-m->thermal)/(1.0f-derate_start);if(k<0.0f){k=0.0f;}elseif(k>1.0f){k=1.0f;}m->current_limit=i_cont+(i_peak-i_cont)*k;}else{m->current_limit=i_peak;}m->overload=(m->thermal>=1.0f);}

7. 示例代码:一阶热模型

如果测试数据比较完整,建议从查表式升级到一阶热模型。

typedefstruct{floatthermal;floatcurrent_limit;uint8_toverload;}ThermalModel;staticfloatclampf_local(floatx,floatlo,floathi){if(x<lo){returnlo;}if(x>hi){returnhi;}returnx;}staticfloatget_cont_current_by_speed(floatrpm){constfloati_stall=30.0f;constfloati_run=60.0f;constfloatspeed_base=50.0f;floatk=clampf_local(rpm/speed_base,0.0f,1.0f);returni_stall+(i_run-i_stall)*k;}voidthermal_model_update(ThermalModel*m,floatid,floatiq,floatrpm,floatts){constfloattau=120.0f;constfloatderate_start=0.70f;constfloati_peak=120.0f;floati_rms=sqrtf(id*id+iq*iq);floati_cont=get_cont_current_by_speed(rpm);floatheat_target=(i_rms/i_cont)*(i_rms/i_cont);floatk=0.0f;m->thermal+=ts/tau*(heat_target-m->thermal);m->thermal=clampf_local(m->thermal,0.0f,1.2f);if(m->thermal>derate_start){k=(1.0f-m->thermal)/(1.0f-derate_start);k=clampf_local(k,0.0f,1.0f);m->current_limit=i_cont+(i_peak-i_cont)*k;}else{m->current_limit=i_peak;}m->overload=(m->thermal>=1.0f);}

8. 双热模型:更适合堵转热点

堵转时,某些槽位或某一相会持续发热,NTC 往往贴在壳体或定子某处,响应慢。因此可以做双模型:

thermal_avg:平均绕组温升,时间常数大 thermal_hotspot:堵转局部热点,时间常数小,低速时权重大

简化公式:

hotspot_gain = 1 - clamp(rpm / rpm_hotspot_release, 0, 1) thermal_hotspot += Ts / tau_hotspot * (hotspot_gain * (I / I_stall_cont)^2 - thermal_hotspot) thermal_avg += Ts / tau_avg * ((I / I_run_cont(speed))^2 - thermal_avg)

最终:

thermal_used = max(thermal_avg, thermal_hotspot) I_limit = min(I_limit_avg, I_limit_hotspot)

这类模型非常适合:

1. 低速大扭矩 2. 堵转冲击 3. 机械卡死 4. 温度传感器距离热点较远

9. 参数标定流程

建议按这个顺序做:

1. 先确定绝对安全边界 例如绕组热点不超过 120℃,壳体不超过 90℃,磁钢不退磁。 2. 测堵转电流-时间表 用来标定 hotspot 模型。 3. 测不同速度下的电流-时间表 用来标定 avg 模型和 I_cont(speed)。 4. 测冷却曲线 用来标定 tau_cool 或热模型 tau。 5. 做重复过载循环 验证热状态是否累积正确。 6. 加安全系数 软件保护时间一般不要等于破坏时间,建议乘 0.6~0.8。 7. 实车/整机验证 最终看实际安装条件、外壳散热、环境温度、线束和风道。

10. 工程实现注意点

10.1 I2T 不应依赖主循环频率

I2T 更新必须在固定周期调用,例如 PWM 中断或电流环周期:

Ts = 1 / MOSFET_Freq

如果在while(1)主循环里累计,保护时间会随 CPU 空闲程度变化。

10.2 电流建议用 RMS 或 dq 模长

推荐:

I = sqrt(id^2 + iq^2)

只用iq的问题是:id也会产生铜耗。

10.3 温度传感器不能替代 I2T

温度传感器适合做最终保护,但不适合单独保护堵转热点:

1. 热路径有延迟 2. 堵转局部热点可能远高于传感器位置 3. 高电流 1~2 秒内就可能出现危险热点

10.4 清故障不应清热状态

工业级产品一般不会在清故障时直接把热状态归零。更合理的是:

1. 清故障只清 fault flag 2. thermal_state 继续按冷却模型下降 3. thermal_state 低于恢复阈值后才允许峰值电流

例如:

thermal < 0.5:允许重新使能峰值 thermal > 0.8:只允许低电流恢复

10.5 保护要分级

建议分级:

warning:热容量超过 70%,开始降额 limit:热容量超过 90%,明显限流 fault:热容量超过 100%,持续过载或温度超过硬阈值

11. 推荐落地方案

如果项目处于快速工程验证阶段:

使用查表式 I2T + 速度插值 + 70% 动态降额

优点:

1. 直接利用实测数据 2. 行为可解释 3. 参数好调 4. 对堵转热点有快速保护

如果项目进入量产可靠性阶段:

升级为双热模型: thermal_avg + thermal_hotspot

并补齐:

1. 冷却曲线 2. 环境温度修正 3. 初始温度修正 4. 重复过载循环验证 5. NTC 真实温度兜底

12. 总结

工业级 I2T 的本质不是“限制电流”,而是“管理热容量”。

一个专业的伺服 I2T 应该做到:

1. 短时允许峰值电流,释放性能 2. 堵转时快速保护局部热点 3. 旋转时不过度保守 4. 热状态接近极限时平滑降额 5. 温度传感器作为兜底 6. 清故障后仍保留热记忆

工程上最稳妥的路线是:

第一版:实测时间表 + 速度插值 + 动态降额 第二版:一阶热模型 + 冷却曲线 第三版:平均绕组 + 堵转热点双热模型

这样既不会一开始模型过复杂,也能逐步向成熟工业伺服产品的保护策略靠近。