ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

FOC串级PID三环设计:电流环、速度环、位置环参数整定与STM32实战

FOC串级PID三环设计:电流环、速度环、位置环参数整定与STM32实战 1. 从“转不起来”到“丝滑跟手”串级PID到底解决了什么问题搞电机控制的朋友大概率都经历过这个阶段电流环调得还行速度环一加上去就开始啸叫位置环再一叠整个系统直接发散。示波器上PWM波形看着挺正常但电机就是抖、就是响、就是跟不上给定。这时候你去翻资料十篇有八篇告诉你“要用串级PID”但很少有人把为什么非得串起来、每一环到底在管什么、参数怎么一步步往下压讲清楚。FOCField-Oriented Control磁场定向控制的核心思想是把三相交流电机的定子电流通过Clarke变换和Park变换解耦成两个直流量一个管磁场d轴一个管转矩q轴。解耦之后交流电机在控制层面就变成了“直流电机”——你可以像调有刷电机那样去调它。但问题在于解耦只是第一步真正让电机“听话”的是外面套的那几层控制环。串级PID就是这套环的骨架。这篇文章面向的是已经能跑通FOC基础代码、但卡在调参和系统稳定性上的开发者。我会从串级结构的设计逻辑讲起拆解每一环的职责边界、带宽分配原则、参数整定顺序再落到STM32上的实际代码框架和调试手段。不堆公式但该有的计算过程会给不抄手册但踩过的坑会一个不落地列出来。读完你至少能做到拿到一个PMSM或BLDC知道先调哪环、后调哪环、每环大概给多少带宽、出了问题往哪个方向排查。2. 串级PID的结构设计为什么不能一个PID打天下2.1 单环PID在FOC场景下的三个硬伤很多人一开始会想我直接拿一个PID输入是目标转速输出是q轴电压中间电流什么的不管了行不行短期看能转长期看全是问题。第一个硬伤是非线性耦合。电机的反电动势和转速成正比母线电压固定时转速越高留给电流调节的电压裕量越小。单环PID不知道当前电流是多少它只能看到“转速没跟上”于是拼命加电压结果电流瞬间冲高触发过流保护。你以为是PID参数不对其实是结构缺了一层。第二个硬伤是响应速度与稳定性的矛盾。速度环需要一定的积分时间来平滑噪声但电流环必须快。如果合成一个环积分时间取大了电流响应慢转矩脉动大取小了速度反馈里的编码器噪声直接被放大电机啸叫。两个时间尺度差了一个数量级硬塞进一个PID里调参就是拆东墙补西墙。第三个硬伤是保护逻辑无处安放。FOC系统里过流、过压、欠压、堵转这些保护最合理的切入点是电流环。电流环每PWM周期都在跑能第一时间限幅。单环结构下等你从转速偏差里算出异常电流可能已经烧了MOS管。2.2 三环串级的职责划分与信号流向串级PID的标准结构是位置环→速度环→电流环由外向内逐级嵌套。每一环的输出是下一环的输入给定值最内环的输出直接作用于被控对象。具体到FOC位置环输入是目标位置比如编码器脉冲数或弧度反馈是实际位置。输出是速度给定。这一环的频率最低通常1kHz以下因为机械位置的变化本身就慢。速度环输入是位置环输出的速度给定反馈是实际转速由编码器差分或霍尔计算。输出是q轴电流给定。频率通常在1kHz到5kHz。电流环输入是速度环输出的Iq给定和Id给定Id通常给0弱磁时给负值反馈是采样电阻或霍尔电流传感器测到的Ia、Ib、Ic经过Clarke/Park变换后的Id、Iq实际值。输出是Vd、Vq再经过反Park变换和SVPWM调制。频率等于PWM频率通常10kHz到20kHz。信号从外向内传递反馈从内向外传递。每一环都有自己的PID控制器但只有最内环的输出直接驱动执行器外环的输出只是内环的“目标”。2.3 带宽分离原则为什么内环必须比外环快5到10倍这是串级PID最核心的设计约束。假设电流环的闭环带宽是1kHz速度环的带宽最多给到100Hz到200Hz。如果速度环带宽接近电流环两个环的动态会互相干扰表现为阶跃响应上叠加振荡或者频域上出现双峰。背后的道理可以用一个生活类比你用手去接一个下落的小球。眼睛看到球的位置位置环大脑决定手移动的速度速度环肌肉执行收缩电流环。如果肌肉反应速度和大脑决策速度差不多你的手就会抖——大脑说“快到了”肌肉还没执行完上一个指令新指令又来了结果就是过冲和振荡。工程上的经验值是5到10倍。电流环10kHz时速度环给1kHz到2kHz速度环1kHz时位置环给100Hz到200Hz。这个比例不是拍脑袋它保证了外环在调整时内环已经“跟上”了外环看到的近似是一个理想的比例环节不会因为内环的延迟而产生额外相移。注意带宽分离不是绝对的。有些高性能伺服会把速度环做到电流环的1/3但那是建立在电流环带宽极高比如5kHz以上且机械刚度很好的前提下。普通工业电机老老实实按5到10倍来。3. 每一环的PID到底在调什么从电流环到位置环的逐级拆解3.1 电流环FOC的“肌肉”响应最快也最敏感电流环是FOC里唯一直接和硬件打交道的环。它的输入是Iq和Id的给定值输出是Vq和Vd。因为电机绕组是感性负载电流不能突变所以电流环本质上是在控制电压来间接控制电流。为什么电流环通常只用PI不用PID因为电机绕组的传递函数近似是一阶惯性环节电阻电感一阶系统用PI就能做到无静差。加D项反而会放大电流采样噪声因为电流采样在每个PWM周期中点触发噪声本来就大微分一放大Vq输出全是毛刺。参数整定的经典方法把电流环开环传递函数写成G(s) Kp * (1 1/(Ti*s)) * 1/(R L*s)。用零极点对消法让PI的零点抵消电机的极点即Ti L/R。然后根据想要的闭环带宽ωc取Kp ωc * L。比如电机电感L1mH电阻R0.5Ω想要1kHz带宽则Ti 0.001/0.5 2msKp 2π*1000*0.001 ≈ 6.28。实际调的时候先给一个很小的Kp慢慢加直到电流阶跃响应刚好没有过冲。然后加Ki消除稳态误差。注意Ki不能太大否则低频增益过高容易和速度环耦合振荡。实操心得电流环的采样时机非常关键。STM32的ADC要在PWM中心对齐模式下在计数器等于周期值时触发这样采到的才是绕组电流的平均值而不是开关噪声。如果采样点偏了电流波形上会有尖刺PID再调也没用。3.2 速度环系统的“腰”承上启下最容易出问题速度环的输入是速度给定反馈是实际转速。输出是Iq给定。它的被控对象是“电流环电机机械惯量”可以近似成一个积分环节加一个小惯性环节。速度环的PI参数怎么给一个实用的起点是Kp取电流环Kp的1/10到1/5Ki取Kp的1/100到1/50。比如电流环Kp6.28速度环Kp可以先给0.6到1.2Ki给0.01到0.02。然后看阶跃响应如果转速上冲超过10%减小Kp如果稳态有静差加Ki如果低频振荡减Ki。速度反馈的滤波编码器差分算速度低速时脉冲少速度值跳变厉害。通常要加一个一阶低通滤波器截止频率取速度环带宽的2到5倍。比如速度环带宽100Hz滤波器截止频率给200到500Hz。滤波太狠相位滞后大速度环稳定性下降滤波太弱噪声进PID电机啸叫。为什么速度环的输出要限幅因为速度环输出的是Iq给定而Iq对应转矩转矩受限于电机额定电流和驱动器最大电流。如果不限幅位置环或速度环在误差大时会输出一个巨大的Iq给定电流环直接饱和电机瞬间过流。限幅值一般取电机额定电流的1.5到2倍留一点动态余量。3.3 位置环最外层的“指挥官”精度和稳定性的平衡点位置环的输入是目标位置反馈是实际位置。输出是速度给定。它的被控对象是“速度环机械传动”近似一个积分环节。位置环通常只用P控制。因为位置环的输出是速度给定如果加I积分累积会导致速度给定持续增大电机冲过头再回来形成低频振荡。加D更危险位置反馈的量化噪声被微分后变成速度给定的剧烈跳变电机一顿一顿的。P参数怎么定位置环的带宽通常取速度环的1/5到1/10。如果速度环带宽100Hz位置环给10到20Hz。P值可以用Kp_pos ω_pos来估算其中ω_pos是位置环期望带宽rad/s。比如想要20Hz带宽Kp_pos 2π*20 ≈ 125。实际调的时候给一个小的P慢慢加直到位置阶跃响应刚好没有过冲。位置环的“前馈”技巧纯P位置环在跟踪斜坡给定匀速运动时会有稳态误差。加一个速度前馈——把目标速度直接加到速度给定上——可以消除这个误差。前馈系数取1时理论上完全补偿。实际取0.8到1.0之间留一点余量防止过冲。注意位置环的反馈如果是增量式编码器上电后需要找Z相信号确定绝对位置。如果是绝对值编码器直接读就行。这个“找零”过程如果没做好位置环的给定和反馈不在一个坐标系里一上电电机就飞车。4. 从零搭建串级PIDSTM32上的实操流程与参数整定4.1 代码框架三个环怎么在中断里排布在STM32上跑FOC通常用两个中断一个高频PWM中断比如20kHz跑电流环和SVPWM一个低频定时器中断比如1kHz跑速度环和位置环。// 高频中断20kHz电流环 void TIM1_UP_IRQHandler(void) { // 1. 读ADC获取Ia, Ib, Ic // 2. Clarke变换Park变换得到Id, Iq // 3. 电流环PID计算输出Vd, Vq // 4. 反Park变换SVPWM调制 // 5. 更新PWM占空比 } // 低频中断1kHz速度环和位置环 void TIM2_IRQHandler(void) { // 1. 读编码器计算转速和位置 // 2. 位置环PID计算输出速度给定 // 3. 速度环PID计算输出Iq给定 // 4. 把Iq给定传给电流环全局变量 }关键点速度环的输出Iq给定在传给电流环之前要做一个“斜坡限幅”——不能让它从0直接跳到10A而是以一定斜率上升。这个斜率通常取电机额定电流的10到20倍每秒。比如额定5A斜率给50到100A/s。这样电流环不会因为给定突变而饱和。4.2 参数整定顺序先内后外先P后I整定顺序绝对不能乱。必须先把电流环调好再调速度环最后调位置环。每一环调的时候外环断开只跑内环。电流环整定步骤给Id给定0Iq给定一个小的阶跃比如0.5A观察Iq实际值的阶跃响应。Kp从0开始加每次加20%直到响应刚好没有过冲。记录此时的Kp。加Ki从Kp/100开始每次加50%直到稳态误差在100ms内消除。如果响应有高频振荡减小Kp如果低频振荡减小Ki。速度环整定步骤电流环保持整定好的参数速度环输出限幅设为额定电流。给速度给定一个阶跃比如从0到500rpm观察转速响应。Kp从电流环Kp的1/20开始加直到转速响应刚好没有过冲。加Ki从Kp/100开始直到稳态转速误差消除。如果转速有低频摆动减小Ki如果响应慢加Kp。位置环整定步骤速度环保持整定好的参数位置环输出限幅设为额定转速。给位置给定一个阶跃比如从0到90度观察位置响应。P从1开始加直到位置响应刚好没有过冲。如果位置有低频振荡减小P如果响应慢加P。加前馈观察斜坡跟踪误差是否减小。4.3 调试工具串口示波器和上位机怎么用调PID最忌讳“盲调”。必须能看到波形。最土但最有效的办法是串口示波器在中断里把关键变量Iq给定、Iq实际、转速给定、转速实际、位置给定、位置实际打包成二进制或文本通过串口发到上位机。STM32上可以用DMAUART把数据放到一个缓冲区DMA自动发送不占用CPU。上位机用Python的matplotlib或者现成的串口示波器软件实时显示波形。采样率要匹配电流环波形用20kHz采样速度环用1kHz位置环用100Hz。如果串口带宽不够可以降采样——每10个电流环周期发一次数据。触发方式最好能设置触发条件比如“Iq给定从0跳到1A时开始记录”这样每次阶跃响应的波形能对齐方便对比不同参数的效果。提示调试时先把电机空载再带载。空载调好的参数带载后可能需要微调。带载时惯量变大速度环Kp可以适当加大Ki适当减小。5. 常见问题与排查技巧实录5.1 电机啸叫、抖动、发热的排查思路现象可能原因排查方法解决措施高频啸叫电流环Kp过大或Ki过大观察Iq波形是否有高频振荡减小Kp或Ki检查电流采样时机低频抖动速度环Ki过大或速度反馈滤波不足观察转速波形是否有低频摆动减小Ki加强速度反馈滤波电机发热严重电流环稳态误差大Id不为0观察Id实际值是否偏离0检查电流采样校准调整Ki启动时过流速度环输出限幅过大或斜坡太陡观察启动瞬间Iq给定减小限幅放缓斜坡位置环振荡位置环P过大或速度前馈过强观察位置波形是否过冲后回摆减小P前馈系数降到0.85.2 电流采样噪声大导致PID输出毛刺这是FOC调试里最隐蔽的坑之一。电流采样电阻的走线如果太长或者没有用差分走线开关噪声会直接耦合到ADC输入。表现是Iq波形上叠加了和PWM同频的尖刺PID的D项如果用了会把这个尖刺放大Vq输出全是毛刺。解决办法采样电阻尽量靠近MOS管源极走线短且对称ADC输入加RC低通滤波截止频率取PWM频率的1/10到1/5在软件里做多次采样取平均比如每个PWM周期采4次去掉最大最小值再平均。5.3 速度反馈延迟导致外环振荡编码器差分算速度如果用的是M/T法低速时一个采样周期内脉冲数很少速度值量化误差大。如果直接把这个速度值喂给PID相当于在反馈通道里加了一个延迟环节。延迟大了速度环相位裕度下降就会振荡。解决办法低速时用T法测脉冲间隔高速时用M法测脉冲数中间做平滑切换或者用状态观测器估算速度比如龙伯格观测器把位置和电流作为输入输出估算速度和负载转矩。观测器的带宽取速度环带宽的5到10倍。5.4 位置环找零失败导致飞车增量式编码器上电后不知道绝对位置需要找Z信号。如果找零过程中电机被外力转动或者Z信号受到干扰找零位置就偏了。位置环的给定和反馈不在一个坐标系里一使能电机就朝一个方向猛冲。解决办法找零时给一个很小的电流让电机缓慢转动同时监测Z信号找到Z信号后把位置计数器清零再使能位置环找零过程中如果超时或电流异常立即报错停机。6. 进阶话题从串级PID到更高级的控制结构6.1 前馈补偿让跟踪误差再降一个数量级串级PID是反馈控制反馈控制的本质是“先有误差再消除误差”。对于已知的扰动或给定可以用前馈直接补偿不等误差出现就提前动作。速度环的速度前馈把位置环输出的速度给定乘以一个系数直接加到速度环的输出上。这样速度环的PID只需要处理模型不匹配和外部扰动负担大大减轻。电流环的反电动势前馈电机旋转时q轴电压里有一部分是反电动势和转速成正比。如果能在Vq输出上直接加上ω * ψfψf是永磁磁链电流环的PID就不需要为了克服反电动势而积累积分项动态响应更快。6.2 抗积分饱和限幅不是万能的串级PID里外环的输出是内环的给定。如果内环饱和了比如电流环达到最大电压外环的积分项会继续累积因为误差还在。等误差反向时积分项要花很长时间才能退出来导致响应迟钝。解决办法外环的积分项在检测到内环饱和时停止累积或者把内环的实际值反馈回来做“反计算”。STM32的PID库通常有抗饱和参数调的时候注意把积分限幅设成和输出限幅一致。6.3 无感FOC下的串级PID调整无感FOC没有编码器速度和位置靠滑模观测器或龙伯格观测器估算。观测器的带宽和串级PID的带宽要匹配观测器带宽太低速度反馈滞后速度环振荡观测器带宽太高噪声放大电流环受干扰。经验值是观测器带宽取速度环带宽的5到10倍和电流环带宽接近。调的时候先调观测器让估算速度和实际速度如果有编码器对比误差在5%以内再调速度环。注意无感FOC低速时观测器精度差速度环带宽要降低或者切换到IF启动模式等转速起来再切回闭环。7. 个人实操体会调参是科学也是手艺我调过不少电机从几十瓦的云台电机到几千瓦的伺服串级PID的框架没变过但每一环的参数每次都要重新摸。有几点体会特别深第一先保证硬件没问题再调软件。电流采样不准、编码器信号有毛刺、MOS管驱动有直通这些硬件问题会让PID怎么调都不对。我习惯先用示波器看三相电流波形正弦度好、没有尖刺再开始调环。第二阶跃响应是最好的老师。不要只看稳态要看动态。给一个阶跃看上升时间、过冲、调节时间、稳态误差。这四个指标能告诉你Kp、Ki是大了还是小了。第三带宽不是越高越好。很多人追求高带宽觉得响应快就是好。但带宽高了噪声放大、机械磨损、发热都上来了。够用就行留20%到30%的裕度。第四记录每一次调参的结果。我习惯用表格记下每次的Kp、Ki、带宽、阶跃响应指标。调多了会发现相似惯量的电机参数范围其实差不多下次可以直接从上次的值开始微调省很多时间。最后分享一个小技巧如果速度环怎么调都有低频摆动试试把速度反馈的滤波器截止频率降到速度环带宽的2倍同时把速度环Kp减小20%。很多时候摆动不是PID的问题是反馈噪声的问题。
返回列表