ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

TMS320F28335实现FOC控制:死区配置、电流采样与算法要点详解

TMS320F28335实现FOC控制:死区配置、电流采样与算法要点详解 简介基于28335的电机FOC控制工程源码包面向电机驱动、嵌入式控制和电力电子相关开发人员定位为基于TI TMS320F28335实现FOCSVPWM控制策略的完整参考工程。压缩包共135个文件、1.25MB主要包含DSP2833x标准库的C源文件与头文件用于启动初始化的ASM汇编代码链接配置CMD文件GEL初始化脚本以及算法库等。已有2171人学习读者可参照其中完整的FOC软件包结构快速掌握28335平台下的电机控制开发要点。包内代码层次清晰、模块划分明确电流环与速度环的PI参数配置、Clarke/Park坐标变换和SVPWM开关序列生成等关键模块均可对照硬件外设进行验证适合进行算法二次开发和调试排错既为入门者提供可直接运行的样例也为进阶开发者提供定制化修改的骨架。此外包内文件相互关联清晰方便在CCS中建立工程并单步跟踪关键中断服务程序有助于建立对FOC实际工程实现的整体认识。 做电机控制的这些年绕不开TI的C2000系列特别是TMS320F28335。这颗芯片算是实验室里的常青树了我做FOC磁场定向控制项目时第一套能稳定转起来的系统就是用28335搭的。后台也经常有人问28335的PWM死区寄存器DBFED、DBRED到底怎么配主源选择有要求吗电流采样为什么要放下桥Clarke变换为什么只采两相电流这些问题其实都是FOC落地时最容易被绊住的点。这篇文章就围绕“基于28335的电机FOC控制”这条线把我实际调试中的思路、配置和踩坑记录都整理出来给正准备上手的同学当一份参考。1. 为什么大家都拿28335做FOC1.1 28335这颗DSP到底强在哪先聊芯片选型。现在做电机控制的方案很多STM32、国产MCU、FPGA都能跑FOC但28335在中小功率电机驱动项目里依然有不可替代的位置。核心原因有三个150MHz主频、硬件浮点单元FPU、完整的外设组合。FOC算法本身运算量不算小电流环如果跑到20kHz一个周期里要做Clarke变换、Park变换、两个PI调节器、SVPWM还要处理速度环和转子位置估算。如果是定点芯片所有小数都得做Q格式换算光是处理溢出和精度问题就能让人头大。28335是浮点DSP直接用float写PI指令省掉大量移植和调试成本。外设方面28335的ePWM模块可以生成带死区的互补PWM12位ADC支持多通道同步采样还有编码器接口、QEP等模块。做FOC需要的“高频PWM同步ADC采样角度反馈”这三件事它都能用硬件完成不占用CPU太多资源。相比用通用MCU靠定时器中断模拟PWM和采样时序28335的开发体验明显顺滑。当然现在也有更新的芯片但28335的例程、技术文档、参考设计最多碰到问题能找到的答案也最多对新手相当友好。1.2 FOC系统的整体框架与三环考虑FOC这套东西听着玄乎本质就是把三相交流电机的控制问题通过坐标变换变成类似直流电机的控制问题。28335在系统里的角色是核心控制器采集电流和转子位置运行FOC算法输出六路PWM驱动三相逆变器。整个控制结构从外到内通常分三层——位置环、速度环、电流环也就是常说的三环。位置环在最外面输出速度给定速度环在中间输出电流给定电流环在最里面直接控制电机绕组电流。电流环是FOC的根基电流环带宽要足够高才能让实际电流快速跟随给定值一般放在PWM中断里跑频率和PWM一致常见10kHz到20kHz。速度环在电流环外面带宽要比电流环低一个数量级否则两个环会互相干扰典型值1kHz到2kHz。位置环最慢几百赫兹就够。这个频率搭配不是随便定的频带拉开才能保证每一层环路对上层是“透明”的不然系统容易振荡。2. 硬件配置里的两个关键细节PWM死区与电流采样2.1 DBFED和DBRED怎么配死区主源选择有什么要求三相逆变器的上下桥臂是互补导通的如果上管还没完全关断下管就导通了母线直接被短路器件瞬间烧毁。所以互补PWM必须插入死区时间也就是让上下桥都关断一小段时间。28335的ePWM模块里专门有死区子模块DBFED对应上升沿死区延迟DBRED对应下降沿死区延迟单位是TBCLK计数个数不是纳秒。这个细节很多人会搞错我在代码里看到过直接把DBFED写500以为是500纳秒实际还要看TBCLK频率是多少。死区主源选择的关键在于要让互补输出的上升沿和下降沿基于同一个信号源做延迟这样上下桥的开关时刻才是对称的。EPwm1Regs.DBCTL的IN_MODE位就是干这个的一般配置为上升沿和下降沿都使用EPWMxA作为输入再通过POLSEL设置输出极性形成A高有效、B低有效的互补对。如果主源选择混乱比如上升沿用A、下降沿用B插入的死区会不对称输出的波形会莫名其妙地出现窄脉冲甚至失去死区保护作用。死区时间的具体数值和功率器件、驱动电路强相关。小功率MOS管的开关时间通常在几十到几百纳秒死区设300ns到500ns就够IGBT模块或大功率MOS管关断延迟可能到微秒级死区要放宽到2us甚至3us。我见过不少初学者为了追求波形理想把死区设得很小结果上电就炸管。调死区最可靠的方式是示波器同时测上下管栅极波形确认关断完成后再开通留出20%到30%的余量。代码配置大致这样// 以20kHz PWM、TBCLK150MHz为例 EPwm1Regs.TBPRD 3750; // 150MHz/20kHz7500增减计数时周期减半 EPwm1Regs.TBCTL.bit.CTRMODE TB_COUNT_UPDOWN; EPwm1Regs.TBCTL.bit.SYNCOSEL TB_CTR_ZERO; EPwm1Regs.DBCTL.bit.IN_MODE DBA_ALL; // 上升沿和下降沿均从EPWMxA输入 EPwm1Regs.DBCTL.bit.OUT_MODE DB_FULL_ENABLE; EPwm1Regs.DBCTL.bit.POLSEL DB_ACTV_HIC; // DBA高有效DBB低有效 EPwm1Regs.DBFED 45; // 约300ns1/150MHz*45 ≈ 300ns EPwm1Regs.DBRED 45; // 约300ns这里TBCLK是150MHz一个计数周期约6.67ns45个计数差不多300ns。如果你的CLKDIV或HSPCLKDIV不是1分频计算时要先算出实际TBCLK。2.2 电流采集为什么要放下桥如何采得准FOC电流采样最常见的方案是低端采样也就是在逆变器下桥臂MOS管源极和地之间串采样电阻三相各放一个电流流过采样电阻产生压降经运放放大后送到28335的ADC。为什么放下桥而不放上桥因为下桥采样电阻一端接地共模电压低运放电路简单可靠而且在下桥导通期间绕组电流会流过采样电阻只要在下桥导通的窗口中采样就能准确还原相电流。上桥采样需要处理很高的共模电压隔离和放大的成本高很多。但“放下桥”也带来一个采样时刻的问题。MOS管开关瞬间会有很高的dv/dt会在采样电阻上耦合出尖峰噪声所以不能在开关沿附近采样。正确做法是用ePWM的SOC触发ADC把采样点放在PWM载波的波峰或波谷处此时各相占空比相对稳定且最好避开死区时间因为死区期间下桥续流状态不确定采到的电流不可信。28335的ADC支持事件触发配置SOCA由CTRPRD或CTRZERO触发即可。实际项目中采样点还要考虑ADC采样保持时间和转换时间保证在中断处理FOC算法时拿到的电流值对应的是本周期中点的电流。还有一个工程细节双电阻采样方案里某相占空比接近0%或100%时下桥导通时间太短采样电阻上的信号还没稳定就关了采样值会失真甚至完全采不到。处理办法有几种一是把PWM限制在5%到95%范围内会牺牲一点母线利用率二是用移相法把采样窗口错开三是在那些边界扇区改用三电阻采样补偿。28335的ePWM支持相位偏移可以实现移相方案但代码复杂度会上去。初学者建议先用限幅方式把系统跑通后面再优化。3. FOC算法核心Clarke变换与dq轴电流的控制逻辑3.1 Clarke变换为什么只用两相电流选哪两相有讲究吗FOC的第一步是电流采样然后做Clarke变换把三相静止坐标系下的电流变换到两相静止坐标系。很多初学者看到公式里只用了i_a和i_b就会问第三相电流不需要吗答案是确实不需要因为电机三相绕组通常是星形连接且中性点不引出根据基尔霍夫电流定律i_c -i_a - i_b知道任意两相第三相自然就算出来了。这也就是为什么工程上常采用“双电阻下桥采样”方案两个采样电阻加上一个KCL计算就能得到三相电流。那采哪两相有要求吗理论上是任取两相只要不是同一相就行。工程习惯采A相和B相或者A相和C相取决于采样电阻布局和ADC通道分配。但要特别留意采样时刻的一致性两相电流必须是同一时刻的值。如果两个ADC通道是顺序采样时间上有一点错开对于低频电流影响不大在电流频率较高或者电流环带宽较高时会引入相位误差。28335的ADC可以配置同步采样模式或者在中断里计算补偿实际做的时候要先确认采样对齐。Clarke变换还有一个系数问题常见的是2/3系数等幅变换和sqrt(2/3)等功率变换。FOC算法中用的系数必须与反Park变换、SVPWM的幅值基准一致否则电流环跑出来会有增益误差。我的习惯是统一采用等幅变换因为SVPWM的输出电压基准是母线电压的一半等幅变换下计算更直观。3.2 Iq是怎么产生磁场的弱磁控制又是什么Clarke变换之后是Park变换用转子的电角度把静止坐标系下的电流旋转到转子dq坐标系。dq坐标系里d轴和转子永磁体磁场方向对齐q轴与磁场方向正交。变换后i_d是励磁分量i_q是转矩分量。永磁同步电机的电磁转矩公式可以简化为T_e 1.5p[ψ_f i_q (L_d - L_q)i_d i_q]其中ψ_f是永磁体磁链p是极对数。可以看出转矩主要由i_q和永磁体磁链相互作用产生i_q对应的电枢反应磁场始终与转子磁场保持90度电角度这就是FOC的核心——把定子电流解耦成“励磁”和“转矩”两个分量后就能像控制直流电机那样用调节i_q来控制转矩。i_d在表贴式永磁电机里通常控制为0因为L_d与L_q接近i_d对转矩贡献很小反而会增加铜耗。但在内埋式永磁电机或者需要高速运行时i_d就有大用了这就是弱磁控制。转速升高后电机反电动势接近母线电压SVPWM可输出的电压幅值到达了极限此时再想提高转速就需要给i_d一个负值产生去磁作用降低气隙磁链从而在电压受限的条件下提高转速范围。在28335上实现弱磁常见做法是在电压环外面加一个PI调节器把SVPWM所需电压幅值作为反馈限制在线性区以内比如母线电压Vdc的1/√3倍PI输出作为i_d的负向给定。调弱磁参数时要特别小心负i_d会让电机永磁体面临去磁风险不能为了追求极限转速一味加大负Id要查器件的退磁曲线。28335的浮点算力跑这套逻辑绰绰有余不会给CPU造成负担。4. 无感FOC的启动与堵转处理4.1 转子初始位置检测启动前必须解决的事FOC的Park变换依赖转子角度如果初始角度不对上电启动时可能把电机往错误的方向拉甚至产生过流。有编码器时可以直接读角度但无感FOC没有位置传感器启动前必须想办法确定转子初始位置。简单粗暴的方法是预定位给一个固定的电压矢量比如把转子拉到某个已知的d轴方向等待几百毫秒让机械振荡衰减然后把当前角度记录为参考零点。这个方法实现简单适合风机、水泵这类允许启动前轻微转动的负载但不适合不允许反转、带重载的设备。如果要求转子不能动就需要用高频注入法在估计的d轴方向叠加高频正弦电压通过检测高频电流响应来判断转子磁极位置。原理是利用永磁电机的凸极效应或磁路饱和差异转子位置不同高频电流的幅值和相位会不一样。28335跑高频注入完全没有性能压力难点在信号处理需要数字滤波器提取高频分量再通过锁相环或反正切运算解算角度。做起来比预定位复杂但在零速和低速场合可靠性高很多。还有一种折中方案是初始段用开环强拉把转子“拖”到同步后再切换闭环观测器但启动过程粗暴负载稍重就容易失步我只在简单验证时这么干。4.2 堵转检测思路与保护策略无感FOC最头疼的异常工况之一是堵转。电机不转时反电动势为零速度观测器估算出来的转速会掉到接近零如果此时控制环还在输出大电流绕组和功率管会迅速过热。堵转检测的基本逻辑就是组合判断连续若干控制周期内估算转速都低于某个阈值同时转矩电流i_q或者电流矢量的模长时间超过设定值就判定为堵转。只判断电流而不判断时间也不行电机正常启动或大惯量负载加速时电流也可能很大所以时间窗和滞环必须加进去。保护动作要分级。第一级先限制电流给定把电流指令削到安全值以下防止过热如果“堵转”信号持续几百毫秒到一秒再执行停机封锁PWM输出并记录故障标志。停机后重新启动时需要重新做一次转子初始位置检测因为堵转期间转子位置可能已经变化了。还有一个容易忽略的点有些负载比如压缩机启动时转子在抖振估算转速可能短暂为负这不一定是真的堵转检测逻辑里要区分正反向堵转并留出合理的判定窗口。另外有人问FOC电调会不会开同步整流。同步整流常见于BLDC方波驱动用来替代体二极管续流降低损耗FOC是正弦驱动PWM本身就是连续的同步调制续流路径一般直接利用MOS管体二极管或并联的快恢复二极管工程上很少单独做“同步整流”这个动作。如果你关注的是轻载效率方向应该放在优化SVPWM死区和调制方式上而不是套用方波驱动的思路。5. 三环频率选配与常见问题排查5.1 三环频率怎么选三环频率的选取直接影响系统稳定性。电流环必须跑得最快它和PWM频率绑定10kHz到20kHz都很常见。选20kHz还有个好处是超出了人耳可听范围电机噪音明显降低。速度环频率放1kHz到2kHz也就是每10个或20个电流环周期执行一次速度环计算。位置环再低一档一般500Hz以下就行。这样分层的原因很简单内环带宽必须远高于外环否则外环给一个突变指令内环跟不上整个系统就会出现相位滞后和振荡。调试顺序上我始终坚持从内向外。先把电流环单独跑起来给一个固定的i_q给定用示波器看相电流幅值和相位是否和给定一致确认电流环PI参数稳定。然后闭合速度环最后才加位置环。如果一上来就三板斧全调出了问题根本分不清是哪一环出的。5.2 常见问题速查表现象可能原因排查思路上电后母线过流MOS管发烫死区时间过短上下桥直通示波器测上下管栅极波形检查死区配置DBFED/DBRED加大相电流波形畸变、毛刺大采样时刻靠近开关沿采到了噪声用ePWM同步触发ADC把采样点移到载波中点避开死区电流读数有一个固定偏置运放零点漂移上电且电机静止时采样N次取平均作为零点偏移量在软件里扣除电机启动“咯咯”响或反转转子初始角度不准暂停输出做预定位或改用高频注入法检测初始位置高速段转速上不去转矩掉得厉害到达电压极限在电流环外增加弱磁PI调节器输出负i_d给定空载正常带负载容易报堵转堵转判定时间窗太短延长确认时间加入滞环区分堵转和大惯量启动遇到模糊问题时我的习惯是先在代码里加一个状态变量用28335的DAC模块或者空闲IO输出到示波器把转速估算值、i_q给定、堵转标志这些关键量实时导出来看。FOC的问题往往不是单独一个环节的错误而是多个条件叠加造成的能可视化调参会快很多。最后分享一个我在28335上调FOC养成的小习惯永远从低压小电流开始验证。第一次上电时母线电压限制在安全范围电流限幅设得很保守再逐步放宽。确认SVPWM波形正常、电流采样零点校准OK、驱动板不炸管之后再接编码器闭环跑电流环最后才切到无感。很多人觉得这一步一步来太慢但实际踩过几次坑之后你会发现慢才是快。本文还有配套的精品资源点击获取
返回列表