做PMSM矢量控制,电阻、电感、磁链常数这三个参数,我建议大家在调试电流环之前先花时间解决掉。参数辨识这件事儿看起来没有调PI参数那么刺激,但它是一切控制性能的地基。我自己在某DSP平台上把整套pmsm电阻电感磁链常数辨识流程完整跑通之后,才真正明白为什么老工程师常说"参数不齐别谈控制"——这三个数每错一个,扭矩精度、弱磁表现、电流环带宽全都会跟着出问题。这篇就把我在这套平台上实现电阻、电感、磁链常数辨识的原理、源码结构和实测经验完整梳理一遍,适合刚接手FOC项目的工程师做参考,也适合正在为电机参数不准而头疼的朋友拿来抄作业。
1. 为什么电阻、电感、磁链常数这三个参数值得单独写一套辨识程序
1.1 矢量控制对参数的依赖不是锦上添花,而是生死攸关
很多人以为FOC只要知道转子位置就能跑,参数差不多就行。真到现场调试就会发现,电流环PI参数、前馈解耦、滑模观测器、MTPA、弱磁控制,全部建立在电阻、电感和磁链常数的准确数值之上。
以最基础的稳态电压方程为例,d-q轴下的PMSM方程长这样:
- Ud = Rs × Id - ωe × Lq × Iq
- Uq = Rs × Iq + ωe × Ld × Id + ωe × ψf
电流环PI参数本质上依赖电气时间常数,常用设计方法是按期望带宽反推:
- Kp = L × ωbw
- Ki = Rs × ωbw
也就是说,电感不准,Kp就是错的;电阻不准,Ki就是错的。你在示波器上看到电流环振荡、声音发闷、阶跃响应超调,很多时候不是PI调得不好,而是参数已经错了一半。
再往上看,前馈解耦需要Ld、Lq、Rs,弱磁控制需要Ld、Lq、ψf,MTPA查表需要ψf和Ld/Lq的饱和曲线。可以说,FOC的每一个闭环环节都在向这三个参数"要数值"。参数齐了,剩下的工作就是调带宽;参数不齐,后面所有东西都在沙地上盖楼。
1.2 铭牌参数和实际工作点差得很远
刚接触电机驱动的朋友最容易犯的错,是把电机铭牌上的参数直接抄进程序里跑。我自己实测过一批表贴式PMSM,铭牌标称值和真实值差距大到会让你怀疑人生。
还是拿某款2kW的表贴电机举例,我用实际辨识结果和铭牌值做了个对比:
| 参数 | 铭牌/出厂值 | 室温实测 | 工作温度(约80℃) | 说明 |
|---|---|---|---|---|
| 相电阻 Rs | 0.80 Ω | 0.82 Ω | 1.30 Ω | 铜绕组温度系数约0.00393/℃ |
| d轴电感 Ld | 2.20 mH | 2.35 mH | 2.10 mH | 磁路饱和和温度双重影响 |
| q轴电感 Lq | 2.20 mH | 2.60 mH | 2.30 mH | q轴磁路更易饱和,差异比Ld更大 |
| 磁链常数 ψf | 0.092 Wb | 0.088 Wb | 0.081 Wb | 钕铁硼磁体温敏特性,负温度系数 |
这里面每一项都不是小数字。电阻在温升后可能偏大50%~60%,磁链随温度升高可能掉10%以上,电感随负载电流增大而明显下降。如果一套自整定程序只在25℃的实验室测过一组参数,上了现场高温工况,电流环响应特性和扭矩估算都会偏离设计值。
所以我现在接手任何一个电机项目,第一件事不是调PI,而是先把参数辨识程序跑一遍,把真实工况下的基础参数拿到手。
1.3 辨识程序在工程流程中的定位
在我这边的工程习惯里,参数辨识程序并不是一个"用完就扔"的实验代码,而是一个独立的、可以反复运行的功能模块:
- 离线辨识放在控制器上电自检阶段,用于出厂标定和控制器移植。电机换了生产批次,或者换了不同型号,不需要改控制算法,只要重新跑一轮辨识。
- 在线辨识用于运行中的参数校正,工程上复杂度高、收敛速度慢,还要考虑持续激励的问题,大多数量产方案不会在每次运行中都跑在线辨识,而是用初始辨识值加上温度查表修正。
因此,一套固定流程的离线辨识程序,在通用性上的收益非常高。换电机不换代码,只换参数表。这也是我写这套TI DSP辨识程序的初衷:把三个参数用同一套状态机串联起来,任何PMSM接上去都能在几分钟内出结果。
2. 三种参数的辨识原理与工程化取舍
2.1 电阻辨识:直流注入法的原理与细节
电阻辨识的原理非常简单,本质上就是欧姆定律:给电机绕组通一个已知幅值的直流电流,等电流稳定后测量电压,R = U / I。但放在逆变器驱动里,有几个环节需要处理。
工程上最常用的是d轴直流注入法:锁住转子,让d轴电流指令为一个固定值,q轴电流为0。稳态时电角速度ωe=0,电压方程退化成:
- Ud = Rs × Id
- Uq = 0
这时候看Ud和Id,电阻自然就出来了。
但实际读到的Ud是PWM平均电压,里面藏着逆变器死区电压和功率管压降。PWM输出的平均电压可以用占空比和母线电压来算:
U_avg = Vdc × D - U_drop - V_dead_err
其中U_drop是IGBT/MOSFET导通压降在占空比开通和续流期间的等效值,V_dead_err是死区时间导致的电压损失。如果忽略这两项,在小电流、低占空比工况下,电阻辨识误差会非常大。
具体到接线方式还有一个容易踩的坑。如果电机中性点没有引出,只有UVW三相端子,施加的电流从某一相流入、另外两相流出,实际上是两相绕组串联通电。假设注入的d轴电流为Id,PWM平均电压为U_avg,那么:
Rs = U_avg / (2 × Id)
我见过有人直接拿U/Id算,结果电阻值偏大一倍还不自知,电流环调得极其保守,后来发现是接线方式没考虑清楚。
另外,电阻辨识的电流要选在额定电流的20%~30%左右比较合适。太小了信噪比差,采样误差占比高;太大了绕组快速发热,电阻随温度漂移,辨识出来的是"高温电阻",后面还得折算。我一般会把注入持续控制在1秒以内,多点采样取平均,降低随机噪声影响。
2.2 电感辨识:阶跃电压响应法的原理
电感辨识比电阻复杂一些,因为电感本身是电流变化率的函数,而且d轴和q轴分别对应不同的磁路状态,需要分别测。
我在这套程序里用的是阶跃电压响应法,思路是这样的:把转子锁在固定位置,d轴突加一个电压阶跃,q轴命令为0,电流从零开始爬升。在电流爬升的起始阶段,不考虑饱和的话,一阶RL电路的暂态响应可以写成:
Ud = Rs × id + Ld × did/dt
电阻项已经通过第一步辨识知道了,只要我们测量一段电流变化窗口内id的变化量和时间间隔,就能反推电感:
Ld = (Ud - Rs × id_avg) × Δt / Δid
为什么不用高频正弦注入法?正弦注入需要额外的信号处理和锁相环节,算法开销大,而且离线辨识场景下根本没有必要。阶跃法一次注入就能得到完整的暂态响应,代码简单,噪声可以通过多次测量平均来抑制。
为什么不用单脉冲法只取首尾两个电流点?因为首尾两个点最容易受到PWM纹波和ADC噪声干扰,直接做两点差分,噪声会被放大得非常离谱。实际实现中我是在暂态区间内采样一串电流点,用中央差分计算斜率:
did/dt = (id[k+1] - id[k-1]) / (2 × Ts)
这个斜率比首尾两点差分稳定得多。取得多组斜率后求平均,Ld的重复性可以做到3%以内。
q轴电感怎么测?把转子锁定在90°电角度,重复同样的阶跃注入,得到的就是Lq。注意表贴式电机Ld和Lq差别不大,但内置式电机两者差距可能达到2~3倍,这一步不能省。
阶跃电压幅值的选择要格外小心。电压给大了,电流快速冲到过流保护点,触发故障;电压给小了,电流爬升斜率太小,数字化采样后分辨率不足。我习惯先把阶跃目标电流限制在额定电流的30%左右,再用预估电阻反推电压上限,同时软件里加一级过流钳位,确保任何情况下都不会烧管子。
2.3 磁链常数辨识:反电动势法的原理
磁链常数是最难在静止状态下测出来的参数,因为永磁磁链只有在转子旋转时才表现为反电动势。所以磁链辨识必须让电机转起来。
反电动势法的原理很直接:永磁同步电机在电角速度ωe下旋转时,定子绕组会感应出幅值正比于ψf×ωe的反电动势。如果电机空载并且转速恒定,反电动势的峰值电压V_emf_peak和磁链常数的关系是:
ψf = V_emf_peak / ωe
工程实现上,让电机进入速度闭环,给定一个固定的电角速度,比如30Hz。转速稳定后,用ADC采样相电压或者线电压,取多个周期内电压的峰值。
关于测电压的位置,我强烈建议有条件就在电机端直接测量,而不是在逆变器输出端测。逆变器出口的电压含有死区、管压降和PWM纹波,直接取峰值算出来的磁链会明显偏大。如果只能在逆变器出口测,那就必须引入修正系数:
ψf = V_emf_peak × K_comp / ωe
K_comp可以用已知磁链的参考电机标定出来,一般取0.9~0.95左右。前提是逆变器死区设置不变,死区一变,这个系数就必须重标。
另外,磁链常数常用的两种单位需要区分:一种是国际单位制Wb,另一种是工程上常见的V/krpm。换算公式是:
ψf_Wb = ψf_V_per_krpm × 60 / (2π × 1000 × √3)
很多驱动器的电机参数表里喜欢给V/krpm,但代码计算扭矩和弱磁时用的是Wb,接错单位会让扭矩估算偏到完全没法用。
2.4 三个参数辨识的先后顺序和耦合关系
三个参数不是独立的,辨识顺序错了,后面的参数全是错的。
我的经验是严格按这个顺序来:先电阻,再电感,最后磁链。
- 电感辨识需要知道电阻,因为电压方程里有Rs×id这一项;
- 磁链辨识在计算反电动势时也要扣除电阻压降的影响;
- 而电阻辨识完全不依赖电感和磁链,静态直流注入就可以了。
温度因素贯穿整个过程。电阻随温度变化最明显,电感受温度影响稍弱但也存在,磁链则是明显的负温度系数。所以整套辨识必须在短时间内完成,避免电机在辨识过程中因为注入电流而大幅升温。我一般把三轮辨识的总时长控制在2分钟以内,中间如果发现电机外壳温度明显升高,就停下来等冷却再继续。
3. TI DSP上的程序实现:状态机、ADC采样与核心辨识函数
3.1 整体架构:状态机把辨识流程拆成可Debug的步骤
整套辨识程序放在TI C2000系列DSP上跑,我以TMS320F28335为例。这个平台的特点是定点为主,但可以通过IQmath库做小数运算,运算速度足够跑3~4个闭环,做离线辨识毫无压力。
程序的主结构是一个状态机,放在后台主循环里切换,而电流环和ADC采样放在PWM中断里执行。状态定义大致是:
typedef enum { IDLE = 0, RS_PREPARE, RS_INJECT, LS_LD_INJECT, LS_LQ_INJECT, FLUX_SPIN_UP, FLUX_SAMPLE, IDENT_DONE } IDENT_STATE;每个状态做什么事情一目了然,调试异常时只要看卡在哪个状态,就能快速定位问题。状态切换和数据分析在主循环里做,中断里只负责执行当前状态对应的控制策略和采样记录。这个分工很重要,如果把所有逻辑都塞进中断,一个采样周期根本跑不完,调试起来也极其痛苦。
状态机的跳转条件是核心:电阻辨识要等电流稳定,电感辨识要等电流斜率窗口结束,磁链辨识要等转速收敛。每个条件都用一个独立的"完成标志位"控制,不从中断里直接改状态变量,避免多级中断嵌套导致的逻辑混乱。
3.2 PWM与ADC采样时刻的配合:纹波最小化的关键
参数辨识的精度很大程度上取决于电流采样质量。如果采样时刻不对,一个开关周期内的电流纹波会让读数抖动非常厉害,后面的平均和斜率计算全部失真。
我采用的方案是用ePWM模块的计数器归零事件触发ADC采样,刚好采在一个PWM周期的中心点。这个时刻上下桥臂都处于稳定状态,电流纹波处于最低点,是信噪比最好的采样窗口。
关键配置大致是:
// EPwm1 作为ADC触发源,计数器等于0时触发SOCA EPwm1Regs.ETSEL.bit.SOCASEL = 1; // 计数器归零触发 EPwm1Regs.ETSEL.bit.SOCAEN = 1; // 使能SOCA触发 EPwm1Regs.ETPS.bit.SOCAPRD = 1; // 每个周期触发一次 AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 1; // ADC SOC0由EPwm1触发ADC采样完成后,在中断里读取ADCRESULT寄存器,转换成实际电流值。这里还有一个细节:ADC结果寄存器读出来的是带符号的12位或16位整数,必须减去一个由零电流标定得到的偏置值,否则直流注入时电流很小的工况下,零点偏移会造成很大误差。
3.3 IQmath定标与量纲处理
定点DSP上没有硬件浮点单元,直接用float会拖慢速度。我统一用IQmath库做定标运算,全工程采用GLOBAL_Q = 24。
IQmath用起来不复杂,核心就是三点:真实值乘以2^Q次方变成定点数,用_IQ()宏把浮点亮转成定点,用_IQmpy、_IQdiv做定点乘除。关键是量纲基准要提前定义清楚,比如以额定电压、额定电流作为标幺基准:
#define V_BASE (24.0f) // 标幺基准:24V母线 #define I_BASE (10.0f) // 标幺基准:10A额定电流 #define R_BASE (V_BASE / I_BASE) #define L_BASE (V_BASE / I_BASE * 0.001f) // 毫亨量纲,需根据电机调整 #define PSI_BASE (0.1f) // 韦伯量纲基准所有采集到的ADC原始值都要先换成标幺值再参与运算,最后辨识结果再乘回真实物理量纲。这个转换在早期调试阶段非常容易出错,我的建议是每个中间量都顺手做一次量纲检查,比如单位是欧姆、亨还是韦伯,标错一个换算系数,结果可能会差好几位数。
3.4 电阻辨识函数的关键实现
电阻辨识的核心代码并不复杂,真正的工作量在延时、滤波和管压降补偿上。
void Rs_Identify(void) { Uint16 i; Uint16 sample_cnt = 0; int32 sum_id = 0; // 锁转子后,d轴施加固定占空比命令 IdRef_IQ = _IQ(0.2); // 额定电流的20% IqRef_IQ = _IQ(0.0); EnInvPwm(); // 使能PWM输出 DELAY_US(500000); // 等待直流电流稳定,至少500ms // 连续采样32个电流值做平均 for (i = 0; i < 32; i++) { sum_id += AdcResult_id; // 中断里已经完成坐标变换,这里直接读id sample_cnt++; DELAY_US(1000); } // 依据PWM占空比和母线电压计算d轴平均电压 Ud_avg_IQ = _IQmpy(Vdc_IQ, Duty_IQ) - VoltComp_IQ; // 三线制接线,两相串联通电,所以除以2 Rs_IQ = _IQdiv(Ud_avg_IQ, (_IQmpy(_IQ(2.0), Id_avg_IQ))); Rs_ohm = _IQtoF(Rs_IQ) * R_BASE; }VoltComp_IQ 是死区和管压降的等效补偿电压。这个值不是拍的,需要在同一个母线电压和开关频率下标定一次:让电机堵转,分别给一个较小的电流和较大的电流,测出两组U和I,把电压轴截距算出来,那就是逆变器非线性带来的等效压降。
电阻辨识的注入时间不要超过1秒钟。时间太长绕组发热,测出的电阻会偏高,而且后面对电感辨识还会叠加温度误差。如果感觉一次测量噪声大,可以停下来让电流归零,等几秒再重新注入第二次,而不是连续长时间通电。
3.5 电感辨识函数的关键实现
电感辨识的关键在于准确获取电流上升斜率。我把阶跃触发和斜率计算分开了:中断里负责采样,主循环里负责计算。
void Ls_Identify(Uint16 rotor_angle_sel) { // rotor_angle_sel = 0 测Ld,转子锁定0° // rotor_angle_sel = 1 测Lq,转子锁定90° // 建立d轴阶跃电压 Ud_Step_IQ = _IQ(0.15); // 阶跃电压标幺值,需按电阻预估调整 IdRef_IQ = Ud_Step_IQ; // 开环阶跃,不用电流环闭合 // 采样窗口设定 Uint16 k = WINDOW_START; for (i = 0; i < SAMPLE_POINTS; i++) { id_buf[i] = id_history[k]; // 从环形缓冲里取暂态期间的id k += WINDOW_STEP; } // 中央差分求斜率,取中间段均值 int32 sum_slope = 0; for (i = 1; i < SAMPLE_POINTS - 1; i++) { slope_i = (id_buf[i+1] - id_buf[i-1]) / (2.0f * Ts); sum_slope += slope_i; } slope_avg = sum_slope / (SAMPLE_POINTS - 2); // 计算暂态中点电流 id_mid = id_buf[SAMPLE_POINTS / 2]; // L = (U - Rs*id) / (di/dt) L_IQ = _IQdiv(_IQsub(Ud_Step_IQ, _IQmpy(Rs_IQ, id_mid)), slope_avg); L_mH = _IQtoF(L_IQ) * L_BASE * 1000.0f; }这个实现里有三个必须注意的细节。
第一,采样窗口的起点不能从阶跃瞬间开始。阶跃刚加上的前几个PWM周期,PWM占空比从零跳到目标值,高次谐波很大,电流波形上会有短暂的振铃,把这一段纳入斜率计算会严重污染结果。我一般跳过前10个开关周期再开始记录。
第二,斜率计算不能取首尾两点。前面讲过,PWM纹波和ADC噪声在两点差分下会被放大到无法接受,必须用多点多斜率平均。实测下来,三点中央差分加平均后的电感重复性在3%以内,首尾两点差分可能偏差20%。
第三,电流爬升的结束点必须控制住。如果阶跃电压给得太大,电流超过过流保护点,整个程序会直接跳故障。我在阶跃前会先根据电阻和预估电感算一个电流上限,软件里再做一级同步钳位,任何时刻电流超过额定35%就立即关闭PWM。
3.6 磁链常数辨识函数的关键实现
磁链辨识需要速度环参与。我这里的做法是把速度闭环跑起来,给定一个固定转速,稳定后采样电压取峰值。
void Flux_Identify(void) { // 切入速度环,给定30Hz电频率 SpeedRef_Hz = 30.0f; EnSpeedLoop(); // 等待转速收敛,允许误差±0.2Hz while (fabs(SpeedEst_Hz - SpeedRef_Hz) > 0.2f) { DELAY_US(10000); } // 采样多个周期的相电压峰值 Uint16 i; int32 v_peak = 0; for (i = 0; i < 128; i++) { v_peak = MAX(v_peak, AdcResult_Vphase); DELAY_US(500); // 约覆盖若干个周期 } // 反电动势峰值 = 电压峰值 - 电阻压降校正 Vemf_IQ = _IQsub(v_peak, _IQmpy(Rs_IQ, _IQ(0.9))); // 0.9为经验补偿系数 W_e_IQ = _IQmpy(_IQ(2.0 * PI), SpeedRef_Hz_IQ); Psi_f_IQ = _IQdiv(Vemf_IQ, W_e_IQ); Psi_f_Wb = _IQtoF(Psi_f_IQ) * PSI_BASE; }需要注意的一点是,电压峰值采样必须在空载或轻载状态下进行。负载一重,定子电流产生的压降和磁路饱和会让反电动势波形发生畸变,峰值和基波幅值不再对应,磁链算出来偏大。
还有,速度闭环的PI参数此时不需要非常精确,因为辨识过程中只关心稳态转速是否准确,不关心动态响应快慢。我甚至会把电流环带宽调低一些来抑制噪声,反正这一步只测电压峰值,动态性能越稳越好。
4. 从锁转子到输出报告:完整辨识流程与结果校验方法
4.1 辨识前的准备:硬件、保护与接线检查
很多工程师把辨识程序写好了就往现场跑,结果不是烧保险就是辨识结果离谱。我现在的固定流程是,先把准备工作做扎实:
- 确认母线电压在额定范围内,无欠压过压报警;
- 用电流探头或钳形表确认电流采样通道的偏置已经校准,零电流读数在±0.05A以内;
- 锁紧转子。条件允许的话用机械锁轴,别用软件锁转子的方式托底,机械锁最可靠;
- 辨识时把注入电流标定值先设小一点,比如额定电流的15%,跑通后再放大到25%,一旦出现异常先从小电流排查。
母线电压、IGBT温度、电位器位置这种保护阈值,我会在辨识模式里单独设置一套更保守的参数。毕竟辨识阶段程序处于"半开环"状态,出问题的概率比正常闭环高得多。
4.2 完整的辨识操作步骤
以我这套程序为例,完整操作流程是这样的:
- 控制器上电,先进入待机模式,确认无故障代码;
- 执行零电流ADC偏置校准,记录每个电流通道的零点偏移;
- 锁住电机转子,确认机械锁定可靠;
- 启动电阻辨识,观察Id是否稳定在设定值,程序自动计算并存储Rs;
- 保持锁定状态,启动Ld辨识,观察电流上升斜率是否平滑,自动记录Ld;
- 把转子转到90°电角度并再次锁紧,重复阶跃,记录Lq;
- 解除转子锁定,让电机自由旋转,切换到速度闭环,给定30Hz;
- 等待转速稳定后自动采集电压峰值,计算并存储ψf;
- 参数写EEPROM或Flash,控制器重启后直接调用新参数;
- 做一次电流环阶跃响应测试,确认实际带宽和设计值接近。
整个流程自动化程度越高越好。我最终版本的状态机只要人工二步:第一步是锁定转子并确认,第二步是松开转子并确认,中间的所有电压注入、采样、计算全部由DSP自动完成。
4.3 辨识结果校验的三种办法
辨识结果靠谱不靠谱,不能只看程序没有报错。我一般用三种方法交叉验证。
第一种,离线LCR表对照。用LCR表在1kHz下直接测电机端电阻和电感,与辨识结果对比。注意LCR表测出来的是静态值,和驱动器测的包含逆变器影响的数值本来就有差异,要允许10%以内的偏差。
第二种,反电动势实测对照。电机空载跑到一个固定转速,用示波器在电机端直接量线电压波形,读幅值,再用ψf=V/(√3×ωe)反推磁链,与程序辨识值对比。这是最可靠的磁链校验方法。
第三种,电流环动态响应验证。给电流环一个阶跃指令,记录iq(t),看它上升到63%稳态值的时间常数τ。RL模型里的τ=L/R,如果实测τ和辨识出的L/R相差超过15%,说明辨识值内部不自洽,需要复查。
5. 实测数据、误差来源与调试中容易踩的坑
5.1 一组有代表性的实测数据
我拿某款2kW表贴式PMSM跑了一遍完整辨识,测到的一组数据是这样的,四组重复测量的结果都列出来了:
| 参数 | 第1次 | 第2次 | 第3次 | 第4次 | 重复性波动 |
|---|---|---|---|---|---|
| Rs (Ω) | 0.822 | 0.815 | 0.819 | 0.830 | ±0.9% |
| Ld (mH) | 2.34 | 2.29 | 2.38 | 2.32 | ±1.9% |
| Lq (mH) | 2.62 | 2.54 | 2.60 | 2.58 | ±1.5% |
| ψf (Wb) | 0.0881 | 0.0876 | 0.0884 | 0.0878 | ±0.5% |
从数据能看到,电阻的重复性最差,电感次之,磁链稳定性最好。这个分布是有原因的。电阻辨识电流小,信噪比天然偏低,同时PWM死区补偿的残余误差在这个量级下占比较高。如果重复性超过3%,第一优先检查的方向不是算法,而是电流采样的零点漂移和锁轴是否可靠。
5.2 误差来源的定量分析和修正思路
误差来源不能只是定性说"有误差",要尽可能拆到每一项,工程上才能真正改进。
| 误差来源 | 对哪个参数的影响 | 典型幅度 | 修正手段 |
|---|---|---|---|
| ADC零点偏置 | Rs,Ld/Lq | 零点偏移5mV导致Rs误差约0.5% | 每次上电先做零电流校准 |
| 死区/管压降 | Rs,ψf | 等效压降0.5~1V,低压工况可达10% | 标定V-I截距做补偿 |
| 绕组温升 | Rs | 工作温度比室温高50℃时偏差约20% | 记录温度,线性折算回25℃ |
| 电流过大导致饱和 | Ld/Lq | 电流超过额定值后L下降10%以上 | 注入电流限定在额定30%以内 |
| 电压测点在逆变器出口 | ψf | 偏大约5%~10% | 使用K_comp系数或电机端测量 |
这里我想特别提一下温度折算。铜绕组的电阻温度关系近似线性:
Rs_25 = Rs_T / (1 + α × (T - 25))
α取0.00393/℃。辨识时如果电机已经运行了一段时间,线圈温度可能已经到70℃,直接从70℃的电阻去标定电流环,到冬天冷机启动时又要重调。所以辨识程序里最好记录散热器或壳温,把电阻换算到标准25℃存储,运行再按实际温度反推。
5.3 调试中我踩过且再没踩过的坑
最后分享几个我在这个项目里实际踩过、改了之后再也没有碰到的坑。
第一个坑是电阻辨识的简短注入时间。我第一次跑的时候,电流稳定判定用的是50ms延时,结果采到的Id还在缓慢爬升,算出的电阻偏小。后来改成500ms延时,又带来绕组发热的问题。最终方案是先快速预判:给一个10ms脉冲突入,测试电流变化趋势,估算一个大致的稳定时间,再精确延时。这个办法兼顾速度和温度控制。
第二个坑是电感辨识的采样窗口。一开始我用固定的10ms窗口,有一台高电感电机还没等到窗口结束电流就饱和了,还有一台低电感电机窗口内电流已经完成暂态,斜率算出来趋近于零。现在我都是先根据Rs和预判Ld估算电气时间常数,自动把窗口设成3~5个时间常数,保证采样落在暂态区间内。
第三个坑是磁链辨识时转速还没稳定就开始采样电压。有一次程序在转速误差还有2Hz的时候就进入采样阶段,采到的电压峰值一会儿大一会儿小,磁链结果不停跳动。后来加了转速收敛判定,误差必须小于0.2Hz且保持10个周期,磁链的重复性立刻好了很多。
第四个坑来自软件锁转子。低摩擦负载下,软件锁的转子在阶跃电流作用下会有微小滑动,本来锁在0°测Ld,实际转子偏了十几度,测出来的结果变成了Ld和Lq的混合值,看起来数据"稳定",但放进电流环就是不对。后来只要条件允许,一律机械锁轴,这问题再没出现过。
我实际跑完这套程序最大的体会是:参数辨识本身不复杂,难的是把逆变器非线性和采样误差压下去,这两个东西每压下去一分,后面的电流环调试就能省十倍的时间。最后再分享一个小技巧,别迷信单次测量结果,同一参数连续测三次取中位数,如果三次波动超过3%,优先怀疑采样偏置和机械锁紧状态,而不是去改算法。把这一步做扎实了,这套pmsm电阻电感磁链常数辨识程序才能真正成为你能反复依赖的工具。