1. 项目缘起与整体方案拆解1.1 为什么要在全速域上死磕无感控制永磁同步电机PMSM的矢量控制FOC本身已经是非常成熟的技术但一旦把位置传感器拿掉事情就变得棘手起来。我接触过不少做电控的朋友大家普遍的共识是有传感器的FOC是工程无传感器的FOC是艺术。原因很简单传感器给你的是确定的位置信息而观测器给你的是“猜”出来的位置这个“猜”的精度直接决定了电机能不能转、转得顺不顺、带载能力行不行。这个项目标题里提到的“全速域”三个字是整件事的核心难点。低速和高速对无感控制的要求几乎是矛盾的低速时反电动势极小基于反电动势的观测器信噪比差到没法用高速时反电动势够了但高频注入又会引入额外的损耗和噪声。所以业内常见的做法是分段处理低速用一种方法高速用另一种方法中间做切换。这个项目采用的正是这个思路低速区域用高频注入辨识转子初始位置并维持低速观测高速区域用滑模观测器SMO中间通过权重切换实现平滑过渡。这套方案的主控选型是TI的TMS320F28335或者同系列的C2000平台具体型号标题里写的是F283xC2000这是一个非常经典的电机控制DSP系列主频通常在100MHz到200MHz之间带浮点运算单元PWM和ADC资源丰富做FOC绰绰有余。IPM指的是内置式永磁同步电机也就是转子磁钢埋在转子铁芯内部的那种凸极效应明显这恰恰是高频注入法能工作的物理基础。1.2 高频注入和滑模观测器各自解决什么问题先说说高频注入。它的基本原理是利用IPM电机的凸极效应也就是d轴和q轴电感不相等这个特性。你往定子绕组里注入一个高频电压信号由于Ld不等于Lq电流响应里就会包含转子位置的信息。具体来说当注入频率远高于基波频率时电机模型可以近似成一个纯电感网络这时候电流的幅值就与转子位置角呈周期性关系。通过解调这个电流信号就能提取出转子位置。这个方法最大的好处是不依赖反电动势所以在零速和极低速下依然有效。你可以在电机还没转起来的时候就知道转子在哪这对于启动来说至关重要。传统的三段式启动强拖-切换-闭环之所以被人诟病就是因为它不管转子在哪先按一个固定方向拖起来再说遇到负载重或者转子位置不利的情况很容易启动失败甚至反转。再说滑模观测器。SMO的本质是一个状态观测器它通过构造一个滑模面让估计电流和实际电流的误差在滑模面上滑动从而反推出反电动势再从反电动势里提取转子位置。它的优点是鲁棒性强对参数变化和外部扰动不敏感中高速下精度很好。但缺点也很明显低速时反电动势太小信噪比急剧恶化而且滑模本身固有的抖振问题在低速下会被放大。所以这两者的组合逻辑就很清晰了低速靠高频注入高速靠SMO中间用权重函数做平滑过渡。这个权重切换的设计是整个方案里最考验工程经验的地方切得不好轻则转矩波动重则直接失步。1.3 整体控制框架长什么样整个系统的控制框图如果用人话来说大概是这样的电流环是核心d轴和q轴电流分别做PI调节输出Vd和Vq再经过反Park变换变成Alpha-Beta轴上的电压最后通过SVPWM模块生成六路PWM波驱动逆变器。位置和速度信息来自两个观测器的加权融合低速时高频注入的权重大高速时SMO的权重大。这里有个细节值得注意高频注入和SMO并不是简单地在某个转速点做硬切换。硬切换的问题在于两个观测器在同一时刻给出的角度估计可能有几度甚至十几度的偏差直接切换会导致电流环的参考角度突变轻则听到“咔”一声重则过流保护。所以必须用权重函数做渐变常见的做法是用转速作为自变量构造一个平滑的过渡区间比如在额定转速的5%到15%之间做线性或S形过渡。代码层面整个工程是基于TI的MotorWare或者自己搭建的框架V1.0版本说明这是第一个正式版本功能已经跑通但可能还有一些边界情况需要打磨。下面我会从核心细节、实操过程、问题排查几个维度展开把我在这个项目里踩过的坑和总结的经验都倒出来。2. 核心细节解析与实操要点2.1 高频注入的信号链设计从注入到解调高频注入法说起来简单做起来细节极多。首先你要决定注入什么信号。常见的有旋转电压注入和脉振电压注入两种。旋转注入是在Alpha-Beta平面上注入一个旋转的高频电压矢量脉振注入是在估计的d轴方向注入一个脉振信号。这个项目里我采用的是脉振高频电压注入原因是它的解调结构相对简单而且不会在q轴产生额外的转矩脉动。注入频率的选择有个经验公式一般取PWM频率的1/10到1/5。比如PWM频率是10kHz注入频率就选1kHz到2kHz。选太低会和基波耦合选太高则受开关死区和ADC采样延迟影响大。注入电压幅值通常取额定电压的10%到20%太小了解调不出来太大了会引入额外的电流谐波和损耗。解调的过程是这样的注入高频电压后采样三相电流经过Clarke变换得到Alpha-Beta轴电流再用一个带通滤波器BPF把高频分量提取出来。然后把这个高频电流与一个同频的参考信号相乘再经过低通滤波器LPF就能得到一个与转子位置误差相关的直流量。这个直流量通过一个PI调节器或者锁相环PLL结构就能跟踪出转子位置和转速。这里有个关键点带通滤波器的中心频率必须和注入频率严格一致否则解调出来的信号幅值会衰减信噪比变差。我在调试的时候用过FIR和IIR两种滤波器FIR线性相位好但阶数高、计算量大IIR计算量小但相位非线性。最后在F28335上跑选了二阶IIR带通中心频率1.5kHz带宽200Hz实测效果够用。2.2 滑模观测器的抖振抑制与角度提取SMO的核心方程不复杂但工程实现上有几个坑。最经典的是符号函数带来的抖振。滑模观测器的控制律里通常有一项是sign(误差)这个符号函数在误差过零时会产生高频抖振反映到角度估计上就是明显的波动。解决办法是用饱和函数或者Sigmoid函数代替符号函数相当于在滑模面附近设置一个边界层边界层内用线性或平滑过渡代替硬切换。另一个关键是反电动势的提取。SMO估计出来的是扩展反电动势里面包含了转子位置信息。提取角度的方法通常是用反正切函数θ atan2(-E_alpha, E_beta)或者类似的组合。但直接用atan2有个问题反电动势本身是经过低通滤波的会引入相位延迟导致估计角度滞后于实际角度。所以需要做相位补偿补偿量等于滤波器的截止频率与电机电角速度的比值。我在这个项目里用的补偿公式是Δθ arctan(ω_e / ω_c)其中ω_e是电角速度ω_c是低通滤波器的截止频率。这个补偿在高速时很小低速时比较大所以SMO在低速下精度差这也是为什么低速要交给高频注入的原因。还有一个实操细节SMO的增益选择。滑模增益太小观测器收敛慢动态响应差增益太大抖振严重甚至可能发散。我的经验是先根据电机参数算一个理论值然后在实验中从小到大调直到角度估计能快速跟踪上实际值且波动在可接受范围内。一般来说滑模增益取反电动势幅值的1.5到3倍比较合适。2.3 权重切换函数的构造与参数整定权重切换是整个方案里最需要“手感”的部分。常见的权重函数有线性权重和S形权重两种。线性权重简单但在切换区间的两端导数不连续可能导致转矩的小幅波动。S形权重比如用sigmoid或者三次多项式过渡更平滑但参数整定麻烦一些。我采用的是基于转速的线性权重但加了一个滞环区间来避免在切换点附近来回抖动。具体来说设定一个切换起始转速ω1和一个切换结束转速ω2当转速低于ω1时高频注入权重为1SMO权重为0当转速高于ω2时反过来中间线性过渡。滞环的作用是当转速在ω1附近波动时不会因为反复穿越切换点而导致权重频繁跳变。参数整定上ω1和ω2的选择要考虑两个因素一是高频注入在什么转速下开始失效二是SMO在什么转速下开始可靠。对于一般的IPM电机高频注入在额定转速的10%以下效果最好SMO在15%以上比较可靠所以ω1取5%到8%ω2取12%到15%是比较合理的。当然具体值要根据电机的凸极率和反电动势常数来调整。还有一个容易忽略的点两个观测器输出的角度需要进行统一。高频注入给出的角度和SMO给出的角度如果参考坐标系不一致加权平均就没有意义。所以在融合之前要确保两个角度都是相对于同一个静止坐标系的而且角度的周期性要处理好避免在0度和360度附近做加权时出现跳变。3. 实操过程与核心环节实现3.1 硬件平台搭建与基础配置这个项目用的主控是TI的C2000系列DSP具体是F28335或者F28379D这类带浮点单元的型号。我实际用的是F28335主频150MHzPWM模块用的是ePWMADC是12位、16通道的采样率可以做到和PWM同步。逆变器是三相全桥用的是IPM功率模块死区时间设了2微秒这个值要根据功率管的开关特性来调太大了会导致输出电压畸变太小了会直通。电流采样用的是霍尔传感器采样电阻方案在小功率下也可以用但霍尔方案在大电流下线性度更好。采样时刻很关键我是在PWM计数器的下溢点触发ADC采样这时候开关噪声最小。采样得到的电流需要做偏置校准上电时先不使能PWM采样几次取平均作为零偏后续采样值减去这个零偏。编码器虽然最终不用但调试阶段接了一个增量式编码器作为参考用来对比观测器估计的角度和实际角度的偏差。这个对比在调试初期非常有用能直观地看到观测器的收敛过程和精度。3.2 高频注入模块的代码实现高频注入的代码主要分三块注入信号生成、带通滤波、解调与PLL。注入信号我用的是正弦波频率1.5kHz幅值15%额定电压。生成方式是在定时器中断里查正弦表表长256点这样计算量小。带通滤波器用的是二阶IIR差分方程如下// 二阶带通滤波器中心频率1.5kHz采样率10kHz // 系数根据双线性变换计算得到 float bpf(float input) { static float x1 0, x2 0, y1 0, y2 0; float output b0 * input b1 * x1 b2 * x2 - a1 * y1 - a2 * y2; x2 x1; x1 input; y2 y1; y1 output; return output; }系数b0、b1、b2、a1、a2的计算我是在MATLAB里用butter函数生成然后转成定点或浮点格式。F28335有浮点单元直接用float没问题但要注意中断里的执行时间二阶IIR大概需要几十个时钟周期在10kHz中断里完全来得及。解调部分把带通滤波后的高频电流与注入参考信号相乘再经过低通滤波。低通滤波器的截止频率取100Hz左右太高了纹波大太低了响应慢。解调出来的信号经过一个PI调节器输出就是转速估计积分就是角度估计。PI参数整定上比例增益决定了跟踪速度积分增益决定了稳态精度我一般先把积分增益设为零调比例增益到角度能跟上但略有超调再加积分增益消除稳态误差。3.3 滑模观测器的离散化实现SMO在DSP里实现最关键的是离散化方法。连续域的滑模观测器方程是d(i_hat)/dt (1/L) * (V - R*i_hat - E_hat) E_hat K * sign(i_hat - i)离散化我用的是前向欧拉法采样周期等于PWM周期10kHz的话就是100微秒。离散化后的代码大概长这样// 滑模观测器离散化实现 // alpha轴 i_hat_alpha (V_alpha - R * i_hat_alpha - E_hat_alpha) * Ts / L; E_hat_alpha K_slide * sat(i_hat_alpha - i_alpha, boundary); // beta轴 i_hat_beta (V_beta - R * i_hat_beta - E_hat_beta) * Ts / L; E_hat_beta K_slide * sat(i_hat_beta - i_beta, boundary); // 角度提取 theta_smo atan2(-E_hat_alpha, E_hat_beta);这里的sat是饱和函数boundary是边界层厚度一般取额定电流的5%到10%。K_slide是滑模增益我一开始设的是反电动势幅值的2倍后来发现低速时抖振有点大降到了1.5倍高速时再适当增大。角度提取用atan2这个函数在F28335的数学库里有但执行时间较长大概需要几百个时钟周期。如果中断时间紧张可以用查表法或者CORDIC算法替代。我用的是库函数实测在10kHz中断里占用时间约5%可以接受。3.4 权重切换与角度融合的代码逻辑权重切换的代码逻辑不复杂但参数需要仔细调。核心代码如下// 权重计算 float w_hfi, w_smo; float speed_abs fabs(speed_est); if (speed_abs SPEED_LOW) { w_hfi 1.0f; w_smo 0.0f; } else if (speed_abs SPEED_HIGH) { w_hfi 0.0f; w_smo 1.0f; } else { w_hfi (SPEED_HIGH - speed_abs) / (SPEED_HIGH - SPEED_LOW); w_smo 1.0f - w_hfi; } // 角度融合注意角度周期性处理 float delta_theta theta_smo - theta_hfi; if (delta_theta PI) delta_theta - 2 * PI; if (delta_theta -PI) delta_theta 2 * PI; theta_est theta_hfi w_smo * delta_theta;这里SPEED_LOW和SPEED_HIGH就是切换区间的下限和上限我设的是额定转速的6%和14%。角度融合时先算两个角度的差值把差值归一化到[-π, π]区间再按权重叠加这样能避免角度跳变。实测下来这个融合逻辑在切换区间内角度波动小于2度转矩波动在5%以内基本感觉不到切换的过程。但前提是两个观测器在切换区间内的角度估计都要比较准如果SMO在低速下误差很大融合出来的角度也会被带偏。所以SMO的参数要在整个切换区间内都调好不能只关注高速段。4. 常见问题与排查技巧实录4.1 高频注入解调信号幅值太小怎么办这是调试高频注入时最常见的问题。注入电压加了但解调出来的信号几乎看不到PLL锁不住。原因通常有几个一是注入频率和带通滤波器的中心频率不匹配检查一下滤波器系数是不是算错了二是注入电压幅值太小适当增大到20%额定电压试试三是电机的凸极率太低Ld和Lq差别不大这种情况下高频注入法本身就不适用需要考虑其他方法。还有一个容易被忽略的点ADC采样延迟。如果采样时刻和注入信号的相位关系不对解调出来的信号会大幅衰减。解决办法是调整采样时刻或者在解调时做相位补偿。我一般会在解调参考信号里加一个可调的相位偏移调试时手动调这个偏移直到解调信号幅值最大。4.2 滑模观测器角度估计抖动严重SMO角度抖动的原因主要有三个抖振、滤波延迟、参数不匹配。抖振可以通过增大边界层厚度或者用更平滑的饱和函数来抑制但边界层太厚会降低观测器的鲁棒性需要折中。滤波延迟可以通过相位补偿来修正补偿量前面说过是arctan(ω_e/ω_c)。参数不匹配主要是电机的R和L与实际值有偏差可以在线辨识或者用鲁棒性更强的观测器结构。我遇到过一次角度抖动特别严重的情况排查了半天发现是电流采样噪声太大。示波器上看电流波形毛刺很多导致SMO的输入信号质量差。后来在ADC采样后加了一个一阶低通滤波截止频率5kHz抖动明显改善。所以如果SMO调不好先检查电流采样信号的质量往往能事半功倍。4.3 切换过程中电机失步或过流切换过程中失步根本原因通常是两个观测器在切换点的角度估计偏差太大。排查方法是在切换区间内同时记录两个观测器的角度和编码器的实际角度画出来对比。如果偏差超过10度就要先把这个偏差减小再调切换逻辑。另一个可能的原因是切换速度太快。如果权重函数过渡区间太窄相当于硬切换电流环来不及响应就会过流。解决办法是加宽过渡区间或者降低切换过程中的转速变化率。我在调试时把过渡区间从5%到10%加宽到6%到14%失步问题就解决了。还有一种情况是负载突变导致转速快速穿越切换区间这时候权重函数的变化率跟不上转速变化率也会导致失步。解决办法是在权重函数里加一个速率限制让权重变化不要太快给电流环留出响应时间。4.4 常见问题速查表问题现象可能原因排查方法解决措施高频注入解调信号幅值小滤波器频率不匹配、注入幅值小、凸极率低检查滤波器系数、增大注入电压、测量Ld/Lq调整滤波器中心频率、注入电压增至20%、更换电机SMO角度抖动大抖振、采样噪声、参数不匹配观察电流波形、对比估计与实际角度增大边界层、加采样滤波、在线辨识参数切换过程失步角度偏差大、切换太快、负载突变记录切换区间角度偏差、观察转速变化减小角度偏差、加宽过渡区间、加权重速率限制低速启动失败初始位置辨识不准、启动转矩不足检查初始位置估计误差、观察启动电流优化高频注入参数、增大启动电流限幅高速时角度滞后滤波器相位延迟、补偿不足对比估计与实际角度、计算补偿量增大相位补偿、降低滤波器截止频率5. 调试经验与参数整定心得5.1 高频注入参数的整定顺序高频注入的参数不少整定要有顺序不能眉毛胡子一把抓。我的习惯是先定注入频率再定注入幅值然后调带通滤波器最后调PLL参数。注入频率根据PWM频率来定一般取1/10到1/5。注入幅值从10%额定电压开始逐步增大到解调信号清晰为止但不要超过20%否则损耗和噪声会明显增大。带通滤波器的中心频率就是注入频率带宽取注入频率的10%到20%太窄了响应慢太宽了噪声大。PLL的比例增益决定跟踪速度积分增益决定稳态精度先调比例再调积分比例增益从小往大调直到角度能快速跟上但不过冲。5.2 SMO增益的工程整定法SMO的滑模增益K_slide理论上是越大收敛越快但抖振也越大。工程上我用的方法是先根据电机参数算一个理论值K_slide 1.5 * ω_e * ψ_f其中ψ_f是永磁磁链。然后在这个值附近上下调观察角度估计的收敛速度和稳态波动。如果收敛慢就增大如果波动大就减小。边界层厚度boundary的整定我一般取额定电流的5%到10%。太小了抖振抑制不够太大了观测器退化成线性观测器鲁棒性下降。调试时可以观察电流估计误差的波形如果误差在边界层内平滑变化说明厚度合适如果误差频繁穿越边界层说明厚度太小。5.3 权重切换区间的确定方法切换区间的确定不能拍脑袋要有数据支撑。我的方法是在电机空载和满载两种情况下分别测试高频注入和SMO在全转速范围内的角度估计误差。然后找到高频注入误差开始明显增大的转速点作为切换区间的下限找到SMO误差降到可接受范围的转速点作为切换区间的上限。具体操作上可以用编码器作为参考记录不同转速下两个观测器的角度误差曲线。一般来说高频注入在10%额定转速以下误差小于5度SMO在15%额定转速以上误差小于3度所以切换区间取6%到14%是比较稳妥的。如果电机凸极率特别高高频注入的有效范围可以更宽如果凸极率低切换区间要相应上移。5.4 几个容易踩的坑第一个坑是忽略了死区补偿。无感控制对电压的准确性要求很高死区会导致输出电压畸变进而影响观测器精度。我在调试初期没做死区补偿SMO的角度误差在低速时能达到十几度加了补偿之后降到5度以内。死区补偿的方法是根据电流方向给电压指令加一个修正量修正量等于死区时间乘以母线电压除以PWM周期。第二个坑是电流环带宽不够。无感控制里观测器的输出是给电流环用的如果电流环带宽太低观测器的估计角度变化时电流跟不上就会导致转矩波动甚至失步。一般来说电流环带宽至少要1kHz以上我一般调到1.5kHz到2kHz。提高带宽的方法是增大PI比例增益但要注意不能引起振荡。第三个坑是启动时的初始位置辨识。高频注入虽然能在零速下辨识转子位置但辨识需要时间通常几十毫秒到几百毫秒。如果在这段时间内就施加转矩可能会因为位置不准而导致启动失败。我的做法是启动时先注入高频信号等PLL锁定后再使能转矩锁定判断依据是角度估计的波动小于某个阈值。第四个坑是温度对电机参数的影响。电机运行一段时间后绕组电阻会随温度升高而增大永磁体磁链会随温度升高而减小这些都会影响观测器精度。如果应用场景对精度要求高需要做在线参数辨识或者温度补偿。我在这个项目里没有做在线辨识但在软件里留了参数接口可以根据温度传感器读数做简单补偿。6. 方案扩展与后续优化方向6.1 从V1.0到V2.0可以做什么V1.0版本已经实现了全速域无感控制的基本功能但还有不少可以优化的地方。第一个方向是参数在线辨识把电机的R和L做成在线辨识这样观测器对参数变化的鲁棒性会更强也能适应不同批次的电机。第二个方向是无位置传感器的低速大转矩启动目前高频注入在低速下的带载能力还有限可以结合I/f启动或者低频注入来增强。第三个方向是效率优化高频注入会带来额外的损耗可以在高速段完全关闭注入进一步降低损耗。6.2 代码架构的优化空间目前的代码架构是中断里做所有事情包括采样、观测器、电流环、PWM更新。在10kHz中断下F28335的CPU占用率大概在60%到70%还有余量但不算宽裕。如果要把中断频率提高到20kHz就需要优化代码。优化的方向包括把不紧急的任务移到后台循环、用查表代替实时计算、用定点运算代替浮点运算如果精度允许、把atan2换成CORDIC算法。另外观测器的代码可以模块化把高频注入和SMO封装成独立的模块通过接口函数调用。这样切换不同的观测器方案时不需要改动主控制逻辑只需要替换模块实现。我在V1.0里没有做这个模块化后续版本会考虑重构。6.3 不同电机类型的适配考虑这个方案目前是针对IPM电机设计的因为高频注入依赖凸极效应。如果换成表贴式永磁电机SPMLd和Lq基本相等高频注入法就失效了。对于SPM电机低速无感控制通常需要借助其他方法比如INFORM法或者基于磁饱和的凸极效应。所以如果要做通用方案需要根据电机类型自动选择观测器策略。另外不同功率等级的电机参数差异很大观测器参数需要重新整定。我在这个项目里用的是一台1.5kW的IPM电机如果换成10kW或者100W的电机滑模增益、注入幅值、滤波器参数都要重新调。所以方案的可移植性还需要加强最好能根据电机铭牌参数自动计算观测器参数。6.4 实际应用中的性能边界这套方案在实际应用中有几个性能边界需要心里有数。低速方面高频注入在零速下能辨识位置但带载能力有限通常只能带到额定转矩的30%到50%再大就容易失步。高速方面SMO在额定转速以上也能工作但弱磁区域需要额外的处理因为反电动势饱和会导致观测器模型不准确。动态方面转速变化率太快时观测器的跟踪可能滞后需要限制加速度或者增强观测器的动态响应。我在实际测试中这套方案在额定转速的0%到120%范围内都能稳定运行切换过程平滑转矩波动在可接受范围内。但这些都是基于实验室环境实际工况下的电磁干扰、温度变化、负载特性都会影响性能需要在实际应用中进一步验证和调优。最后分享一个小技巧调试无感控制时一定要把编码器信号接上作为参考哪怕最终产品不用。有了参考信号你才能知道观测器估计得准不准问题出在哪里。我见过不少人一上来就盲调调了半天不知道对错效率极低。有了参考所有问题都变得可量化、可追踪调试效率至少提高一倍。