1. 全速域无感控制的架构设计与核心逻辑
1.1 为什么要把"预定位+IF强拖+切换策略+SMO"拼在一起
把永磁同步电机(PMSM)的无感控制做成一个能在全速域范围内稳定运行的方案,是所有做电机驱动的人都会碰到的硬骨头。所谓"无感",就是不装旋转变压器、不装霍尔,只靠相电流和母线电压这些易测量的量,把转子位置和转速估算出来。这件事的难点不在于"某个转速下能跑",而在于从零速、极低速到高速、甚至弱磁区,整个速度区间内都不能掉链子。
我尝试过只用滑模观测器(Sliding Mode Observer,SMO)从零启动,结果很直接:零速时反电动势为零,观测器方程里没有可用的位置信息,转子在哪里根本不知道,给什么力矩都会随机转,遇到带载启动直接堵转或反转。后来也试过纯IF开环强拖到底,高速段效率低、动态响应差,负载一变就失步。这两条路走不通,逼着我必须做"分段处理、平滑拼接"。
B1.0版本的整体思路就是这样一层一层堆起来的:先用预定位把转子拉到已知的d轴角度,再用IF强拖(电流-频率比恒定)把电机从零速平稳带到观测器能工作的转速区间,然后通过降q轴电流切换策略把控制权从开环交接到闭环SMO,最后靠SMO支撑中高速运行。四个环节缺一不可,而且中间两个衔接处(IF到切换、切换完成到SMO接管)是最容易翻车的地方。
这套架构适合谁?如果你正在做风机、水泵、压缩机、电动工具这类不需要精确零速转矩、但要求宽调速范围和高可靠性的驱动,这套方案基本可以直接搬。如果你要做的是伺服级的位置控制,零速要满转矩,那无感方案本身就不适配,得换有感。
1.2 全速域分段策略的边界怎么划
分段不是拍脑袋定的,每一段的边界都跟物理量挂钩。我把三个阶段的边界定义如下:
| 阶段 | 速度范围 | 控制方式 | 依赖的物理量 | 退出条件 |
|---|---|---|---|---|
| 预定位 | 零速 | 开环电流矢量 | 电流闭环 | 定位时间到且有稳定电流 |
| IF强拖 | 0 ~ ω_sw | 开环V/F+电流闭环 | 电流、设定频率 | 估算转速与设定频率误差小于阈值 |
| SMO闭环 | ω_sw ~ ω_max | 双闭环+SMO | 估算反电动势 | 无(持续运行) |
| 弱磁区 | ω_max以上 | 闭环+弱磁 | 母线电压利用率 | 无 |
其中 ω_sw 这个切换转速是核心参数。定得太低,SMO 估算的反电动势信噪比不够,切换瞬间抖动大;定得太高,IF阶段拖得太久,效率损失和发热都上去了。我在 40kW 表贴式PMSM上实测,额定转速 3000rpm 的电机,ω_sw 定在 8%~12% 额定转速(约 240~360rpm)比较稳。这个值跟电机的凸极率、定子电阻、母线电压都有关系,不能照搬。
1.3 各环节的职责分工与参数传递
很多人写无感控制代码时最大的问题是"各模块各写各的,参数不统一"。B1.0 里我强制所有环节共用同一套电流采样和坐标变换结果,各阶段只切换"角度来源"和"电流指令来源",其他都是同一套东西在跑。这样做的好处是切换时不会因为坐标系不一致产生额外扰动。
具体分工:
- 预定位模块:输出固定的 d 轴电流指令,角度强制为 0,持续一个固定时间,让转子磁极对齐到 d 轴。
- IF强拖模块:输出固定的电流幅值(If),频率由斜坡发生器给,角度通过对频率积分得到。
- 切换模块:监控 SMO 估算转速与 IF 设定频率的偏差,当两者接近且持续一定时间,开始把交流电流从小到大、把开环角度向估算角度过渡。
- SMO模块:全程都在后台运行,只是切换前它的输出不被用于控制,切换后才接管。这一点非常重要——SMO必须先"热身"再接管,否则初始估算错误会导致切换失败。
注意:不要在设计时让 SMO 只在切换时刻启动,一定要让它从预定位结束就开始跑,让它有足够时间去收敛,切换时它已经是热状态。
这三个环节加起来就是全速域无感控制的完整骨架。后面几节我会把每个环节拆开,讲清楚参数怎么定、代码怎么写、坑在哪里。
2. 预定位:让转子先"站好队"再启动
2.1 预定位的物理本质与时长计算
预定位说白了就是:给电机一个固定的电流矢量,方向定死在 d 轴(电角度0),通电一段时间,转子磁极会被这个电流产生的磁场"吸"到对齐位置。对表贴式PMSM来说,此时转子d轴就和施加的电流矢量方向一致,之后无论IF还是SMO,起始角度都是已知的0度。
听上去简单,但时长和电流幅值不能乱给。时间太短,转子还没对齐就启动,等于没定位;时间太长,白白发热,严重时会让电机过热保护。我的经验是,预定位时间 t_pre 至少要覆盖转子从最大可能偏差角度旋转到对齐位置所需的时间:
t_pre = (θ_max_deviation / ω_response) × 裕量系数
θ_max_deviation 最坏情况是 π 电弧度(转子可能停在反方向),ω_response 是转子在预定位力矩作用下的响应角速度。这个响应角速度取决于电流幅值产生的力矩 vs 转子转动惯量。工程上不便于精确计算,我的做法是用一个保守公式给下界,再通过实测微调:
t_pre ≈ max(0.2s, J × Δω / T_pre × 1.5)
其中 J 是转动惯量,Δω 是期望的定位角速度,T_pre 是定位电流产生的力矩。40kW电机上我最终定的是 500ms,电流给到额定电流的 60%,实测 300ms 时转子已对齐,多出来的 200ms 是安全裕量。
2.2 定位电流幅值的选择逻辑
电流给大点,定位力矩大、对齐快,但代价是发热和可能的机械冲击。给小了,带载或大惯量负载时定位不动。
我的选值逻辑是:定位电流产生的力矩至少要能克服最大静态负载力矩的2倍,同时不超过电机额定电流的80%(留出散热裕量)。如果是风机、水泵这类负载,启动时负载力矩很小,甚至可以给到30%额定电流就够。如果是带齿轮箱、有静摩擦的场合,给到70%~80%都不为过。
这里有个测试时踩过的坑:一次带减速机的场合,我用50%额定电流预定位,仿真里对齐得很漂亮,实测时电机纹丝不动,转子还停在原来那里。原因是减速机的静摩擦力矩方向跟电磁力矩方向恰好相反,力矩不够。后来把电流提到75%,立刻对齐。所以定位电流一定要按"最恶劣工况下的负载"来给,而不是按空载或轻载。
2.3 预定位阶段的坐标变换处理
预定位期间,角度 θ 固定为 0,也就是说我们直接在 dq 坐标系上给指令:id = I_pre,iq = 0,然后通过逆Park变换到 αβ 坐标,再送SVPWM。
// 预定位阶段核心代码示意 float theta_pre = 0.0f; // 强制电角度为0 float id_ref = I_PRE; // 定位电流,d轴 float iq_ref = 0.0f; // q轴为零 // 逆Park变换 float ialpha = id_ref * cosf(theta_pre) - iq_ref * sinf(theta_pre); float ibeta = id_ref * sinf(theta_pre) + iq_ref * cosf(theta_pre); // 送入SVPWM模块生成开关信号 svpwm_calc(ialpha, ibeta);关键点是:预定位期间不要用电流环的反馈去修改角度,角度必须死死钉在0,电流环只负责把 id 稳定到指令值。我曾经把角度写成"atan2(iq, id)",结果定位期间角度跟着电流抖动乱转,定位时间到了还没对齐。这个错误很隐蔽,因为代码看起来"很合理"。
实操心得:预定位结束前,先用一个极短的时间(比如20ms)把电流幅值平滑降到0,避免突然断电产生机械回弹噪声。这一步在安静场合(如室内风机)尤其明显。
2.4 预定位成功与否的判断
不能盲信时间到了就算成功,得有一个判据。我的做法是持续监控 dq 轴上电流的实际值和母线电流的波动。如果定位成功,id 会稳定跟随指令,iq 应该接近0且抖动很小;如果定位失败(比如电流太小、负载太大),id 达不到指令、iq 会持续有较大值(因为转子在动)。
判据可以写成:预定位最后 50ms 内,|iq| < 5% 额定电流 且 |id - id_ref| < 10% 额定电流,则认为定位成功,否则报预定位失败故障,等待重试或人工干预。
3. IF强拖:从零速平稳带到切换点
3.1 IF强拖为什么比V/F更适合PMSM
很多人第一反应是用V/F(恒压频比)启动,因为异步电机就是这么干的。但PMSM的磁场由永磁体提供,电压和频率之间没有异步机那种严格的耦合关系,直接用V/F容易在低频时电流失控。IF强拖的核心是控制电流而不是电压——给一个恒定幅值的定子电流矢量,频率按斜坡上升,让电流矢量拖着转子转。
用电流闭环来做IF的好处是:低频时即使反电动势很小,电流也能精确受控,不会出现电流冲击。频率上升的过程中,转子被电流矢量"牵引"着同步旋转,只要负载力矩不超过电机能提供的最大同步力矩,就不会失步。
IF的电流幅值怎么定?太大会导致铜损大、发热,还会降低切换时的裕量;太小则带不动负载。我的经验是IF电流取额定电流的40%~60%,具体看负载启动转矩需求。如果负载是风机水泵类平方转矩负载,40%足够;如果带恒定阻力矩负载,60%甚至更高。
3.2 频率斜坡的设计与加速度限制
频率斜坡是IF强拖的灵魂。斜坡太陡,转子跟不上,会失步;斜坡太缓,启动时间长,用户等得不耐烦。加速度的物理约束是:电磁转矩必须始终大于负载转矩和加速转矩之和。
Δω/Δt ≤ (T_em - T_load) / J
所以,给定电流幅值后,能提供的最大 T_em 是固定的,负载越重、惯量越大,斜坡就得越缓。我的做法是先给一个保守的加速度,比如从0到切换转速用2秒,然后根据实测逐步加快。40kW电机带风机负载,我实际用的是0.8秒从0拖到300rpm,对应加速度约 39 rad/s²,很稳。
频率斜坡代码实现上,用一个递增的计时器或积分器:
// IF强拖频率斜坡 static float omega_if = 0.0f; float accel = 2.0f * PI * SW_FREQ / T_RAMP; // 从0拖到切换频率的加速度 if (omega_if < OMEGA_SW) { omega_if += accel * Ts; // Ts为控制周期 } float theta_if = theta_if + omega_if * Ts; // 角度积分 // 归一化到[0, 2π)注意角度积分必须用实际值累加,不要用模运算后的值去积分,否则会有角度跳变。每次累加后单独做归一化,这样角度是连续的。
3.3 IF强拖期间的电流矢量控制
IF期间,角度来自频率积分,电流幅值来自指令,这两个量确定后,通过逆Park变换生成三相电流指令,交给电流环去跟踪。这期间的 dq 轴指令分配通常是:全部给 q 轴(id=0),因为我们要的是转矩。
电流环的响应速度必须足够快,否则频率上升时电流跟踪不上,产生幅值和相位误差。电流环带宽我一般设在 1kHz 以上,也就是采样频率至少 8kHz~10kHz。采样频率低了,IF阶段电流会有明显纹波,切换时会出问题。
注意事项:IF期间如果发生堵转或负载突增,电流会饱和,频率继续涨会导致失步。要在IF阶段也加上电流幅值限制和失步检测——检测估算转速(SMO给的)与设定频率的偏差,偏差过大立刻降频或停机。
3.4 从零速到切换点的过渡细节
IF起步的瞬间其实是最容易出问题的时刻。从预定位结束到IF开始的衔接,电流幅值要从预定位的 I_pre 平滑过渡到 I_if,角度要从0开始积分,不能有跳变。我的做法是预定位结束后先保持电流为零约50ms,然后以斜坡把电流拉到 I_if,同时频率从0开始积分。
有些人喜欢预定位结束后直接切IF不归零,这时电流矢量方向还在d轴(角度0),而IF要求矢量方向随角度转,如果角度从0开始积分,第一步的矢量方向还是d轴,所以其实不会跳变。但我还是推荐归零再起,因为有归零动作后,任何时序问题都能通过"看电流为零"来判断,调试时直观得多。
4. 降q轴电流切换策略:从开环到闭环的平滑交接
4.1 为什么不能直接硬切
IF到SMO的切换,是整个方案里最考验功力的地方。如果直接硬切——前一拍角度来自IF积分,后一拍角度来自SMO估算——两个角度几乎不可能完全相等,瞬间的相位跳变会在电流环里引起巨大的电流冲击,轻则抖动,重则过流保护。
我最早的做法就是硬切,结果电机在切换点发出明显的"咯噔"一声,电流尖峰到额定值的2倍以上,几次之后IGBT就热得厉害。后来改成渐变切换,问题解决。
降q轴电流切换的核心思想是:切换过程中不改变角度来源的连续性,而是通过逐渐减小q轴电流(也就是减小转矩输出),同时把角度从IF平滑过渡到SMO,让整个过程在电流幅值较小的状态下完成。这一步很多人不理解,为什么要降q轴电流?因为切换时的风险主要来自相位跳变引起的电流冲击,如果此时电流幅值小,冲击就小,过渡更安全。
4.2 双角度渐进混合的具体做法
我用的切换方式是角度混合,也就是同时计算 IF 角度 θ_if 和 SMO 角度 θ_smo,然后按一个从0到1的权重系数 w 做插值:
θ_used = (1 - w) × θ_if + w × θ_smo
权重 w 在切换时间段内从0线性或S形增加到1,切换时间段一般为100ms~300ms。这段时间内,q轴电流指令同时从 IF 阶段的 I_if 逐渐降到闭环阶段的目标值(通常比 I_if 小,甚至接近0,只保留负载所需的转矩电流)。
这个混合必须注意角度归一化问题:θ_if 和 θ_smo 都必须在同一个 [0, 2π) 区间内,而且插值前要处理"跨界"情况——比如 θ_if = 179°,θ_smo = -179°(即181°),直接插值会得到接近0°的错误结果,实际应该插值到180°附近。处理方法是先算两者差值,如果差值超过π,就把其中一个加上或减去2π再插值。
// 角度平滑混合,处理跨界 float angle_diff = theta_smo - theta_if; if (angle_diff > PI) angle_diff -= 2.0f * PI; else if (angle_diff < -PI) angle_diff += 2.0f * PI; float theta_used = theta_if + w * angle_diff; // 再归一化这点很容易被忽略,但一旦没处理,切换时会有一次角度翻转,电流直接炸。
4.3 切换的触发条件与判据设计
什么时候开始切换不能随便定时间。我的触发条件是三个同时满足:
- SMO 估算转速 ω_smo 与 IF 设定频率 ω_if 的偏差小于 5% 且持续 50ms 以上;
- 估算角度与 IF 角度在最近一段时间(比如100ms)内的平均偏差小于某个阈值(比如20°电角度);
- 估算转速已经超过设定切换转速 ω_sw,且保持上升趋势或稳定。
三项都满足才启动切换。这个多条件判断能过滤掉很多误切换。我遇到过一次特殊情况:负载突变导致 SMO 估算短时偏离,如果只看转速偏差,会误判为可以切换,结果切过去就失步。加上角度偏差判据后就稳了。
实操心得:切换判据一定要在调试阶段把 ω_smo、ω_if、角度偏差这些量做成实时曲线观察,只有看到它们在实际工况下都收敛了,才敢把切换阈值定死。
4.4 切换后的收尾与状态确认
切换完成后(w = 1),角度完全由 SMO 提供,系统进入常规双闭环控制。此时还要确认几件事:
- 电流环是否稳定,没有持续振荡;
- SMO 估算转速是否跟随实际转速(用负载扰动测试);
- 母线电压利用率是否正常,有没有进入过调制。
如果切换后发现电流有周期性波动,通常是 SMO 参数没调好或角度补偿没做对。我一开始忽略了 SMO 的相位补偿,导致切换后电机转速比设定值略低且电流偏大,补上角度补偿后就正常了。具体补偿量跟 SMO 的截止频率和电机转速有关,后面讲 SMO 时会细说。
切换完成后,整个无感控制就进入稳态。这个过程听起来复杂,但实际代码量并不大,关键是每个环节的参数都要在真实工况下验证。
5. 滑模观测器(SMO)的设计与调参实战
5.1 SMO估算反电动势的基本原理
滑模观测器的本质是通过一个滑模面,让人为构造的观测电流快速跟踪实际电流,跟踪误差在滑模面上被强迫为零,此时观测器中包含的反电动势项就可以被提取出来,进而反推出转子位置和转速。
具体来说,PMSM在 αβ 坐标系下的电流方程是:
diα/dt = (uα - R·iα - eα) / L diβ/dt = (uβ - R·iβ - eβ) / L
其中 eα、eβ 是反电动势,包含位置信息。SMO 构造一个观测电流 î,让 î 跟踪 i,误差 e_i = i - î 被切换到滑模面上。常用的滑模控制律是符号函数或饱和函数:
î(k+1) = î(k) + Ts/L × (u - R·î - z) z = K_slide × sign(i - î)
当滑模发生时,z 中就包含了反电动势 e 的信息,用低通滤波把 z 滤波后得到 e 的估计,再通过 atan2(-êα, êβ) 得到角度,通过对角度求导或通过锁相环(PLL)得到转速。
符号函数 sign 会带来抖振,工程上一般用饱和函数 sat 或 sigmoid 函数来做平滑。我用的是饱和函数,边界层厚度需要根据电流噪声来定,太薄抖振大,太厚估计不准。
5.2 滑模增益与滤波截止频率的整定
滑模增益 K_slide 是最关键的参数。给太小,滑模面到达不了,观测器失稳;给太大,抖振严重,估计量噪声大。理论上 K_slide 要大于反电动势的最大幅值,也就是要大于 ω_max × ψ_f(ψ_f 是永磁磁链)。
我的整定方法是:先按理论下限的1.5~2倍给,比如电机最高转速对应反电动势峰值 80V,那 K_slide 从 120~160 开始试,观察估计电流和实际电流的跟踪情况。如果跟踪有持续误差,加大;如果估计角度噪声大,减小或加大滤波。
低通滤波截止频率 ω_c 的选取有个权衡:截止频率高了,估计响应快但噪声大;低了噪声小但相位滞后大。相位滞后会直接导致角度估计偏差,转速越高偏差越大。所以截止频率不能定得太低,一般取 500Hz~2kHz。我常用的是 1kHz,再配合相位补偿。
补偿的角度是:
Δθ = atan(ω_e / ω_c)
其中 ω_e 是电角速度。这个补偿在高转速时非常必要,不做补偿,高速时角度偏差能有十几度,效率明显下降。
5.3 锁相环提取转速的细节
从估计角度提取转速,直接微分噪声太大,我用的是锁相环(PLL)结构,把角度误差通过 PI 调节器得到转速,同时积分得到角度,形成一个闭环。这种结构在转速波动时更平滑,也更容易做参数整定。
PLL 的带宽要跟转速环协调,一般取转速环带宽的 0.5~1 倍。带宽太高,噪声放大;太低,动态响应差。我实测 40kW 电机上 PLL 带宽取 30~50Hz 比较合适。
SMO 估计的角度有相位滞后,PLL 也会引入额外滞后,所以整个链条的相位延迟要统一评估。在切换阶段,如果 SMO 角度和 IF 角度有系统性偏差,切换后转速会有波动,严重时无法稳定。这就是为什么切换判据里要加上"角度偏差小于阈值"这一条。
5.4 SMO在极低速和高速区的不同表现
SMO 有一个天然短板:极低速时反电动势太小,被噪声淹没,估计不准。这就是为什么零速和极低速必须用 IF,SMO 只在切换转速以上接管。40kW 电机上,SMO 在 200rpm 以上估计比较可靠,200rpm 以下角度噪声明显增大。所以切换转速定在 300rpm 是有依据的。
高速区 SMO 表现反而好,因为反电动势大、信噪比高。但高速时定子频率高,控制周期内的角度变化大,需要注意采样和计算的实时性。如果控制频率是 10kHz,3000rpm(电频率 200Hz)时每个控制周期角度变化 7.2°,这个量要能精确计算,不能有大的离散误差。
另外高速弱磁区,电流分配变化大,SMO 里用的电机参数(R、L)如果不准,估计会有偏差。所以如果要做弱磁,参数辨识最好在前期做一下,或者在 SMO 里做参数自适应。
常见误区:很多人以为 SMO 就是"随便给个增益就能用",实际上 SMO 的估计质量高度依赖电机参数和滤波设计,不同电机必须单独调。同一套代码换个电机,切换就失败,这种情况我遇到不止一次。
6. 全速域实机联调:从波形到参数的全流程
6.1 调试环境搭建与安全注意
调试这类高压大功率驱动,安全是第一位的。我的基本配置是:
| 项目 | 配置 | 说明 |
|---|---|---|
| 主控 | DSP/ARM,10kHz控制频率 | 保证电流环带宽 |
| 电流采样 | 三电阻或霍尔,同步采样 | 与PWM载波同步 |
| 母线电压 | 隔离采样,带滤波 | 用于SMO计算 |
| 负载 | 风机/测功机 | 可调负载便于测试 |
| 观测 | 上位机波形,记录ω/θ/I | 必备,没有波形调不出来 |
调试顺序我建议是:先在空载下验证预定位和IF,再带轻载验证切换,最后带满载验证全速域。不要一上来就带满载+高速,出了问题很难定位。
每次上电前用限流电源预充,观察母线电压和静态电流,确认无短路再正式加压。这个流程我坚持了多年,避免了好几次炸机。
6.2 预定位与IF参数的实测标定
预定位时间、电流幅值、IF电流、频率斜坡这四个参数,我是在空载下先标定的。
预定位:给不同电流幅值,用示波器看相电流包络是否稳定。如果电流波形有明显振荡,说明定位过程转子在动,需要加大电流或延长时间。
IF:从小的电流幅值和慢斜坡开始,逐步加大加速度,观察电流波形是否跟得上。如果电流波形在频率上升时有明显畸变或滞后,说明加速度太快,降下来。
标定时我习惯记录一组曲线:ω_if、实际转速(用一个临时的编码器或反电动势估算)、iq、id。看着这些曲线协调上升,就说明IF阶段正常。
6.3 切换过程的波形诊断
切换过程是最需要波形诊断的环节。我把 IF 设置值、SMO 估计值、实际角度、q轴电流这几路信号同时打到上位机上观察。
正常情况下,切换开始后:
- q轴电流平滑下降,没有尖峰;
- SMO估计转速与IF设定频率逐渐接近,然后保持一致;
- 角度混合权重 w 从0到1,切换完成后角度完全由SMO提供;
- 全程电流波形平滑,没有突变。
出问题的典型表现:
| 现象 | 可能原因 | 处理 |
|---|---|---|
| 切换瞬间电流尖峰 | 角度未做跨界处理 | 修正角度插值逻辑 |
| 切换后转速波动 | SMO相位补偿没做 | 加补偿角 |
| 切换后电流持续振荡 | SMO增益过大或滤波太窄 | 调K_slide和ω_c |
| 切换失败退回IF | 切换判据太宽松 | 加严角度偏差判据 |
6.4 全速域联调顺序与提速过程
参数都标好后,我按这个顺序跑全速域:
- 空载:0 → 切换转速 → 额定转速,全程记录波形;
- 50%额定负载:重复上述过程;
- 100%额定负载:重复;
- 动态测试:在额定转速下突加突减负载,看SMO和电流环的响应;
- 长期运行:额定负载连续跑2小时,观察温升和参数漂移。
每一步都通过后再进行下一步。特别是动态测试,很多人省略了,结果现场一有负载扰动就出问题。
6.5 参数辨识对无感控制的意义
热词里提到的"永磁同步电机参数辨识"确实不是噱头。SMO 用到的定子电阻 R 和电感 L,如果不准,低速段角度估计会偏,切换会受影响。R 会随温度变化,冷态和热态能差30%以上。如果驱动长期运行,最好在运行中做简单的 R 在线辨识,或者至少对 R 做温度补偿。
电感 L 的偏差主要影响观测器的动态,一般影响没那么大,但如果电机凸极率高或者电流较大导致饱和,L 变化明显,也要考虑。我现在的做法是:静态先测一组 R、L 基准值,运行中用温度传感器估计 R 的变化,L 就用基准值,够用了。
7. 常见问题速查与避坑经验
7.1 启动类问题速查表
| 问题 | 典型原因 | 解决方向 |
|---|---|---|
| 预定位失败、转子不动 | 定位电流太小、负载静摩擦大 | 提高定位电流至额定60%~80% |
| IF启动失步 | 频率斜坡太快、电流幅值不足 | 降低加速度、提高IF电流 |
| IF阶段电流不稳 | 电流环带宽不够 | 提高采样频率和电流环增益 |
| 切换前SMO不收敛 | SMO增益太小或还没热身 | 提高K_slide、提前启动SMO |
| 切换瞬间过流保护 | 角度跳变 | 做角度跨界的平滑插值 |
7.2 运行类问题与排查思路
运行阶段最常见的是转速波动和电流异常。转速波动先看是周期性还是随机性:周期性波动通常是SMO参数或PLL参数问题;随机性波动可能是采样噪声或参数不准。
电流异常放大,先检查角度估计是否正确——用实际编码器对比一下估计角度,偏差大就是SMO问题。如果角度对但电流还是大,可能是电流环参数或母线电压采样问题。
有一次我遇到电机在额定转速下电流比预期大20%,查了半天发现是母线电压采样滤波时间常数设太大,导致 SMO 里用的电压滞后于实际,估计角度偏差。减小滤波时间常数后,电流就恢复正常。
7.3 我自己踩过的三个坑
第一个坑是角度归一化不统一。预定位、IF、SMO三个模块最初各自做了归一化,有的用[0,2π),有的用[-π,π),切换时角度直接乱套。后来统一为[0,2π),问题消失。
第二个坑是SMO在切换前不跑。我以为切换后才需要SMO,结果切换时SMO从零开始收敛,收敛期间角度不可信,切换肯定失败。必须从预定位后就让SMO持续运行。
第三个坑是滤波电容和采样延迟。母线电压和电流采样都有硬件滤波和ADC延迟,这些延迟如果没在算法里补偿,会导致SMO估计有偏差。我在高转速时明显感觉到,补偿采样延迟后就好多了。
7.4 提升全速域性能的几个技巧
想要更稳更高效,可以试这几个方法:
- SMO用变增益:低速时用小增益降低抖振,高速时用大增益提高响应,按转速分档或线性插值。
- 切换用S形权重:线性权重在起点和终点有速度突变,S形权重更平滑,切换更安静。
- 电流环加前馈:用估计反电动势做前馈,能提高电流环带宽和动态响应。
- 负载观测:在SMO后加一个负载转矩观测,可以提前补偿负载变化,减少转速波动。
这些都不是必须的,但做了之后确实能感觉到差别。尤其是变增益和S形权重,改动不大,效果明显。
8. 后续扩展方向与个人体会
这套 B1.0 版本目前能稳定覆盖从零速到额定转速的全速域无感控制,实测启动时间、切换平稳度、稳态效率都达到了预期。如果要继续往下做,我会优先考虑三个方向:一是弱磁区扩展,让转速能超过额定;二是参数自适应,特别是R和L的在线辨识;三是无位置传感器算法本身的升级,比如用高频注入补充零速段,把SMO扩展到全局。
最后分享一个我调试时的小习惯:每次改参数都单独改一个,改完记录波形和数据。无感控制参数之间耦合很强,一次改多个参数,出了问题根本不知道是哪个引起的。我见过不少人调了几天都没调好,就是一次改太多。慢慢来,反而快。
这套方案从最初只能空载跑,到现在带满载全速域稳定运行,中间花了大概两个多月,大部分时间都在调SMO和切换。代码其实不难,难的是理解每个参数背后的物理意义,以及耐心地在真实工况下验证。希望这些经验能帮你少走一些弯路。