首页 / 资讯中心 / 文章详情

无感FOC控制核心:滑模观测器、SVPWM与V/f启动全解析

无感FOC控制核心:滑模观测器、SVPWM与V/f启动全解析 ★ FEATURED ARTICLE
手头这套STM32和DSP无感FOC电机控制代码让我把几件在电机控制里经常被混在一起讲的事情一次性理清楚标题里的“滑膜观测器”其实是“滑模观测器”Sliding Mode Observer的笔误下面统一叫SMO。整套方案的核心链路是无传感器磁场定向控制用SMO估算反电动势得到转子位置和速度电压调制走SVPWM启动阶段先不闭环用V/f开环把转速拉起来等反电动势足够强了再交给SMO闭环最终覆盖从零速到额定转速的全速度范围运行。这套代码结构很适合正在做无感FOC项目的工程师或者想搞懂“启动为什么用Vf跑起来为什么用SMO”的入门朋友。1. 这套控制架构谁在什么阶段干活1.1 无感FOC的基本反馈链路FOC没有霍尔或编码器时第一件事是把电流环和速度环分别处理好。硬件上需要采样两相电流一般采ia和ib第三相由ic-(iaib)算出。电流首先经过Clarke变换把三相电流投影到αβ静止坐标系再经过Park变换变换到dq旋转坐标系。dq坐标系下的id、iq才是FOC真正控制的量id控制励磁iq控制转矩通常PMSM做id0控制。PWM输出的流程正好反过来速度环PI算出iq_ref电流环PI算出Vd_ref和Vq_ref经过反Park变换得到Vα、Vβ指令。SVPWM拿到这两个电压指令后在一个PWM周期内根据扇区分配相邻电压矢量的作用时间最终生成六路带死区的PWM波形。问题在于反Park变换需要转子电角度θ。没有传感器时这个角度只能靠观测器来估。SMO就是这套代码里的“传感器替代者”。1.2 SMO、SVPWM、V/f各自负责什么SMO负责中高速段的转子位置估算它观测定子电流利用滑模面把估计电流拽到真实电流上等效控制量里就包含了反电动势信息从反电动势的αβ分量里算出电角度。SVPWM负责把电压指令变成实际的三相桥臂开关信号。它比单纯正弦PWM的直流母线利用率高母线电压利用率大概能提升15%而且谐波小输出波形更接近理想圆形磁链。V/f负责启动阶段。无感FOC开环启动的通常做法是在没有真实转子位置反馈的情况下直接按一个斜坡升高频率和电压让磁场带着转子转起来。等转速到了SMO能稳定工作的区间再切到闭环。一句话总结V/f管低速SMO管中高速SVPWM管电压输出三者缺一个全速度范围无感运行就很难做得完整。1.3 为什么不能只用其中一个只靠V/f也能让电机转但它本质上是开环的负载突变时容易失步动态性能差没有办法做精确的转矩控制。只靠SMO又不行因为零速和极低速下反电动势几乎为零信噪比太低观测器根本估不出有效位置强行闭环只会导致电机抖动甚至反转。所以实用工程几乎都是这个组合低速用V/f开环拖起来中高速切SMO闭环。就好像汽车起步用一档上了速度再换高档硬要一档拉到底和一开始就上高档都不现实。2. 把SMO拆开看反电动势模型、离散化实现和角度误差2.1 反电动势模型里哪里藏着角度PMSM在αβ静止坐标系下的定子电压方程可以写成uα Rs·iα Ls·diα/dt eαuβ Rs·iβ Ls·diβ/dt eβ这里eα、eβ就是反电动势在αβ轴上的分量。永磁同步电机的反电动势和转子位置直接相关eα -ω·ψf·sinθeβ ω·ψf·cosθ从这两个式子可以反推θ atan2(-eα, eβ)这个公式是SMO输出角度的根基。磁链、转速、角度三个信息全混在eα、eβ里而SMO的工作就是尽量准确地把eα、eβ提取出来。2.2 一个可以直接抄的SMO步进函数SMO的估计思路是构造一个电流估计模型如果估计电流和真实电流不一致就用一个很大的切换项把它们拉回来。切换项在滑模面上的等效平均值恰好就是反电动势。离散化常用一阶欧拉法PWM中断里每个周期执行一次。代码骨架大概是这样的// 电机参数 // Rs: 定子电阻Ls: 定子电感Ts: 中断周期 // Ksm: 滑模增益delta: 饱和函数边界层宽度 static inline float sat(float s, float delta) { if (s delta) return 1.0f; if (s -delta) return -1.0f; return s / delta; } void smo_step(motor_t *m, float ualpha, float ubeta, float ialpha, float ibeta) { // 电流估计误差 float salpha m-ialpha_hat - ialpha; float sbeta m-ibeta_hat - ibeta; // 滑模切换项 float zalpha m-Ksm * sat(salpha, m-delta); float zbeta m-Ksm * sat(sbeta, m-delta); // 电流估计器欧拉离散 m-ialpha_hat m-Ts * (ualpha - m-Rs * m-ialpha_hat - zalpha) / m-Ls; m-ibeta_hat m-Ts * (ubeta - m-Rs * m-ibeta_hat - zbeta) / m-Ls; // 对切换项做低通提取等效控制也就是反电动势 m-ealpha_hat lpf_apply(m-ealpha_hat, zalpha, m-lp_wc, m-Ts); m-ebeta_hat lpf_apply(m-ebeta_hat, zbeta, m-lp_wc, m-Ts); // 计算电角度 m-theta_elec atan2f(-m-ealpha_hat, m-ebeta_hat); m-theta_elec m-angle_comp; }从公式上看切换项的量纲是电压它每一步都在把估计电流强行拽回真实电流。Ksm越大拽回越快但PWM斩波噪声也会被带进反电动势估计里如果Ksm太小滑模面建立不起来估计电流跟随不上真实电流整个观测器就失效了。所以工程上几乎不用纯符号函数而是用带线性区的饱和函数。delta就是边界层宽度把抖振变成可控的边界层运动实际表现是角度和电流抖动明显减小。2.3 低通滤波、角度补偿和速度提取反电动势跟踪信号里有大量高频开关纹波低通滤波是必须的。但低通会带来相位延迟截止频率越低反电动势估计越平滑相位延迟越大。延迟会导致估算角度落后真实角度。相位延迟大约等于atan(ω_e / ω_c)其中ω_e是电角速度ω_c是滤波截止角频率。所以代码里那个angle_comp不是一个固定常数最好随转速变化做近似补偿或者直接让截止频率跟随转速走。实际调试时我的习惯是让滤波器截止频率在额定频率的5到10倍之间再根据负载情况微调补偿量。速度提取有两种思路。第一种是直接对角度差分再除以中断周期简单但角度噪声会被放大第二种是锁相环方式把角度误差送到PI里让锁相环输出跟踪转速。我用锁相环多一些角度跳变和噪声都更可控只是PI参数多一组。2.4 SMO在这套代码里的边界条件SMO本质上依赖反电动势所以在额定转速5%到10%以下反电动势太小很难稳定使用。这个边界条件决定了启动切换点要放在哪里也决定了V/f阶段的结束点。3. V/f启动与无感闭环切换全速度运行最关键的一步3.1 带预定位的V/f启动流程V/f启动不是从零直接给个电压那么简单。对于永磁同步电机第一步通常是转子预定位在任意一个固定方向施加一个小的直流矢量让转子磁铁自己转过去记录下初始角度。这个角度一旦锁错后面整段V/f开环都可能从错误起点开始跑。预定位之后按设定的加速度继续升频电压按V/f曲线同步给定。需要注意定子电阻压降在低速时占的比例很大纯直线V/f容易造成低速电流偏大所以工程上通常会在零频附近叠加一小段boost电压再进入正常的线性比例段否则低速相电流容易顶到限幅值。V/f开环阶段控制角度来自角度积分器不来自观测器。此时freq_ramp按照目标转速斜坡增加theta_ramp不断积分SVPWM持续输出旋转电压矢量。电流反馈虽然仍在采样但不作为角度修正依据。3.2 从V/f切换SMO闭环的判据切换过早SMO角度还没有收敛稳定切进去就会抖切换太晚V/f一直开环跑负载一变就失步。我常用的切换判据有四个SMO估算的电角速度已经连续在斜坡指令速度的90%到110%区间内稳定了一段时间反电动势估计幅值超过预设阈值观测器角度和V/f角度差小于一个不大的角度窗口电流在预设范围内没有过流和剧烈波动。条件都满足后才允许切换。代码里我还会加一个切换定时器条件满足后延迟几个中断周期再动作避免瞬时毛刺触发误切换。3.3 切换瞬间的角度对齐技巧很多项目切不好不是SMO问题而是V/f角度和SMO角度没对齐。切换前后用的是两套角度来源如果这两个角度相差很大直接阶跃过去会让电流环参考值突变轻则电流尖峰重则过流保护。我的做法是在准备切换阶段先让V/f斜坡角度去追踪SMO估算角度通过一个比例积分把theta_ramp缓慢修正到和theta_smo一致。这样真正切换时两个角度已经基本重合切换冲击很小。实际做下来最理想的情况切换瞬间电流波形几乎没有凸起。这套角度预对齐逻辑比直接做“切换开关”要复杂一点但它能解决大部分现场调试中最难受的切换抖动问题。3.4 切换后的限幅与保护切入闭环后不代表万事大吉。刚切换时速度环输出很大iq指令可能瞬间顶到限幅。所以我会在切换后的几百毫秒内把速度环PI输出限制在一个较小窗口再逐渐放开到正常限幅。这样即使SMO和V/f之间还有微小的角度偏差也不会因为转矩突变吵到机器。4. SVPWM生成细节以及代码从STM32移植到DSP要注意的东西4.1 为什么非用SVPWM不可正弦PWM的相电压峰值最高只能到母线电压的一半而SVPWM通过零矢量分配可以做到相电压峰值在母线电压的根号三分之一范围内也就是线性调制区最高输出比正弦PWM大了约15%。无感FOC本来母线电压利用率就紧张SVPWM几乎是必选项。4.2 一个可靠的SVPWM实现思路SVPWM的稠密计算可以拆成三步先判断电压矢量在六个扇区中的哪一个再计算相邻两个有效矢量各自的作用时间最后把时间映射到定时器的比较寄存器生成中心对齐PWM。以0到60度扇区为例电压指令在αβ旋转系里用U0和U60两个相邻矢量合成Vα·T T1·1 T2·0.5Vβ·T T2·(√3/2)解出来就是T2 2·Vβ·T / √3T1 (Vα - Vβ/√3)·T其余五个扇区都是同样的伏秒平衡推导只是换成相邻的一组有效矢量。最后补零矢量填满整个PWM周期得到常见的七段式输出。七段式在低速和高速下波形对称性都不错中性点电压波动小是工程上默认做法。4.3 从STM32到DSP的移植点这套代码的控制核心部分比如Clarke、Park、PI、SMO、SVPWM在C语言层面基本是纯计算只要保证浮点精度和周期定时一致逻辑可以直接平移到DSP。真正容易踩坑的是硬件抽象层。STM32的定时器通常用中央对齐计数模式比较寄存器更新需要配置好预装载DSP平台则要处理不同的PWM外设、ADC触发、捕获单元和中断向量映射。我把代码分成两层底层是硬件驱动上层是电机算法。电机算法只用参数结构体和函数接口不直接碰寄存器。移植时只替换底层算法层能保持稳定。另一个大坑是定点DSP。如果平台没有硬件浮点所有PI、SMO、SVPWM都要考量Q格式缩放。我的经验是先把整个算法写成浮点在STM32上调稳再做定点化。定点化时尤其注意电流和电压的量纲缩放别在中间运算里溢出或损失太多分辨率。移植关注点STM32侧常见做法DSP侧常见做法PWM周期定时器中央对齐中断事件管理器/PWM定时器同步ADC触发定时器上溢/下溢中点触发PWM载波同步触发ADC浮点支持Cortex-M4/M7硬件FPU可选用浮点单元或定点Q格式中断优先级嵌套向量中断控制器配置DSP中断使能与优先级表除法操作较慢尽量用倒数乘法优化避免重复调用标准库除法4.4 电流采样和死区设置的工程细节三电阻采样时ADC触发点必须对准PWM下桥导通的中点否则采样到的不是相电流平均值。单电阻采样方案则必须避开死区和开关切换瞬间两个桥臂不能同时采容易出现重构盲区低速大电流时尤其明显。死区时间设置要结合功率管开关特性。死区太小上下桥直通太大造成电压损失和电流畸变。高速段死区带来的电压误差会影响SMO的角度估算精度必要时做死区补偿。我一般先按功率模块手册推荐值设置再结合相电流波形在过零点附近的畸变程度微调。5. 从零到全速落地的调参步骤与踩坑记录5.1 先把电机参数辨识准确SMO最吃准确性的是Rs和Ls。Rs不准低速段角度误差大Ls不准中高速段反电动势幅值和相位都会偏。我的做法是先用可调直流稳压电源给绕组通小电流测量压降算Rs再用信号发生器加电桥测相电感得到Ls。如果是表贴电机Ls取平均值就够内嵌式电机还要考虑dq轴电感差异普通恒转矩应用如果差异不大也可以用平均电感做SMO模型。这些参数测量过程可能烦琐但跳过的后果是调试时到处找问题根本找不出毛病。5.2 推荐的分步调参顺序建议按顺序调不要跳步先调V/f启动不使能SMO闭环。把斜坡加速度、boost电压、电压限幅调顺电机能平稳加速到预定切换转速。再使能SMO但不切换。先观察观测器的电角度和数据是否稳定平滑调Ksm和滤波器截止频率。确认观测器在全速度范围稳定后再做V/f到SMO的切换。切换稳定后再带载逐步提高负载和动态加减速。调试项常用初始值判断标准V/f加速度5%额定转速每秒启动不抖、电流不过冲boost电压额定相电压的3%到5%零速电流可控滑模增益Ksm额定反电动势峰值的2倍以上反电动势幅值连续、波动小饱和边界delta额定电流的1%到2%电流抖动不明显放大量冲击低通截止频率fc5到10倍电频率角度平滑且无严重相位延迟切换速度点5%到10%额定转速切换瞬间电流尖峰小5.3 实际调试里最值得记录的三个坑第一个坑是切换后速度反向抖。排查下来通常是V/f角度和SMO角度没有预对齐或者切换点设置得太低SMO还在边界上。解决办法就是前面对齐逻辑加切换条件收紧。第二个坑是轻载低压下失步。V/f加速率设置得太快或者boost电压设置不够导致低速转矩不够。解决办法是降低加速度、提高低速boost电压必要时加入q轴电流的软限幅。第三个坑是相电流噪声太大导致SMO角度毛刺。这个问题往往是电流采样窗口没对准或死区时间设置偏大。先把硬件采样点调准再考虑滤波器不要一开始就疯狂加大滤波系数把相频特性搞坏。5.4 调试工具与观察技巧不要只依赖串口打印波形数据刷新慢容易掩盖问题。我习惯用上位机虚拟示波器同时观察电角度、估算速度、相电流和切换标志位。这样切换瞬间发生了什么能看得很清楚。观测器内部变量也要足够暴露真实电流、估计电流、切换项、反电动势估计值都要做成可观测变量。光看输出角度正常还不够中间变量异常才是排查关键。调SMO时我会先看电流估计误差是否收敛到小范围再看反电动势波形是否光滑连续。最后再分享一个经验别急着上高速。很多项目失败都是因为低速还没稳定就冲大转速。先把V/f到SMO的切换在10%额定转速下调到完美再逐步往上探往上的过程就会顺畅得多。这套代码整理完之后我又跑了一遍全流程从预定位、V/f加速、角度对齐、切换闭环到额定速度波形干净了系统才算真正落地。
阅读完成 · 觉得有帮助?
咨询建站