资讯动态

AN1078 无传感器 FOC 实战:从 Clarke 变换到滑动模式观测器的参数整定

发布时间:2026/10/15 8:06:27 来源:尧图企业网站定制
简介AN1078是Microchip微芯科技发布的一份电机控制应用笔记面向家电电机控制工程师、嵌入式开发者及高校相关专业学习者聚焦永磁同步电机PMSM的无传感器磁场定向控制FOC实现方案。文档从家电节能与静音需求出发对比传统六步控制阐述FOC在平滑转矩、适应动态负载方面的优势并说明如何借助dsPIC DSC系列如dsPIC30F6010A的PWM、高速ADC、QEI等外设完成算法落地涵盖位置与速度估算、电流检测及DMCI调试界面等内容。资源包为1个PDF文件大小约1.03MB便于下载后离线查阅与打印。目前已有1079人学习下载适合希望深入理解无传感器FOC原理、评估dsPIC平台电机控制方案或进行空调压缩机等家电项目选型的读者参考。1. 从一份 2007 年的应用笔记说起AN1078 到底解决了什么问题如果你手头有一块 dsPIC30F 或 dsPIC33F 的电机控制板想跑永磁同步电机的无传感器 FOC却卡在“角度怎么估、电流怎么采、PI 怎么调”这三座大山前那 AN1078 这份文档大概率是你绕不开的起点。它不是什么新东西2007 年发布的编号 DS01078A_CN作者 Jorge Zambada全篇围绕一个目标用 dsPIC DSC 的片内 PWM 和高速 ADC在没有任何位置传感器的前提下把一台 1.5 kW 空调压缩机从 500 RPM 拉到 7300 RPM。听起来像老古董但里面那套滑动模式控制器加反电动势估算的框架至今仍是很多低成本家电方案的核心骨架。适合谁看做白色家电电控的、搞风机水泵无感驱动的、以及被霍尔传感器线束和浸水问题折磨过的硬件工程师。它不教你 FOC 是什么它直接告诉你在这颗芯片上怎么把 FOC 跑起来。2. 拆解 AN1078 的算法骨架从 Clarke 到 SVPWM 的完整链路2.1 为什么非得用 FOC六步控制差在哪传统 BLDC 的六步换相本质上是给两相通电、第三相悬空每 60 度电角度换一次。转矩脉动大噪音刺耳负载一变就抖。AN1078 里举了个很实在的例子前开式洗衣机衣服堆在滚筒顶部时电机得克服重力做功负载惯量随时在变。六步控制那种“通一下等转子转过去再换”的逻辑动态响应根本跟不上。FOC 的思路完全不同它把定子电流分解成两个直流量Id 管磁通Iq 管转矩。控制直流量就像控制直流电机一样简单。稳态下 Id 和 Iq 是常量PI 调节器不用追着正弦波跑响应快、超调小。代价是计算量大但 dsPIC 有 MAC 指令和硬件饱和一个周期内能完成乘加这才让 FOC 在低成本 DSC 上落地。2.2 坐标变换的工程实现Clarke 和 Park 到底怎么算AN1078 把变换拆得很细。第一步 Clarke三相变两相。因为 ia ib ic 0所以只测两相电流就够了第三个用减法算出来。公式是 iα iaiβ (ia 2ib)/√3。注意这个系数不是随便写的它保证了变换前后幅值不变。第二步 Park把静止的 α-β 转到随转子旋转的 d-q。公式是 Id iα cosθ iβ sinθIq -iα sinθ iβ cosθ。θ 是估算出来的转子角度不是测的。这里有个坑θ 的精度直接决定 Id 和 Iq 能不能解耦。如果 θ 偏了Id 里会混进 Iq 的分量转矩控制就废了。AN1078 用滑动模式控制器来估 θ后面细说。// Clarke 变换输入 ia, ib输出 iAlpha, iBeta // 注意ic 由 ia ib ic 0 推出不单独测量 iAlpha ia; iBeta (ia 2 * ib) * ONE_BY_SQRT3; // ONE_BY_SQRT3 0.577350269 // Park 变换输入 iAlpha, iBeta, sinTheta, cosTheta输出 iD, iQ // sinTheta 和 cosTheta 来自位置估算器不是查表 iD iAlpha * cosTheta iBeta * sinTheta; iQ -iAlpha * sinTheta iBeta * cosTheta;这段代码里 ONE_BY_SQRT3 是个常量别用浮点算dsPIC 上直接写 Q15 格式的定点数。sinTheta 和 cosTheta 由 CORDIC 算法迭代产生AN1078 没展开 CORDIC 细节但源码里 CalcRef.s 和 SVGen.s 有完整实现。我一般会先把 sin/cos 表打出来验证 CORDIC 输出对不对再往下调 PI。2.3 PI 调节器的抗积分饱和Kc 系数怎么设AN1078 用了三个 PI 环速度外环、Id 内环、Iq 内环。速度环输出是 Iq 的参考值Id 参考值通常设 0表贴式 PMSM 不需要弱磁。每个 PI 都带一个 Kc * Excess 项来抑制积分饱和。Excess 是未限幅输出 U 和限幅后输出 Out 的差。当 U 超过 Outmax 时Excess 为正Kc 乘上去从积分累加项 Sum 里减掉防止积分项越积越大。Kc 一般取和 Ki 相同就行。调 PI 的顺序先把 I 和 D 设 0只加 P加到系统能响应设定点变化但不振荡然后慢慢加 I消静差。I 给大了会抵消 P 的作用系统在设定点附近来回晃。这时候别急着降 I先试试把 P 加大往往能压住。// PI 控制器核心逻辑带抗积分饱和 // Kp, Ki, Kc 均为 Q15 格式定点数 Err InRef - FB; U Sum Kp * Err; if (U Outmax) { Out Outmax; } else if (U Outmin) { Out Outmin; } else { Out U; } Excess U - Out; Sum Sum Ki * Err - Kc * Excess; // Kc 通常等于 Ki注意 Sum 是累加项每个控制周期执行一次。控制周期 50 µs对应 20 kHz 的 PWM 频率。AN1078 里 CPU 开销约 21 MIPS占 dsPIC30F6010A 总资源的 2/3。如果你换到 dsPIC33F主频更高余量会大一些。2.4 空间矢量调制为什么用 SVM 而不是正弦 PWMSVM 的直流母线利用率比正弦 PWM 高约 15%。AN1078 把 Clarke 逆变换直接嵌进 SVM 程序里省掉一步计算。三相逆变器有 8 种开关状态6 个有效矢量把平面分成 6 个扇区每个扇区 60 度。期望电压矢量 UOUT 由相邻两个有效矢量和零矢量合成。T1 是第一个矢量的作用时间T2 是第二个T0 是零矢量时间。T1/T 和 T2/T 就是占空比。dsPIC 配置成中心对齐 PWM每个周期产生两个线间脉冲有效开关频率翻倍纹波电流减小开关损耗没增加。表 1 里那 8 种状态对应的线电压调试时可以用示波器逐项核对。状态A 相B 相C 相VabVbcVcaU000000000U0010010-VDCVDCU010010-VDCVDC0U011011-VDC0VDCU100100VDC0-VDCU101101VDC-VDC0U1101100VDC-VDCU111111000这张表建议打印出来贴在工位上。调 SVM 时先让电机开环转用示波器看三相下桥臂的驱动波形确认扇区切换时没有异常窄脉冲。如果有检查 T1 T2 是否超过 PWM 周期 T超了就限幅。3. 无传感器位置估算滑动模式控制器与反电动势观测器3.1 电流观测器的闭环校正逻辑AN1078 的位置估算核心是一个电流观测器。它用软件搭了一个电机模型输入同样的电压 vs输出估算电流 is*。但软件模型和真实硬件总有偏差所以引入滑动模式控制器来校正。SMC 计算测量电流 is 和估算电流 is* 的差的符号乘以增益 K得到校正因子 Z。Z 加到软件模型的电压项上每个控制周期都调一次直到 is 和 is* 的差趋近于零。这时候软件模型的反电动势 es* 就近似等于真实电机的反电动势 es。整个逻辑是电流差 → 符号函数 → 增益 K → 校正电压 → 修正模型 → 反电动势收敛。// 滑动模式控制器核心 // isMeas 和 isEst 是 Q15 格式的电流矢量 // K 是 SMC 增益需要根据电机参数调 if ((isMeas - isEst) 0) { Z K; } else { Z -K; } // Z 加到电压项更新估算电流 // isEst(n1) F * isEst(n) G * (vs(n) - esEst(n) - Z)K 给大了系统抖振厉害电流噪音大给小了收敛慢动态响应差。我一般从电机额定电流的 10% 开始试用示波器看估算电流和实测电流的跟踪情况慢慢加 K 直到跟踪变好但还没出现明显高频抖动。3.2 F 和 G 参数的计算万用表量出来之后怎么代F 和 G 是数字化电机模型的两个系数。F 1 - Ts * R / LG Ts / L。R 和 L 是相电阻和相电感。注意万用表量的是线间电阻和线间电感代入公式前要除以 2。AN1078 里举了个例子线间电阻 5.0 Ω线间电感 10 mH控制频率 8 kHz。那么相电阻 R 2.5 Ω相电感 L 5 mH。Ts 1/8000 125 µs。F 1 - 125e-6 * 2.5 / 5e-3 1 - 0.0625 0.9375。G 125e-6 / 5e-3 0.025。这两个值直接写进代码用 Q15 格式。如果电机参数变了F 和 G 必须重算否则观测器收敛不了。// 根据电机参数计算 F 和 G // R_phase 和 L_phase 是相电阻和相电感单位欧姆和亨利 // Ts 是控制周期单位秒 float F 1.0 - Ts * R_phase / L_phase; float G Ts / L_phase; // 转成 Q15 定点数 int16_t F_Q15 (int16_t)(F * 32768.0); int16_t G_Q15 (int16_t)(G * 32768.0);这里有个血泪经验L 的测量精度对 G 影响很大。万用表测电感本身就不准最好用 LCR 表或者在电机静止时注入高频小信号测阻抗来反推。G 偏了估算电流的幅值就不对反电动势也跟着偏最后 θ 就歪了。3.3 反电动势滤波与 theta 计算CORDIC 为什么比查表快SMC 输出的 Z 经过一阶低通滤波得到 e*。滤波器公式e(n) e(n-1) (2πfc / fpwm) * (z(n) - e(n-1))。fc 是截止频率fpwm 是 PWM 频率。AN1078 用 8 kHz 的 fpwmfc 根据 SMC 增益调。滤波后的 eα 和 eβ 用来算 θ。θ arctan(eα, eβ)。直接调 arctan 函数在 DSC 上很慢AN1078 用 CORDIC 迭代算法。CORDIC 通过一系列固定角度的旋转逼近目标角度只用移位和加法不用乘法速度比查表还快内存占用也小。源码里 CalcRef.s 有完整的 CORDIC 实现迭代次数一般取 12 到 16 次精度够用。// 一阶数字低通滤波器用于反电动势滤波 // e_prev 是上一周期的估算反电动势 // z 是 SMC 输出 // fc 是截止频率fpwm 是 PWM 频率 float alpha 2.0 * 3.1415926 * fc / fpwm; float e_new e_prev alpha * (z - e_prev); // e_new 用于计算 theta滤波器的 alpha 不能太大大了滤波效果差反电动势里混着开关噪音小了相位滞后严重θ 补偿量得加大。AN1078 把相位补偿分成 8 个速度段每个段有独立的斜率和常量。表 2 给了具体公式比如速度在 0.09375 到 0.1875 之间时θoffset 4 * ωfiltered 0.375。这个表是调出来的不是算出来的换电机必须重新标定。3.4 速度计算与相位补偿为什么 theta 需要补偿速度是通过累加 m 次 theta 的差值再乘 Kspeed 得到的。公式ω Σ(θ(n) - θ(n-1)) * Kspeed。累加 m 次是为了平滑m 一般取 8 到 16。算出来的 ω 再经过一阶滤波得到 ωfiltered。因为反电动势滤波引入了相位滞后所以最终给 PWM 用的 θ 必须加上补偿量 θoffset。补偿量随速度变化低速时滞后小高速时滞后大。AN1078 用分段线性拟合8 个速度段覆盖 500 到 7300 RPM。如果补偿不准电机会发热、效率低严重时失步。调试时用示波器看相电流和相电压的相位差目标是在整个速度范围内保持接近零。// 速度计算累加 m 次 theta 差值 int32_t sumDeltaTheta 0; for (int i 0; i m; i) { sumDeltaTheta (theta[n] - theta[n-1]); } omega sumDeltaTheta * Kspeed; // 一阶滤波 omegaFiltered omegaFiltered alphaSpeed * (omega - omegaFiltered); // 相位补偿根据 omegaFiltered 查表或分段计算 thetaOffset getThetaOffset(omegaFiltered); thetaComp theta thetaOffset;Kspeed 的计算涉及极对数、PWM 周期和 Q15 格式转换。AN1078 附带一个电子表格输入 RPM 和补偿角度自动算出斜率和常量。我一般会先用这个表格生成初始值再在台架上微调。4. 电机起动与低速阶段的避坑指南4.1 开环强拖为什么不能一上来就闭环无传感器 FOC 依赖反电动势估算电机静止或极低速时反电动势为零或极小观测器根本估不出 θ。所以 AN1078 用开环起动按下启动按钮DSC 产生连续正弦电压按固定加速度把电机拖起来。θ 由开环累加产生不依赖观测器。电流环仍然工作控制 Id 和 Iq。等速度到了能估算反电动势的下限再切闭环。这个切换点很关键切早了观测器没收敛切晚了电机可能失步。AN1078 的起动程序里相角度按平方率递增保证恒定加速度。切换条件一般是估算速度和开环速度的差小于某个阈值并且持续若干个周期。// 开环起动theta 按平方率递增 // accel 是加速度常数根据电机惯量和负载调 thetaOpenLoop accel * t * t; // 限制 theta 在 0 到 2π 之间 if (thetaOpenLoop TWO_PI) { thetaOpenLoop - TWO_PI; } // 切换条件估算速度接近开环速度 if (abs(omegaEst - omegaOpenLoop) SWITCH_THRESHOLD) { switchCounter; if (switchCounter SWITCH_DELAY) { closedLoop 1; } } else { switchCounter 0; }accel 给大了电机起步猛电流冲击大给小了起动太慢洗衣机这种应用用户等不及。我一般从额定转矩的 50% 开始试看起动电流波形慢慢加。4.2 常见问题排查从现象到根因现象一电机起动时抖动转不起来。原因通常是开环加速度和负载不匹配或者切换点太早。解决降低 accel把切换阈值放宽延迟切换周期数加大。用示波器看 q 轴电流如果切换瞬间 Iq 有尖峰说明观测器还没收敛。现象二低速时电流噪音大电机发热。原因可能是 SMC 增益 K 太大或者反电动势滤波器截止频率太高。解决降 K降 fc。但降 K 会减慢收敛降 fc 会加大相位滞后需要重新标定 θoffset。这是个折中没有免费午餐。现象三高速时失步电流失控。原因通常是相位补偿不够θ 滞后太多导致 Id 和 Iq 解耦失败。解决检查表 2 的补偿公式在高速段加大 θoffset。另外确认 PWM 死区时间是否合适死区太大会导致电压失真反电动势估算也跟着偏。现象四估算速度波动大PI 输出不稳。原因可能是速度计算累加次数 m 太小或者 Kspeed 没算对。解决加大 m重新核对 Kspeed 的 Q15 转换。AN1078 的电子表格里可以验证。现象五ADC 采样噪音大电流波形毛刺多。原因通常是采样时刻没对齐 PWM 中心。dsPIC 的 ADC 由 PWM 触发触发点应该在 PWM 周期的中心这时候开关噪音最小。检查 PWM 配置寄存器确认触发沿和采样窗口。另外采样电阻的布局和滤波电容也很关键这是硬件的事但软件调不出来的时候先查硬件。提示AN1078 的源码里 UserParms.h 集中了所有可调参数包括 PI 增益、SMC 增益、F 和 G、相位补偿表。改参数前先备份每次只改一个改完记录现象。电机控制调试没有捷径就是耐心加示波器。5. 从 AN1078 到实际产品参数整定与验证的几条硬规矩AN1078 的代码框架是通用的但参数没有一组是通用的。我见过太多人直接把源码烧进去电机要么不转要么转起来像得了帕金森。这里说几条我踩过坑之后养成的习惯。第一F 和 G 必须用实际电机的相电阻和相电感重算万用表量线间值除以 2但最好用 LCR 表在 1 kHz 下测因为 FOC 的电流频率就在这个范围。第二SMC 增益 K 从额定电流的 5% 开始每次加 1%用示波器看估算电流和实测电流的重合度重合度不再提升就停。第三相位补偿表必须逐速度点标定AN1078 给的 8 段公式是参考不是圣旨。标定方法让电机在某个速度下空载运行用示波器看相电压和相电流的过零点调整 θoffset 使两者同相。每个速度点都这么干然后拟合成分段线性。第四PI 参数先调电流环再调速度环。电流环带宽至少是速度环的 5 倍否则两个环互相干扰。电流环 Kp 从 0.5 开始Ki 从 0.01 开始看阶跃响应超调小于 10% 就行。速度环 Kp 从 0.1 开始Ki 从 0.001 开始响应时间根据应用定洗衣机这种不需要太快500 ms 到 1 s 都行。验证的时候别只看电机转不转。要测三个东西一是相电流 THD越低越好一般要求小于 10%二是效率输入功率和输出功率的比值AN1078 的目标是节能效率不达标一切白搭三是全速度范围内的 θ 跟踪误差用示波器看估算 θ 和实际 θ如果有编码器可以对比误差超过 10 度就得重新标补偿。最后别忘了诊断模式。AN1078 支持在示波器上实时看内部变量这个功能调 PI 的时候太有用了比串口打印快得多。我一般会把 Id、Iq、θ、ω 四个变量映射到 DAC 输出示波器四通道同时看动态过程一目了然。从那以后我每次拿到一份新的电机控制应用笔记都强制自己先把参数整定流程走一遍不跳步不凭感觉。AN1078 这份文档的价值不在于它给了你一组能用的参数而在于它把从 Clarke 变换到滑动模式观测器的每一步都拆开了让你知道每个数字从哪来、改哪个旋钮会有什么后果。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑