最近在调一套小功率直流电机调速平台带霍尔编码器功率级是MOS管H桥单片机做速度闭环。硬件结构不复杂真正费神的是速度环PID参数整定尤其要在空载、带载、正反转切换几个工况下都稳住。从大学课程到工作项目PID控制我接触过很多次但每换一套平台重新调参总还是要踩一轮新坑。这篇文章就把我在直流电机调速平台上做PID参数整定的过程和心得写下来重点讲教科书里不常提、但现场调试非常关键的细节给正在做电机转速闭环控制的朋友一些参考。1. 调试前的准备反馈、执行器和观测手段很多人一听说“调PID”第一反应就是把Kp、Ki、Kd三个系数改一改看电机转得稳不稳。我在这个思路上吃过亏参数改了半下午曲线还是不对最后发现编码器读数在低速段根本没法用。所以正式整定参数之前先把反馈、执行器、观测这三件事处理好后面才能少做无用功。1.1 速度反馈的选择与测速方式直流测速发电机和增量式编码器我都用过。测速发电机输出模拟电压接线简单但低速时纹波和温漂都比较明显编码器配合单片机定时器测频数字量抗干扰更好现在大多数项目都用编码器方案我也按这个来。速度反馈的换算有一个很容易被忽略的坑低速段的测速精度不足。增量式编码器本质上输出脉冲常用测速方式分M法、T法和M/T法。M法固定采样周期内统计脉冲个数速度越高测越准速度越低脉冲越少、误差越大T法测量相邻两个脉冲的时间间隔速度越低测量时间越长、精度越高但速度很高时脉冲间隔太短定时器容易溢出M/T法两者结合测速范围宽但程序复杂度也高一些。我一开始用M法速度环周期1ms额定转速10%时一个周期平均只有3到4个脉冲反馈值跳来跳去电机在低速段发出不规则的“咔咔”声。表面上看像电流噪声实际是速度反馈噪声被PID放大、积分项反复动作造成的。后来在最低工作转速段改用T法低速稳定性提升明显。注意改测速方式会改变反馈环路的滞后特性整定前先把测速逻辑定好中途不要换来换去。另外上电前一定要手盘一下电机轴感受有没有卡滞、联轴器有没有松动、齿轮有没有明显虚位。反馈链路上的机械间隙会造成周期性速度波动这种波动混进信号里PID会当成真实误差去补偿最后表现为电流异常波动和噪音。机械问题不排查清楚参数整定做得再细致也白搭。1.2 功率驱动与PWM频率直流电机电枢电阻很小启动瞬间电流可能比额定电流大很多。功率驱动常用PWM调压有两个参数需要和主控程序匹配PWM频率和PWM分辨率。PWM频率的选择可以结合电机的电气时间常数来估计。电气时间常数一般在零点几毫秒到几毫秒之间PWM频率太低电流纹波变大电机啸叫明显电流采样也容易失真PWM频率太高驱动管的开关损耗增加驱动板发热明显。我在这个平台起步用10kHz实际听声音尚可后来对比4kHz、8kHz和10kHz下的电流波形最终选了8kHz。没有绝对合适的频率调试时最好实际对比几组再决定。PWM分辨率会影响输出精度尤其当输出量很小或误差很小时分辨率不足会造成低速爬行这一点在静摩擦补偿时还要重点考虑。驱动侧的保护也要提前做好母线欠压保护、过流保护、温度保护。这些和PID关系不大但没做好的话调试中容易烧驱动管打乱节奏。1.3 调试时使用的观测工具最怕的调试状态是“看不到过程曲线只凭感觉猜”。我建议至少同时观测两个量速度反馈值和PID输出值也就是占空比指令。只看速度曲线时很难判断震荡是参数引起的还是执行器饱和引起的加上输出曲线后很多问题一眼就能分辨。操作上并不复杂在速度环中断里定时记录这两个量时间戳对齐存到环形缓冲区再通过串口发给上位机画曲线。没有专门上位机时串口助手自带的绘图功能也能用但要注意把刷新周期配好避免曲线严重滞后。看曲线时重点观察几件事阶跃响应的超调量、上升时间、调节时间是否存在高频抖动是否出现持续极限环以及占空比是否经常顶到限幅值。排查顺序一般先查反馈再查执行器最后才是PID参数。2. 临界比例度法整定从等幅震荡到可用参数拿到新平台我习惯先用临界比例度法取一组初始参数再在初始值基础上微调。这个方法工程上很成熟结果可复现特别适合没有精确数学模型的对象。2.1 临界比例度法实验步骤临界比例度法的步骤不复杂让电机空载运行给定一个较低速度比如额定转速的10%到20%关闭积分项和微分项只保留比例控制Kp从小往大加每次改变Kp后等系统稳定一段时间观察速度反馈曲线当速度曲线出现等幅震荡时记下临界比例增益Ku和震荡周期Tu。实际操作中有两点提醒。一是“等幅震荡”不是理想的等幅正弦受编码器噪声和负载波动影响曲线上会有毛刺判断时以主频是否稳定、振幅是否基本不变为准。二是临界震荡时电机会发出周期性“嗡嗡”声这是正常的但实验要在安全速度范围内做别在高转速下做否则电流冲击很大。逼近临界点的过程中只要曲线出现持续振荡就要立即把Kp撤回一部分而不是继续加。小功率电机做临界震荡时驱动板电流冲击不算小做得太猛可能触发保护。2.2 整定公式与实际系统的匹配经典的Ziegler-Nichols经验公式给出了一组常用参考值控制器类型KpTiTdP0.5×Ku——PI0.45×Ku0.85×Tu—PID0.6×Ku0.5×Tu0.125×Tu直接套这套公式在直流电机速度环上通常显得太激进。原因有两点一是小功率直流电机机械时间常数短、执行器响应快系统对超调容忍度低二是Ziegler-Nichols法本身偏向扰动抑制场景设计而速度环更关心阶跃跟随的平稳性。我的工程修正做法是Kp取0.4~0.5Ku比公式里的0.5~0.6更保守Ti取1.5~2.0Tu比公式里的0.5~0.85Tu放得更宽Td先不加等PI调稳后如果还想压超调再加0.08Tu以下的小值。修正后的参数不一定最优但通常能落在稳定区不会一上来就振荡。还有一个容易被忽略的点Ku在整个速度范围内并不是恒定值。电机反电动势、摩擦力矩随转速变化系统严格说不是线性定常系统。所以临界震荡实验要在常用工作点附近做。如果调速范围很宽我会在低速、中速、高速各做一组测试取中间偏保守的一组。实际运行中再考虑用前馈或分段增益补偿偏差。2.3 参数的单位统一和归一化速度环程序里给定值和反馈量的单位必须统一。如果给定用r/min反馈也用r/min输出是0到100%的占空比那Kp的物理含义就是“每产生1r/min误差控制器输出多少百分之占空比”。如果给定改用mm/sKp的数值就完全变样了。我在代码里把所有速度统一换算成内部物理单位调试笔记里也记录物理单位下的参数方便理解和复现。为了让参数在相似电机平台之间更有参考性我会把输出归一化到额定PWM百分比速度误差归一化到额定转速。比如Kp0.8意思是“20%额定转速误差产生16%的额定占空比输出”。这种归一化参数在不同功率等级的电机上有一定迁移价值。这里的陷阱在于如果程序里给定速度用了一个缩放的数值比如把最高转速映射成4096那Kp的量纲就从“%/r/min”变成了“/量化值”。换到另一台平台时直接抄参数就会出错。调试记录里必须写明单位换算关系否则过两个月自己都会看糊涂。2.4 手工微调的先后顺序临界比例度法只能给出大致范围最后肯定要手工微调。我的调整顺序很固定先Kp再Ki最后Kd。第一步保持Ki和Kd为0慢慢加Kp让系统在不振荡的前提下响应够快第二步加入Ki一点点增加积分强度重点观察稳态误差和低频蠕动如果出现慢速来回走的趋势就是Ki偏大第三步Kd只在超调量明显偏大时使用先给一个小值观察高频噪声是否被放大。每次只改一个参数改完等系统稳定几个调节周期再看曲线。一次性改两个参数出了问题根本分不清是谁引起的。我习惯把每次修改的参数、对应曲线形态、超调量和调节时间都记在表格里攒过几十组记录以后再遇到类似电机就能直接写出初始参数。3. 积分项和微分项的取舍这一节说说实际平台里最常踩的两个坑积分饱和和微分噪声。3.1 积分作用与抗积分饱和积分项能消除稳态误差但代价是容易超调阶跃启动时尤其明显。阶跃启动瞬间误差非常大积分项不断累积。等误差回到正常范围时积分项已经把输出推到限幅值。输出顶着上限运行系统近似开环PID参数此时基本不起作用。等到误差进一步缩小积分项慢慢释放速度才回落结果就是一个明显的超调尖峰。我用了三重处理积分分离误差绝对值较大时停止积分累积积分限幅积分项的绝对值限制在一定范围内输出饱和时冻结积分控制器输出达到执行机构限幅时不再累加积分避免压着上限还继续积攒控制量。示意代码如下C风格static float integral, output; float pid_speed_loop(float setpoint, float feedback, float dt) { float error setpoint - feedback; if (fabsf(error) SEPARATION_THRESHOLD) { integral 0.0f; } else { integral KI * error * dt; } integral clamp_f(integral, -INTEGRAL_LIMIT, INTEGRAL_LIMIT); output KP * error integral; output clamp_f(output, -CONTROL_LIMIT, CONTROL_LIMIT); /* 输出饱和时撤销本次积分累加避免积分继续增大 */ if (output CONTROL_LIMIT || output -CONTROL_LIMIT) { integral - KI * error * dt; } return output; }积分分离的阈值要合适。阈值太小误差稍微超一点就停止积分伺服刚度不够阈值太大等于没做分离。我通常取额定转速的20%到30%作为阈值范围再根据实际效果微调。3.2 微分项的滤波与噪声微分项能预判误差变化趋势对抑制超调有帮助但它会放大高频噪声。速度反馈来自编码器本质上存在量化噪声如果直接把误差的差分项加进输出占空比指令会出现大量毛刺电流波形变差严重时电机噪声明显增大。低速、低分辨率编码器平台上我倾向于干脆不用D只做PI控制。PI调速在大多数直流电机场景已经够用。确实需要用D来压超调时要对微分项单独加低通滤波或者使用不完全微分PID。不完全微分的思想是把微分项当成一阶惯性环节处理而不是简单的差分避免误差突变时微分输出跳变也避免高频噪声放大。低通滤波截止频率可以按电机机械带宽的3到5倍取。举个例子某平台电机从0加速到额定转速的时间常数约0.2s机械带宽推算下来大约5到8rad/s微分滤波截止频率取20到40rad/s量级折合普通频率约3到6Hz。这只是估算最终以输出毛刺不显著增加为准。还有一个心得Kd在数值上不要和Kp太接近。Kd取太大时哪怕做了滤波也容易把反馈噪声重新放大出来。我一般让Kd取Kp的几十分之一到几百分之一宁可超调稍大一点也不让输出抖动。4. 两个容易被忽略的坑反馈滞后和死区调参过程中最花时间的往往不是调三个数而是排查两个不太起眼的问题反馈链路滞后和机械死区。4.1 反馈滞后假震荡与限幅为了让速度曲线看起来光滑很多人喜欢对编码器速度做滑动平均滤波。我也干过把滤波窗口取到十几毫秒曲线确实漂亮但控制效果反而更差。原因是滑动平均滤波引入相位滞后控制器看到的误差比真实状态晚了几拍。转速已经过冲了控制器还在朝过冲方向加力等反馈更新后再反向操作一来一回就形成低频大幅震荡。这种震荡和Kp过大引起的振荡不一样。Kp过大时震荡频率通常比较高接近系统稳定边界反馈滞后引起的震荡频率偏低且输出占空比很容易顶到限幅值。排查时可以先做简单实验给一个阶跃指令观察输出曲线和速度曲线的相位关系如果输出变化明显滞后于速度变化就优先查滤波深度和采样周期。我在一个平台上就遇到过空载阶跃响应有规律地来回震荡速度曲线顶部还带毛刺。当时直觉以为是Kp太大把Kp降了一倍现象依旧。后来把滤波窗口从20ms改到5ms问题马上缓解。所以排查问题要先看反馈链路动态再看执行器最后才动PID参数。4.2 死区与最小占空比第二个坑来自机械静摩擦。电机从静止启动时PWM占空比小到一定程度根本转不动。误差一直存在积分项不断累积等占空比终于突破静摩擦阈值电机猛地转起来速度冲到给定值上方。这种“启动迟钝、到位过冲”的现象在很多小功率平台上都存在本质上不是PID参数问题而是非线性摩擦导致的极限环。常用的对策有两个输出叠加一个最小占空比让驱动力矩始终大于静摩擦所需力矩让电机平稳起步在速度误差小于额定转速0.5%到1%时加入很小死区避免积分反复纠偏。最小占空比不能加太大否则停止指令下电机停不下来。可以从很小的速度阶跃开始测试逐步加大补偿值直到电机能平顺起步且不明显过冲以这个值作为最小补偿输出。死区同样不能取得太大。一开始图省事把死区设到额定转速的2%低速跟随时能明显感觉到“一顿一顿”。后来缩到0.5%左右才在平稳性和跟随精度之间找到平衡。死区相当于人为制造了一个不敏感区换向和变速时会产生可感知的阶跃感设置必须克制。5. 带负载调试验收与个人习惯空载调好的参数带负载后不一定好用这是很多人容易忽视的最后一步。5.1 空载和带载的差异空载时电机惯量和阻力矩都小速度响应很容易调快。但带上负载后系统阻尼、惯量、摩擦力都变了继续用空载参数可能出现响应变慢、稳态误差变大甚至超调量增加的情况。我一般分两个阶段调试。空载阶段只做到“基本稳定有一点超调但能收敛”不死磕超调量。然后给电机接上一定负载比如用简易摩擦制动器模拟额定负载再观察阶跃响应针对带载工况微调Kp和Ki。带载后可以适当加强积分作用来压制稳态误差但Kp不宜大幅度加大否则容易重新引起振荡。如果带载后出现周期性速度波动优先检查负载侧有没有周期性力矩扰动比如联轴器不对中、齿轮磨损、负载本身存在固有波动。这类扰动不完全靠PID能压住先把机械源找到再谈调参。5.2 速度前馈的作用很多场合会忽略速度前馈的价值。前馈的基本思路是根据目标速度估计一个期望的静态占空比直接加到控制器输出上反馈PID只负责修正偏差和抑制扰动。我常用一种简单的估算方法空载下测量几个速度点对应的稳态占空比做成一张小表运行时按目标速度查表或线性插值把结果作为前馈量。带载后负载力矩会让前馈偏小剩余偏差由积分项补足。有了前馈积分压力大幅减小带载启动和变速跟随的动态效果改善明显而且前馈不改变闭环极点对稳定性基本没有负面影响。如果是高精度场合前馈系数还可以根据负载动态调整不过大多数直流电机调速场景固定前馈加PI修正已经够用。5.3 验收指标与参数记录接近尾声时我会做一轮完整测试项目大致如下测试项方法期望参考阶跃超调空载阶跃响应不大于5%稳态误差额定负载持续运行不大于1%调节时间空载阶跃0.2到0.5s量级抗扰能力突加、突卸负载波动幅度与恢复时间可控正反转切换反向阶跃无明显等幅振荡这个表只是参考不同应用要求差别很大。高精度定位平台对超调要求高风机泵类反而允许一点超调来换取更快响应参数要跟着应用走。最后说一个坚持多年的习惯每次调试完把电机型号、编码器分辨率、PWM频率、速度环周期、整定方式、最终参数、实测波形数据连同测试时间一起记进项目笔记。两三个月后需求变化回来翻这段记录能把调试时间从半天压缩到半小时。PID参数整定这件事做多了就会发现没有唯一正确的参数只有适合当前工况的参数。把自己平台的特性摸清楚比背再多公式都管用。