基于DSP2803x的无传感滑膜观测器(SMO)+锁相环(PLL)永磁同步电机(PMSM)驱动方案

张开发
2026/5/30 3:02:50 15 分钟阅读
基于DSP2803x的无传感滑膜观测器(SMO)+锁相环(PLL)永磁同步电机(PMSM)驱动方案
一个同步机无传感滑膜观测器模型加代码该模型基于28035芯片采用了典型的smopll方案。这段代码是实际应用代码而不是一般的玩票代码因此具有较高的可比性不同于ti例程。需要注意的是少数文件中的中文注释可能存在乱码问题。至于m文件它并没有太多用处直接运行simulink模型即可。——代码功能与流程深度说明一、方案概述本代码为通合辅助控制器TH-Assist-PM量产级工程运行于TI C2000 DSP2803x具体型号28035PN。系统采用经典滑膜观测器SMO锁相环PLL实现永磁同步电机无位置传感器矢量控制FOC。控制目标在0.5 Hz~400 Hz电频率范围内全速域无位置传感器运行带满载启动、低速大转矩、高速弱磁。性能指标– 稳速误差 ≤ ±0.2 %额定转速– 转矩脉动 ≤ 3 %额定负载– 启动转矩 ≥ 150 %额定0.5 Hz可带载启动– 最高弱磁转速 ≥ 2.5 倍额定。代码特点寄存器级直接配置零抽象层中断延迟 250 ns双更新率PWM载波10 kHz电流环20 kHz速度外环2 kHz全部关键算法SMO、PLL、弱磁、过调制采用IQ24定点实现避免浮点库开销量产级保护双区校验、ADC断线检测、相电流重构可信度监控、SMO误差饱和保护代码结构遵循“硬件层→驱动层→算法层→应用层”四级隔离方便移植到2837xD、28002x等后续芯片。二、硬件与软件架构1. 硬件拓扑功率板三相两电平逆变器MOSFET/IGBT兼容DC 48 V~72 V采样三电阻下桥采样双七阶Sinc模拟RC滤波ADC窗口与PWM中心对齐外设– EPWM1/2/3 产生中心对称10 kHz PWM– EPWM4 触发ADC SOC0~SOC2采样顺序Ia→Ib→Vdc– EQEP1 保留用于调试时挂光电编码器– SPI-A 接16-bit 外部DAC实时输出内部变量– GPIO34 故障聚合过流、过压、堵转。2. 软件分层app_main.c ┐ 应用层状态机、起停流程、故障管理 └── fsm_ctrl.c │ 状态机INIT→ALIGN→OPEN→CLOSE→RUN smo_pll.c │ 算法层SMO、PLL、速度估算 └── iqmath_func.asm │ IQ24定点快速宏 pwm_drv.c │ 驱动层PWM、ADC、采样同步 └── adc_isr.asm │ 采样中断入口零等待 dsp2803x_headers/ ┘ 硬件层寄存器定义、位域三、核心算法与代码流程1. 采样与重构ADC-ISR20 kHz入口ADCINT1_ISR → AdcIrqHook()① 立即保存三相下桥电流Iaraw、Ibraw② 计算第三相Ic –(IaIb)完成三相→两相ClarkeIalpha Ia; Ibeta (Ia 2*Ib)*0.866; // IQ240.866 _IQ(√3/2)③ 读取DC母线电压Vdc归一化到IQ24④ 读取电位器或通信给定的Iq_ref转矩电流⑤ 置位flagsmocalc 1通知后台SMO任务。2. 滑膜观测器SMO执行体smo_step()被主循环调度实际运行频率20 kHz。一个同步机无传感滑膜观测器模型加代码该模型基于28035芯片采用了典型的smopll方案。这段代码是实际应用代码而不是一般的玩票代码因此具有较高的可比性不同于ti例程。需要注意的是少数文件中的中文注释可能存在乱码问题。至于m文件它并没有太多用处直接运行simulink模型即可。输入Ialpha、Ibeta、Valpha、Vbeta来自电流环PI输出。输出Ealpha、Ebeta反电动势估测值。算法方程离散化IQ24Iest_alpha Iest_alpha Ts/Ls*(Valpha - Rs*Iest_alpha Kslide*sign(Ialpha-Iest_alpha)) Ealpha Kslide*sign(Ialpha-Iest_alpha)关键参数–Kslide _IQ(6.0)滑膜增益–LowPassCutoff 800 Hz二阶IIR滤波器定点系数预先计算– 引入饱和积分保护当|Iest-I| Imax*15 %时冻结积分器防止启动瞬间发散。3. 锁相环PLL输入Ealpha、Ebeta输出thetae电角度、omegae电角速度IQ24 rad/s结构相位检测器epsilon -Ealpha*sin(theta_hat) Ebeta*cos(theta_hat)PI调节器omega_hat Kp_pll*epsilon Kipll*Ts*epsilon theta_hat omega_hat*Ts参数整定–Kppll IQ(1200)Kipll IQ(80000)– 带宽 ≈ 120 Hz阻尼系数 0.707可追踪 ±6000 rpm阶跃。4. 矢量控制FOC电流环采样坐标变换 →Id、Iq参考值Idref 0最大转矩每安培Iqref来自速度PI或外部转矩指令双PIId、Iq输出Vd、Vq前馈解耦Vdff -omegaeLqIqVqff omegae(LdId Psi_m)反Park →Valpha、Vbeta送给SMO与SVPWM速度环2 kHz调度PI输出直接作为Iq_ref抗饱和采用积分分离遇限削弱Clamping。5. 弱磁与过调制当Vmag 0.92*Vdc/√3时进入弱磁Id_ref - (Vmag - Vmax) * Kfw过调制区采用最小幅值误差补偿MTPA单模式过调制保证高速转矩连续。四、状态机与启动流程INIT ──► ALIGN转子预定位──► OPENI-f开环强拖──► CLOSESMO切入──► RUNALIGN– 注入直流Id 0.6*InomIq 0持续 600 ms– 检测电流环饱和情况若|Iactual-Iref| 5 %则认为成功。OPENI-f 强拖– 给定thetaopen ∫omegaopendtomegaopen从 2 Hz 线性加速到 8 Hz– 电流幅值恒定Iopen 0.4Inom– 当omega_open ≥ 6 Hz且|Ealpha||Ebeta| Ethreshold持续 50 ms判定反电动势可信。CLOSE– 将PLL输出thetapll与thetaopen做差误差 0.15 rad 持续 40 ms 后切换– 切换时把PLL积分器预置为当前theta_open避免跳变。RUN– 正常FOC– 实时监测|epsilonpll| 0.25 rad与|omegapll-omegacmd| 0.05*omegabase– 任一条件持续 100 ms 异常即报“PLL失锁”降额到开环或停机。五、关键代码片段解读1. 采样与Clarke汇编级零等待; ADCINT1_ISR (adc_isr.asm) MOVW DP, #AdcResultRegs.ADCRESULT0 MOVL XAR4, AdcResultRegs.ADCRESULT0 ; Ia MOVL ACC, XAR4 LSL ACC, #8 ; 左移8位→IQ24 MOVL Ia_raw, ACC ... LCR _Clarke_asm ; 调用Clarke2. SMO核心C代码__attribute__((always_inline)) static inline void smo_step(void) { _iq err_alpha Ialpha - Iest_alpha; _iq err_beta Ibeta - Iest_beta; _iq sign_alpha (err_alpha 0) ? _IQ(1) : _IQ(-1); _iq sign_beta (err_beta 0) ? _IQ(1) : _IQ(-1); Iest_alpha _IQmpy(Ts_div_Ls, Valpha - _IQmpy(Rs, Iest_alpha) \ _IQmpy(Kslide, sign_alpha)); Iest_beta _IQmpy(Ts_div_Ls, Vbeta - _IQmpy(Rs, Iest_beta) \ _IQmpy(Kslide, sign_beta)); Ealpha _IQmpy(Kslide, sign_alpha); Ebeta _IQmpy(Kslide, sign_beta); /* 二阶IIR低通 */ Ealpha_f _IQmpy(b0, Ealpha) _IQmpy(b1, Ealpha_z1) _IQmpy(b2, Ealpha_z2) \ - _IQmpy(a1, Ealpha_f_z1) - _IQmpy(a2, Ealpha_f_z2); ... }3. PLL代码void pll_run(_iq Ealpha, _iq Ebeta) { _iq sin_th _IQsin(theta_hat); _iq cos_th _IQcos(theta_hat); _iq eps -_IQmpy(Ealpha, sin_th) _IQmpy(Ebeta, cos_th); omega_hat _IQmpy(Kp_pll, eps) _IQmpy(Ki_pll, _IQmpy(Ts, eps)); theta_hat _IQmpy(Ts, omega_hat); if (theta_hat _IQ(2*PI)) theta_hat - _IQ(2*PI); if (theta_hat 0) theta_hat _IQ(2*PI); }六、调试与量产经验电流采样偏置自校准– 每次上电自动对三通道求平均 128 点存入Flash备份– 运行中实时监测偏置漂移若|IaIbIc| 1 % Inom持续 200 ms则触发“采样异常”故障。SMO增益自整定– 离线脚本用Matlab/Scipy扫描Kslide与PLL带宽生成二维查表– 在线根据Vdc、omega_e线性插值保证全速域稳定。高速弱磁区震荡抑制– 在Idref通道加入可变带宽低通fc 200 - 0.015 * omegae (Hz)– 有效防止弱磁→过调制切换时的电流震荡。量产EOL测试– 通过SPI-DAC输出thetaerr、omegaerr自动测试台记录100 rpm~3000 rpm的误差分布– 关键判据–mean(|thetaerr|) 0.04 rad–3σ(omegaerr) 0.02*omega_nom七、移植与裁剪指南目标芯片主要改动说明28002x替换EPWM/ADC寄存器名位域兼容仅需换头文件2837xD使用双核CM4或CLA把SMOPLL放入CLACPU负载可降30 %28004xFlash等待周期不同修改FBANKWAIT保证72 MHz零等待无CAN产品删除ECana相关文件节省~6 KB Flash八、小结本代码展示了量产级无传感PMSM驱动的完整范式从寄存器配置、采样同步到SMO/PLL定点实现再到状态机与故障保护每一层都留有量化接口与测试钩子采用IQ24定点既保证动态范围又避免浮点库开销通过“开环强拖→PLL无缝切换”策略实现0.5 Hz可重载启动弱磁、过调制、抗饱和、采样漂移自校准等细节可直接用于家电、风机、泵类、电动工具等大批量产品。读者在理解本文后可快速将核心文件smopll.c、adcisr.asm、pwmdrv.c移植到任何C2000平台或通过替换smostep()为HFI、龙伯格观测器实现差异化方案。

更多文章