资讯动态

DSP28335永磁同步电机无位置传感器控制:滑模观测器实战拆解

发布时间:2026/10/14 18:09:11 来源:尧图企业网站定制
简介面向电机控制工程师与嵌入式开发者该代码包提供基于德州仪器TMS320F28335处理器的永磁同步电机无位置传感器控制完整例程采用反电动势估算转子位置与速度省去霍尔传感器和编码器可降低硬件成本并减少故障点适合学习磁场定向控制算法及实际项目二次开发。资源共52个文件压缩包约1.18MB包含C语言源程序、汇编程序、头文件、集成开发环境工程配置命令文件以及编译生成的目标与输出文件另有PDF说明文档目录结构清晰方便导入仿真环境调试。目前已有1396人浏览学习是官方高压永磁电机无位置控制工程实例的直接参考。程序覆盖初始化、电流电压采样、滤波处理、反电动势观测、转速电流双闭环控制、故障保护等模块配套图形观测界面可直观查看估算角度和电流波形能帮助开发者快速掌握无位置传感器控制从理论到代码的实现路径。1. 无位置传感器控制到底难在哪DSP28335代码的现实战斗你有没遇到过这种现场一台永磁同步电机的驱动系统编码器装在电机尾部被油污和振动搞挂了现场拆装一次要停机半天还未必配得到同款备件。无位置传感器控制就是在这种场景下把“转子实时位置”这个信息从硬件传感器手里接过来改由电压、电流采样值通过算法重构。它的名字叫“无位置”并不是不要位置信号而是把位置变成软件里的一个状态量。这套方案在空调压缩机、伺服、低速电动驱动里已经很常见。DSP28335这颗主频150MHz、带浮点单元的老将是很多现场工程师手里现成的控制平台PWM、ADC、QEP外设齐全。用它在永磁同步电机上做无位置传感器控制常见做法是滑模观测器加I/F强拖启动工况允许时可以省掉编码器和旋变的成本与故障点代价是代码量上去了调试维度也从“对旋变波形”变成“对一个软件观测器的带宽和收敛性”。这篇笔记写给两拨人一拨是有伺服或变频背景、想把产品往无传感器方案迁移的工程师另一拨是手里有28335例程、但只停在FOC电流环、还没碰过无位置算法的开发者。我会从算法选型讲到工程配置再逐段拆滑模观测器和SVPWM代码最后把现场最容易翻车的几个问题一次说透。2. 无位置传感器算法选型与原理滑模观测器为什么是首选2.1 先想清楚边界什么场合才值得上无位置传感器无位置传感器不是万能的。它解决的核心痛点是三类一是成本编码器和旋变加上线缆在批量产品里是一笔不小的物料开销二是环境高温、油污、强振动会让码盘和旋变变压器失效而无传感器方案只要功率板和电机绕组不坏就能继续转三是系统集成比如压缩机全封闭结构里根本没有轴端位置只能走无位置路线。但代价也很实在零速和极低速下反电动势信号接近零观测器基本失效所以必须靠启动策略硬拖上去且负载突变时存在失步风险。我的经验是凡是要求零速带额定转矩、或者频繁四象限运行的场合老老实实保留编码器凡是能接受几十毫秒启动过程、以连续运转为主的场景无位置传感器方案才值得投。2.2 从αβ系模型说起反电动势凭什么能当位置信号永磁同步电机在静止两相坐标系下的电压方程是uα R·iα Ls·diα/dt eαuβ R·iβ Ls·diβ/dt eβ。其中反电动势eα -ψf·ωe·sinθeeβ ψf·ωe·cosθe。这里θe正是我们需要知道的转子电角度ψf是永磁体磁链ωe是电角速度。只要能把eα、eβ从电压电流里提取出来就能反算出θe。问题在于电机正常运行时能测到的是端电压和相电流反电动势藏在其中且随转速变化零速时干脆为零。所以无位置传感器的本质就是做一个“反电动势观测器”根据电流环输出的电压指令和采样回来的电流反向构造出包含位置信息的信号再从中提取角度。这就是整个方案的地基。2.3 滑模观测器为什么能站稳开关函数与等效反电动势滑模观测器SMO的核心思想是把电流误差当作滑模面通过不连续的开关函数强迫电流估算值收敛到实际值然后从开关函数的输出里提取等效反电动势。它的好处是对电机参数里的电阻变化不敏感也不依赖精确的磁链值实现起来就是几个乘法、一个符号函数和一个低通滤波器非常适合DSP这种定点转浮点运算都吃的23035处理器。和它竞争的主流方案是龙伯格观测器及模型参考自适应MRAS。龙伯格对电感、磁链参数比较依赖参数失配时角度误差会随工况漂移MRAS做自适应律时转速辨识环和电流环耦合调试周期长。我给客户的多数项目里滑模观测器加锁相环提取角度是第一选择因为它的代码量小、鲁棒性好唯一让人头疼的是开关函数带来的抖振但把低通滤波截止频率和边界层参数调好之后效果完全够用。3. DSP28335工程与硬件准备从CMD文件到外设中断3.1 最小工程骨架CCS里的编译选项与运行流程DSP28335的工程不算复杂但新手容易在一个地方卡住找不到启动文件。28335上电后从Boot ROM引导然后跳转到0x3F7FB6处的Boot-to-Flash或Boot-to-RAM入口最终进入C环境执行main函数。你要保证三样东西都在工程里主程序源文件、外设初始化函数、和正确的CMD链接命令文件。CMD文件决定了代码段、数据段放到Flash还是RAM调试阶段我一般把RAM的CMD加进去让程序直接在RAM里跑烧录验证时才切到Flash版本。编译选项里必须确认两点。一个是浮点库28335是浮点核但工程属性里要把“浮点支持”选成浮点运算单元模式否则编译器会把浮点运算降级成软件模拟速度慢几倍。另一个是优化级别调试阶段用 -o0保证变量能实时查看量产固件再用 -o3配合“软件流水线”选项把电流环和观测器代码压到最短执行时间。3.2 最关键的三个外设初始化PWM、ADC、时钟树控制周期我习惯定在10kHz也就是PWM载波10kHz电流环采样频率10kHz一个PWM周期执行一次完整的FOC和无位置算法。这样可以保证SVPWM输出的谐波在可接受范围也能让IGBT或Mosfet的开关损耗控制在合理区间。时钟配置上28335的外部晶振常配30MHz通过PLL倍频到150MHz注意EPWM模块的时钟源是系统时钟分频后得到的分频系数要记清楚因为它直接决定PWM计数周期寄存器TBPRD的整定值。// clkAndPeripheralInit.c 片段 void InitPeripheralClocks(void) { // 1. 系统时钟150MHz外部30MHzPLL 10倍频 EALLOW; SysCtrlRegs.PLLCR 0x000A; // 10倍频30MHz*10300MHz再二分频150MHz EDIS; // 2. EPWM1时钟使能GPIO0~GPIO2复用为EPWM1A/1B/2A EALLOW; SysCtrlRegs.PCLKCR0.bit.EPWM1ENCLK 1; SysCtrlRegs.PCLKCR0.bit.EPWM2ENCLK 1; EDIS; // 3. ADC时钟使能并设定ADCCLK为25MHz EALLOW; SysCtrlRegs.PCLKCR0.bit.ADCENCLK 1; EDIS; AdcRegs.ADCTRL3.bit.ADCCLKPS 5; // 150MHz / (2*5) 15MHz确保不超过25MHz上限 }注意最后ADC时钟分频那里28335要求ADC模块时钟不超过25MHz用ADCCLKPS分频到15MHz再配合采样窗口设置保证12位采样精度不丢失。PWM这块TBPRD的计算方法是150MHz除以载波频率再乘以分频系数10kHz载波、CLKDIV1时TBPRD写7500。还有死区模块要单独配置上下桥臂互补输出时死区时间取1~2微秒视功率管驱动速度而定。3.3 中断服务函数结构10kHz时间片里放什么整个控制算法放在EPWM1的中断里。EPWM1的周期中断触发后顺序执行读取ADC结果寄存器、电流标幺化、Clarke变换、Park变换、电流PID、反Park、SVPWM、滑模观测器更新、锁相环角度更新。这个顺序不能乱因为角度更新和SVPWM输出必须落在同一个载波周期内闭环。// EPWM1中断ISR骨架 interrupt void epwm1_isr(void) { // 1. 读取三相电流实际值ADC结果寄存器 ia (float)AdcResult.ADCRESULT0 * CURRENT_SCALE - CURRENT_OFFSET; ib (float)AdcResult.ADCRESULT1 * CURRENT_SCALE - CURRENT_OFFSET; ic (float)AdcResult.ADCRESULT2 * CURRENT_SCALE - CURRENT_OFFSET; // 2. Clarke变换静止三相到静止两相 clarke(ia, ib, ic, i_alpha, i_beta); // 3. Park变换用最近一次角度估算值 park(i_alpha, i_beta, theta_est, i_d, i_q); // 4. 电流环PId轴和q轴各一个 id_pi(id_ref, i_d, v_d); iq_pi(iq_ref, i_q, v_q); // 5. 反Park得到v_alpha、v_beta inv_park(v_d, v_q, theta_est, v_alpha, v_beta); // 6. 滑模观测器更新用上周期v_alpha/v_beta和本周电流 smo_update(v_alpha, v_beta, i_alpha, i_beta, e_alpha, e_beta); // 7. 锁相环提取角度 pll_update(e_alpha, e_beta, theta_est, omega_est); // 8. SVPWM调制输出 svpwm(v_alpha, v_beta, ta, tb, tc); // 清中断标志 PieCtrlRegs.PIEACK.all PIEACK_GROUP6; }10kHz意味着ISR体必须在一百微秒内跑完28335在150MHz下执行简单浮点运算大约需要5到8个周期一个乘法整个FOC加SMO加PLL控制在20~40微秒是正常的。如果你发现ISR执行时间超过载波周期的60%就要用编译器的性能分析器定位瓶颈最常见的拖后腿操作是除法尽量改写成查表或乘以倒数尤其在PID和坐标变换的标幺化阶段。4. 核心算法模块代码拆解从坐标变换到位置估算4.1 Clarke/Park变换的浮点写法与标幺化陷阱坐标变换在教科书里有一堆矩阵工程上写起来其实是几行乘加。我习惯先把电流标幺化到[-1,1]之间基准值取电流采样满量程对应的电流这样后面PI参数和观测器增益可以用统一的量纲调试现场改硬件时不用重新推导比例因子。// coordinateTransform.c void clarke(float ia, float ib, float ic, float *i_alpha, float *i_beta) { // 三相到两相静止系数2/3保持幅值不变 *i_alpha (2.0f/3.0f) * (ia - 0.5f * ib - 0.5f * ic); *i_beta (2.0f/3.0f) * ((1.732f/2.0f) * (ib - ic)); } void park(float i_alpha, float i_beta, float theta, float *i_d, float *i_q) { float sine sinf(theta); float cosi cosf(theta); // 静止到旋转d为励磁分量q为转矩分量 *i_d cosi * i_alpha sine * i_beta; *i_q -sine * i_alpha cosi * i_beta; }sinf和cosf在28335里可以直接调用浮点库但每个周期调用两次还是会占用一些执行时间。如果控制频率要求更高或者ISR时间预算紧张我一般用查表加线性插值的办法角度用12位索引查表误差控制在0.1%以内对电流环和观测器来说完全够用。标幺化的坑在于电流零点漂移采样电路总会有几十毫伏的偏置如果不在初始化时做一次零点校准并软件扣除电流环输出里会多出直流分量反映到电机上就是固定方向的附加转矩转速越高越明显低速时会表现为异响。4.2 滑模观测器核心代码从电流误差到反电动势滑模观测器的实现公式并不复杂。设电流估算值为îα、îβ则电流误差i_s_alpha îα - iα滑模面取电流误差等于零。开关函数sign函数根据电流误差的正负输出±1乘上滑模增益K后叠加到电压模型上。当系统进入滑模运动后开关函数的平均值正好等于反电动势。为了把这种不连续的开关信号变成光滑的等效反电动势后面必须串联一个低通滤波器滤掉开关频率附近的抖振分量。// smoController.c 核心更新函数 void smo_update(float v_alpha, float v_beta, float i_alpha, float i_beta, float *e_alpha, float *e_beta) { float is_alpha, is_beta; // 电流估算误差 float z_alpha, z_beta; // 滑模开关输出(等效反电动势含抖振) // 1. 电流估算方程d/dt i (v - R*i - e)/L i_alpha_est TS * (v_alpha - R_s * i_alpha_est - K_SMO * sign(i_alpha_est - i_alpha)) / L_s; i_beta_est TS * (v_beta - R_s * i_beta_est - K_SMO * sign(i_beta_est - i_beta)) / L_s; // 2. 电流误差 is_alpha i_alpha_est - i_alpha; is_beta i_beta_est - i_beta; // 3. 开关函数输出K_SMO要大于反电动势幅值通常取额定反电动势的1.5~2倍 z_alpha K_SMO * sign(is_alpha); z_beta K_SMO * sign(is_beta); // 4. 一阶低通滤除抖振转折频率取载波频率的1/20~1/10 e_alpha LPF_COEF * e_alpha (1 - LPF_COEF) * z_alpha; e_beta LPF_COEF * e_beta (1 - LPF_COEF) * z_beta; }参数的含义要反复强调。R_s是相电阻L_s是相电感这两个值必须与实际电机匹配尤其是L_s直接决定滑模观测器的收敛速度。K_SMO如果太小系统进不了滑模运动反电动势估算会失真如果太大电流估算误差的抖振幅度会放大低通滤波器要付出相位滞后的代价。低通滤波系数LPF_COEF决定了角度估计的带宽系数越接近1滤波越强、相位滞后越明显低速下会影响启动切换的稳定性。我一般先把LPF转折频率放在载波的1/10也就是1kHz左右高速时可以适当加大。4.3 从反电动势到角度锁相环比atan2更好用得到滤波后的e_alpha、e_beta最直接的角度提取方式是反正切函数atan2(e_beta, e_alpha)。这个方法实现简单但有一个让人头疼的问题反电动势低通滤波本身就带来相位滞后导致估算角度滞后于实际位置角度一滞后Park变换出来d轴和q轴电流就不正交转矩输出下降甚至会诱发震荡。更稳的做法是鉴相器加环路滤波器也就是锁相环PLL结构。把反电动势的角度误差通过外积运算得到误差信号再进一个PI环输出是电角速度对角速度积分就是估算角度。外积运算天然就是一个正弦项在误差较小时近似等于角度差这种结构的动态响应比atan2顺滑且可以通过调节PI参数来补偿滤波相位滞后。// pllAngle.c void pll_update(float e_alpha, float e_beta, float *theta_est, float *omega_est) { float err; // 1. 利用外积构造误差e_alpha*cos e_beta*sin 的叉乘形式 // 实际计算err (-e_alpha*sinθ e_beta*cosθ) err -e_alpha * sinf(*theta_est) e_beta * cosf(*theta_est); // 2. PI调节器输出为电角速度rad/s omega_est_int KI_PLL * err * TS; omega_est KP_PLL * err omega_est_int; // 3. 角度积分限制在0~2π *theta_est omega_est * TS; if (*theta_est 6.2832f) { *theta_est - 6.2832f; } }注意PLL的输入反电动势e_alpha和e_beta是标幺化过的所以外积误差的增益里隐含了反电动势幅值信息。弱磁时会用更复杂的方式补偿PLL中 mag而不是改变结构。如果把低通滤波导致的相位滞后也折算进PLL参数里PLL的比例增益KP_PLL主要影响带宽积分增益KI_PLL主要消除稳态误差过高的KP会把高频噪声直接放进角度里实际调的时候建议从KP0.5ωc开始再逐步往上加。4.4 SVPWM扇区判断与七段式输出SVPWM的输出受限于母线电压它把空间电压向量分解到离目标最近的两个基础向量和零向量上。六边形被分成六个扇区每个扇区内的两个相邻基本电压向量和它们的占空比决定输出。判断扇区的代码可以写成基于电压的符号判断避免三角函数。// svpwm.c 扇区判断和占空比计算 void svpwm(float v_alpha, float v_beta, float *ta, float *tb, float *tc) { int sector; float v1, v2, v3; // 1. 用三个中间变量判断扇区 v1 v_beta; v2 (1.732f * v_alpha - v_beta) * 0.5f; v3 (-1.732f * v_alpha - v_beta) * 0.5f; if (v1 0) { sector 1; } else { sector 4; } if (v2 0) { sector (v3 0) ? 2 : (sector 1 ? 3 : 5); } else { sector (v3 0) ? 6 : (sector 4 ? 5 : 1); } // 简化后的扇区判断逻辑实际工程用查表法更稳 // 2. 计算基础向量作用时间Tpwm1/10kHz // ... 这里略过具体作用时间公式实际工程中直接查表配合标幺化处理 // 3. 根据扇区映射到三相比较寄存器CMPA/CMPB/CMPC *ta ...; *tb ...; *tc ...; }SVPWM写起来最容易错的地方是七个开关状态的插入顺序。七段式必须保证每次只有一个开关管动作否则会出现不必要的开关损耗。如果扇区判断逻辑有误最直接的表现是电流波形畸变、母线电流增加、电机振动变大。代码里我会保留一个调试整型变量sector_cache方便在CCS的Graph工具里直接观察扇区号的变化轨迹判断判断逻辑是否连续。5. 无位置传感器方案的关键动作启动策略与参数调优5.1 开机第一件事转子初始位置对齐无位置传感器在零速下没有反电动势可观测所以必须用主动手段让转子到达一个已知角度。最常用的套路是给d轴通一个固定方向的电流矢量让转子被拉到已知的电角度这个过程叫“预定位”。代码上就是设定id_ref为额定电流的20%到40%iq_ref设为零观察q轴电流为零且d轴电流建立后视为定位完成。// startup.c 预定位流程 void initial_position_alignment(void) { int count 0; // 1. 强制角度为0电角度d轴电流给额定值20% theta_est 0.0f; id_ref 0.2f * RATED_CURRENT; iq_ref 0.0f; // 2. 等待电流建立完成通常需要几个电流环周期 while (count 2000) // 200ms 10kHz { // 在ISR里会执行闭合的电流环这里只是主循环延时 count; } // 3. 把角度记录为起始点 theta_start theta_est; }预定位时间不能太短太短转子还没到位就切下一步容易出现启动瞬间抖动但也不能过长太长意味着启动响应慢尤其在需要频繁起停的设备里会被诟病。一个快速替代方案是短脉冲注入法交替给不同方向施加电压脉冲比较d轴电流响应用磁饱和效应找初始位置能省掉数百毫秒的定位时间代价是需要增加一版测试程序来标定阈值。5.2 I/F强拖启动转速爬坡和电流限幅的配合定位完成之后进入强拖阶段。所谓强拖就是不管观测器输出角度直接使用一个从0开始递增的给定电角度同时让电流环跟随给定的iq_ref输出恒定转矩电流。这个阶段相当于用电流环把转子硬生生“拖”到一定转速等反电动势信号足够大、观测器收敛稳定后再切入闭环。// startup.c I/F强拖启动 void if_start_ramp(void) { // 1. 角度给定按固定加速度递增每周期增加delta_omega*TS theta_ref omega_ramp * TS; // 2. 电流给定iq按斜坡上升到目标值 iq_ref I_IF_MAX * (theta_ref / (OMEGA_SWITCH * START_RAMP_S)); // 3. 判断反电动势有效值是否超过门槛 if (e_mag E_THRESHOLD omega_est OMEGA_SWITCH) { state CLOSED_LOOP; } }强拖的关键是加速度不能太大加速度太大转子跟不上给定角度失步直接过流甚至停机。我的习惯是加速度取额定转速对应加速度的十分之一到五分之一以运行速度3000rpm为例电频率对应100Hz启动时间500ms到1s比较安全。电流限幅方面强拖阶段电流不是越大越好过大的电流会加剧转子振荡电流零点和力矩方向的控制靠的是角度差动态平衡这一点经常被忽视。5.3 闭环保合与滑模增益的调整顺序从强拖切换到闭环最容易翻车。如果观测器角度和实际角度之间还有误差切换瞬间就会出现转矩脉动。我习惯先让强拖角度和观测器角度保持同步也就是在强拖阶段就让theta_ref跟踪SMO输出的theta_est但电流环用theta_ref供电人为制造一个角度误差拉开的余量。切换时把theta_ref平滑过渡到theta_est本质是做了一次角度的软切换。这段软组织好之后前面提到的那些参数按照“先估算电阻再估算电感然后调K_SMO最后调低通和PLL”的顺序来做。估算电阻最土的办法是在堵转状态下给绕组加恒定电流测电压除电流估算电感则可以用电压阶跃响应看电流变化率。这两个参数在离线时用功率分析仪或示波器记录就能算准现场没有仪器时也可以从电机铭牌上的额定电流和堵转电压反推精度稍差但在可接受范围。K_SMO的调节要结合观测量和电流波形把电流误差和开关信号z拉到能稳定观测的位置。如果z波形毛刺很大说明K_SMO过高或者低通不够强力如果反电动势幅值随转速不线性增长说明有待优化增益。整个闭环跑稳后再把注意力放到低速切闭环的临界转速那往往是无位置方案的生死线。6. 避坑与排查现场最常遇到的五个翻车现场6.1 现象上电启动瞬间电流很大PWM封锁停机原因多半出在预定位阶段。d轴电流还没建立起来就进入了强拖转子实际角度和theta_ref差值接近180度此时电流环被迫输出极限电压母线电流瞬间冲高。另一个常见原因是电流采样零点没校准零偏让d轴电流环以为已经有电流实际没有。解决方法是先花五分钟校准零漂把采样电路短接或者停机逻辑下记录三路ADC平均值然后根据母线电压设定预定位电流值不要超过额定电流的30%同时把预定位时间放长到300ms以上再观察电机的微小转动是否干脆。如果电机在定位时有明显来回振荡检查零漂和死区补偿。6.2 现象低速运行电机啸叫明显电流波形上有高频毛刺多数情况下是滑模观测器的抖振在作祟。开关函数产生的高频分量在低速时占比更大低通滤波转折频率如果太高毛刺就直接串进角度。还有一个容易被忽略的地方是PWM载波附近的采样噪声在低速时表现为电流环的谐波耦合。解决方法是把低通滤波转折频率从1kHz逐步降到300Hz同时确认电流采样时间点落在PWM计数器的波谷避开开关切换噪声。如果用了并联采样电阻还要检查采样电阻的引脚布局长走线会带来串联电感造成尖峰。6.3 现象重载时估算角度滞后电机掉速甚至失步这是所有无位置传感器方案都会面对的物理瓶颈。重载时电流大电感压降和饱和效应都会使等效反电动势的相位发生变化观测器的角度误差随负载增大而增大。低通滤波器在高速段又带来固定滞后角度误差一旦超过逆变器电压六边形的边界转矩控制直接失效。解决办法是在PLL环路里加入相位补偿把低通滤波器的滞后角显式加回去。误差大约等于arctan(w_lpf_current / w_pll_bw)全场统一写成一个查表函数在高速段逐点补。同时把K_SMO适当提高保证重载下开关函数仍能有效跟踪反电动势。6.4 现象热机后角度漂移明显冷机正常热态下绕组电阻会上升百分之二十到三十电感也有磁饱和相关变化观测器参数失配导致反电动势估算偏小角度估算开始波动。如果电阻参数没有温度折减高温运行一段后就会出现这种故障。解决方法是把定子电阻做成随温度变化的参数用NTC贴在电机壳体上读取温度通过查表修正或者更简单让K_SMO带一点裕度用开关函数输出闭环比对电阻变化只要K_SMO设置到额定反电动势的1.5倍以上电阻漂移对估算的影响就会被滑模的强鲁棒性压住这也是滑模观测器比龙伯格观测器更省心的原因。6.5 现象CCS在线调试时一打断点电机就飞车这跟28335的外设运行机制有关。当调试器把CPU停在断点处PWM模块依然按照之前装载的值继续输出但ADC和中断都不更新相当于给电机一个固定电压矢量几毫秒内就会把电流冲到保护值或者把电机推到一个未知位置。这几乎是所有DSP电机调试新手都会踩的坑。解决方法是不要在电流环ISR里打断点要观察变量就用CCS的Graph窗口和实时仿真模式把变量加入Expressions后开启实时刷新让CPU在不停止的情况下上传数值。如果实在需要断点先把PWM输出强制到低电平或者断开功率级供电让电机完全自由转动再断点检查。7. 验证与进阶把观测器逼到极限再量化位置误差7.1 强制角度模式自己造一个可测基准无位置传感器方案最难的一块不是写代码而是怎么证明观测器的角度是对的。现场没有编码器但可以在实验室把电机轴头接一个临时编码器或者光电码盘作为基准信号。启动时用开环强制角度模式运行把电角度完全由程序给出此时观测器角度可以和程序已知角度作差直接量化误差。做法是写一个调试模式在强拖状态下让theta_ref计算公式里增加一个固定偏移量然后观测器会尝试跟随这个已知角度。如果两者误差小于电角度5度说明观测器收敛正常。这个测试可以在低速到额定转速的多个频点重复跑一遍能得到一条观测器角度误差随转速变化的曲线是后续调优的依据。7.2 阶跃负载与母线电压波动下的极限确认位置误差的小信号验证还不够无位置方案最容易在负载突变时露馅。我会在电机稳定运行于半载时突然把负载加到额定记录q轴电流突跳后的几十毫秒内角度误差是否超过15度电角度以及转速跌落后能否重新稳定。这个测试用示波器同时抓相电流、角度误差和转速波形角度误差可以直接从调试变量里转成模拟量输出到DSP的DAC引脚。还有一个必测工况是母线电压波动。无位置方案里SVPWM输出电压受母线电压制约母线突然跌落后如果电压矢量超过六边形边界电流环输出饱和观测器角度会在几个周期内偏离。我习惯在实验台加一个可编程直流源做母线电压从额定跌落到70%再恢复的扫描确保PLL不会在这个过程里跑飞。这一轮测下来方案基本就具备上现场的条件了。我自己的习惯是每次改完观测器参数都会在固定的几个转速点和负载点记录角度误差写进一个简单的表格哪怕隔了一个月回来也能一眼看出参数调整带来的是正面还是负面变化。这个习惯让我少走了很多弯路每次项目收尾都觉得跟代码相比真正难的不是算法是验证手段和足够的耐心。希望这篇拆解能帮到你也祝你的28335无位置传感器方案顺利跑通。本文还有配套的精品资源点击获取

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

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

免费获取报价 →
↑