感应异步电机的无传感器矢量控制,完整的C代码+仿真模型: 1. 基于“电压模型+电流模型”的磁链观测器,实现转子磁场定向控制(FOC),可实现电机在低速、中高速段的高精度的转速估算; 代码已经成功移植到DSP芯片(TMS320F28335)和STM32F107中,对一台额定功率为33kW的异步电机进行了无传感器矢量控制,波形和试验台架数据见下图。 2. 可实现电机带满载零速启动,抗负载扰动性强,响应速度快,控制精度高; 3. SVPWM空间电压矢量调制,定子电流波形的畸变率低; 4.采用S-Function的方式,把C代码直接在simulink下进行仿真,所见即所得! 5.详细的算法原理推导,跟程序代码是完全对应的。

感应异步电机无传感器矢量控制软件

逐行级功能解读说明书(V2.0)

——写给需要“看懂代码在干什么”的人

一、阅读提示

本文不是“用户手册”,而是“代码导游图”。

我带你从 main.c 的第一行开始,沿着中断采样→坐标变换→磁链估算→速度估算→电流/速度双闭环→SVPWM 发波的完整路径,把“每一句 C 语句到底解决了什么问题”说清楚。

为了避免直接泄露可复制的核心源码,文中只保留“函数/宏的骨架”与“关键变量语义”,并用“…”代替具体运算式;同时把宏名、结构体字段、状态机标志全部保留,方便你在本地源码里 Ctrl+F 对标。

读完以后,你应该能在脑海里跑完一次 125 µs 的中断周期,并知道如果要把代码搬到 STM32H7 上,该改哪一行、该删哪一行、该留哪一行。

------------------------------------------------

二、main.c 的“一生”

main.c 在 PC 端是 S-Function,在 MCU 端就是中断服务函数。

它只干四件事:

1) 把 Simulink 输入端口里的 4 组信号(母线电压、三相电流、运行开关、测速脉冲)搬进 C 结构体;

2) 按固定顺序调用 11 个“宏状态机”,完成一次完整的 FOC 节拍;

3) 把 17 组输出端口填回去,供示波器或外部模式抓取;

4) 如果检测到故障,立即把 PWM 占空比清零并锁死。

下面按调用顺序拆给你看。

------------------------------------------------

三、采样与标定(第 1~20 行)

Input: uPtr0~uPtr3

Output: clarke1.As/Bs/Csvolt1.DcBusVolt

功能:

  • 三相电流先减去“离线校准得到的零漂”,再除以 BASE_CURRENT,变成 per-unit。
  • 母线电压除以 BASE_VOLTAGE,得到 0~1.15 pu 的量。

注意:这里没有硬件滤波器,零漂在每次 Boot 时自动扫描 4 k 次取平均,存到 Flash 的 attribute((section(".eeprom"))) 区域;如果你换一块新板子,第一次烧录务必让电机静止 2 s。

------------------------------------------------

四、Clarke 变换(第 21 行)

宏名:CLARKE_MACRO(clarke1)

输入:As,Bs,Cs(瞬时值)

输出:Alpha,Beta(两轴静止坐标系电流)

代码层面只做了两次加法和一次乘法:

Alpha = As;

Beta = (As + 2Bs) 0.57735026918963f;

C 字段被直接展开成 inline,所以没有函数跳转开销。

如果你把采样频率从 10 kHz 提到 20 kHz,只需确认 MCU 的乘法器是单周期即可。

------------------------------------------------

五、Park 变换(第 22~25 行)

宏名:PARK_MACRO(park1)

输入:Alpha,Beta,Angle

输出:Ds,Qs(旋转坐标系电流)

关键点:

  • Angle 不是机械角度,而是转子磁链角度 fe1.ThetaFlux,由磁链观测器在上一个周期算出。
  • sine/cosine 值由自定义的 IQsinPU/IQcosPU 查 512 点表得到,Q15 格式,耗时 0.4 µs(F28335)。
  • Park 变换完以后,Ds 对应励磁分量,Qs 对应转矩分量,后面两个 PI 环分别盯住它们。

------------------------------------------------

六、磁链观测器 ACIFE(第 26 行)

宏名:ACIFE_MACRO(fe1)

这是全代码最“长”的宏,也是低速大转矩的灵魂。

它内部拆成 4 段:

1) 电流模型:用转子方程递推出 FluxDrE,再把旋转坐标系磁链反 Park 回静止坐标系,得到 FluxDrS,FluxQrS

2) 电压模型:用 U-alpha,U-beta 减去电阻压降,积分得到 PsiDsS,PsiQsS

感应异步电机的无传感器矢量控制,完整的C代码+仿真模型: 1. 基于“电压模型+电流模型”的磁链观测器,实现转子磁场定向控制(FOC),可实现电机在低速、中高速段的高精度的转速估算; 代码已经成功移植到DSP芯片(TMS320F28335)和STM32F107中,对一台额定功率为33kW的异步电机进行了无传感器矢量控制,波形和试验台架数据见下图。 2. 可实现电机带满载零速启动,抗负载扰动性强,响应速度快,控制精度高; 3. SVPWM空间电压矢量调制,定子电流波形的畸变率低; 4.采用S-Function的方式,把C代码直接在simulink下进行仿真,所见即所得! 5.详细的算法原理推导,跟程序代码是完全对应的。

3) 误差补偿:把电流模型当成参考,电压模型当成观测,两个 PI(Kp,Ki 在结构体里可调)输出补偿电压 UCompDsS,UCompQsS,再去修正电压模型的积分起点。

4) 转子磁链重构:用补偿后的定子磁链反算出 PsiDrS,PsiQrS,再用 atan2 算角度 ThetaFlux

阅读提示:

  • 所有积分都用梯形法,Psi = Psi + 0.5fTs(Emf_old + Emf),防止纯欧拉积分发散。
  • 角度输出的单位是“转/1”,即 0~1.0 对应 0~360°,方便后面直接查表。
  • 如果你看到电机在 1 Hz 以下来回抖动,十有八九是这段的 Kp,Ki 太激进,先把它俩除以 4 再试。

------------------------------------------------

七、速度估算器 ACISE(第 27 行)

宏名:ACISE_MACRO(se1)

输入:PsiDrS,PsiQrS,ThetaFlux,IDsS,IQsS

输出:WrHat(pu 转速),WrHatRpm(rpm 转速)

原理:

  • 先算转差 WSlip = (PsiDrSIQsS – PsiQrSIDsS) / (PsiDrS^2 + PsiQrS^2) * K1
  • 再算同步速 WSyn = (ThetaFlux – OldThetaFlux) * K2
  • 低通滤波后 WrHat = WSyn – WSlip

陷阱:

  • OldThetaFlux 必须延迟一个周期,否则同步速会提前一拍,造成 20 rpm 稳态误差。
  • 当角度跨越 0/1 边界时,差分会突然跳 ±1.0,代码里用 if (delta > 0.9f) delta -= 1.0f; 做了保护。
  • 高速区(> 150 Hz)如果采样抖动大,把低通滤波截止频率 fc 从 10 Hz 提高到 30 Hz,可抑制噪声。

------------------------------------------------

八、双闭环 PI(第 28~30 行)

宏名:PIMACRO(pispd)、PIMACRO(piid)、PIMACRO(piiq)

结构体字段:

Ref——给定;Fbk——反馈;Out——输出;Kp,Ki——参数;Umax,Umin——饱和限幅。

代码特点:

  • 积分分离:当输出饱和时 ui 不再累加,防止退饱和积分 windup。
  • 电流环限幅 0.95 pu,保留 5 % 母线电压裕量给 SVPWM 过调制。
  • 速度环限幅 1.5 pu,允许 1.5 倍短时过载。

调参顺序:

先电流环(空载),再速度环(阶跃 20 % 额定速),最后满载零速启动。

如果电流环震荡,把 Kp 减半;如果速度环恢复慢,把 Ki 乘 1.5。

------------------------------------------------

九、反 Park 变换(第 31 行)

宏名:IPARK_MACRO(ipark1)

输入:Ds,Qs,ThetaFlux

输出:Alpha,Beta(静止坐标系电压)

注意:

  • 这里 Dspiid.OutQspiiq.Out,已经包含解耦前馈。
  • sine/cosine 与 Park 共用同一张表,节省 1 kB Flash。

------------------------------------------------

十、SVPWM 发波(第 32 行)

宏名:SVGENDQ_MACRO(svgen1)

输入:Ualpha,Ubeta

输出:Ta,Tb,Tc(0~1 占空比)

算法:

  • 先判断扇区(1~6),再算三相占空比,最后插入死区。
  • 死区时间 1.5 µs 固定,如果开关频率 > 16 kHz,在 Settings.hDEADTIMENS 改小。
  • 当调制比 > 1.05 时自动进入过调制,转矩波动略增但母线利用率提高 8 %。

------------------------------------------------

十一、相电压重构(第 33 行)

宏名:PHASEVOLT_MACRO(volt1)

功能:

  • Ta,Tb,TcUdc 反推三相绕组实际看到的电压 Valpha,Vbeta,供磁链观测器使用。
  • 如果逆变器输出加了 LC 滤波,把 OutOfPhase 标志置 1,补偿 30° 相移。

------------------------------------------------

十二、故障保护(贯穿全周期)

标志位:

lsw——外部急停;

OverCurrent——峰值电流 > 1.8 pu;

OverVoltage——母线 > 1.15 pu;

Stall——速度给定 ≠0 但估算速 < 0.05 pu 持续 0.5 s。

一旦触发,把 Ta=Tb=Tc=0,同时 pi_spd.Ref=0,锁存到手动复位。

------------------------------------------------

十三、如何从 PC 仿真过渡到 MCU

  1. Settings.h 里的 ISR_FREQUENCY 改成目标板实际值(例如 10 kHz)。
  2. ACIM_MEX.m 注释掉,新建 main.c 的裸机入口:

  while(1){ ADCtrigger(); main(); PWMupdate(); }

  1. attribute((section(".eeprom"))) 的零漂变量,改成 MCU 的真正的 EEPROM 或 Flash 模拟。
  2. 如果 MCU 没有硬件除法,把 ACIFECONSTMACRO 里的除法提前在 PC 端算好,做成常量表。
  3. 512 点 sine 表 放进 Flash,用 const int16t _flash 修饰,节省 RAM。

------------------------------------------------

十四、常见坑与定位方法

  • 零速抖动:先查 ACIFE.Kp,Ki,再查电流采样偏置是否校准。
  • 高速掉速:把 ACISE.fc 提高,确认母线电压采样没有相位滞后。
  • 启动反转 90°:ThetaFlux 初始值没有清零,确保上电 fe1.PsiDrS=1.0f, fe1.PsiQrS=0.0f
  • 电流环震荡:把 pi_id.Kp 减半,确认 Ts 与真实中断周期一致。
  • MEX 编译失败:把 mex main.c 改成 mex -DMATLABMEXFILE main.c,避免链接 cg_sfun.h

------------------------------------------------

十五、结语

通读下来,你会发现整份代码没有“神秘黑箱”:

采样 → 坐标变换 → 磁链/速度估算 → 双闭环 → SVPWM,每一句 C 语句都能在中断周期里找到硬件事件对应。

只要把宏一层层展开,就能看到电机电流如何在 125 µs 内完成一次“三相时域 → 两相静止 → 两相旋转 → 控制 → 反变换 → 三相占空比”的完整旅程。

理解了这段旅程,你再碰到任何 FOC 芯片库、任何“电机 Workbench”,都能一眼看出它背后藏的是不是同一套“双模型磁链观测 + 转差补偿”的灵魂。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐