资讯动态

电机控制实验全记录:从开环到PID闭环的工程实战

发布时间:2026/10/21 6:57:18 来源:尧图企业网站定制
作为一个工科生电机控制实验几乎贯穿了我整个本科高年级阶段。说实话刚开始我对“电机控制”这四个字的理解非常幼稚以为就是给两根线通上电转子就乖乖转起来。真正走进实验室看到示波器上的毛刺、绕组里飙升的电流、怎么调都不稳定的转速曲线我才意识到把一个直流无刷电机从“会转”做到“转得稳、转得准、带载不掉速”中间隔着的是一整套由功率变换、状态反馈、信号采样和闭环算法组成的系统工程。这篇笔记就是我完成一整套电机控制实验后把硬件搭建、算法实现、参数整定、波形调试和故障排查的过程完整梳理下来的记录。它不是什么高深的理论推导更多的是一手实验记录和踩坑总结。如果你正在做类似的课程设计、开放实验或者刚接触电机控制想快速上手这篇笔记能帮你少走很多弯路。我尽量讲清楚每一个步骤背后的原因不只是告诉你“要这样做”而是告诉你“为什么这样做”。毕竟实验的价值不在于复现一个成功的结果而在于理解结果是如何被一步步逼出来的。1. 实验平台搭建与硬件选型心得1.1 核心器件选型电机、驱动、控制板怎么搭平台搭建前我给自己定的原则是能用现成的就用现成的把时间留给控制算法。因此我没有自己画功率板而是选了三块成熟模块拼到一起低压直流无刷电机、三相全桥驱动板、带霍尔接口的控制器开发板。电机的选择上我用了额定电压24V、额定功率100W左右的直流无刷电机自带霍尔传感器。低压电机安全性好实验过程中即使发生堵转风险和成本都相对低。同时霍尔传感器为六步换相提供了转子位置信号省去了后端安装编码器的麻烦。如果你要在后面做FOC那么编码器其实建议一并购入位置精度会高很多。驱动板选择上我需要它支持三相全桥输出、自带死区插入、留有电流采样接口。有些便宜板子把死区时间写死不能配置对于换相实验来说可能能用但如果要研究脉宽调制细节就会受限。控制板我用了一款主频100MHz以上的常见32位MCU开发板板载多路定时器和高速ADC。为什么看重定时器因为产生六路互补PWM、捕获霍尔信号、触发ADC采样都依赖于定时器的硬件能力靠软件逐行模拟GPIO翻转也能让电机转但精度差、CPU负载高不适合做闭环。下面是我当时整理的一条选型对比按这个维度选型基本不会踩到大坑关注点要求原因电机额定电压24V电源留20%以上余量避免启动压降导致欠压复位驱动板电流峰值能力是额定电流3倍以上堵转时电流可达到额定值数倍控制器至少6路PWM且支持互补输出方波控制和FOC都需要三相桥臂ADC可被定时器触发采样电流采样必须在PWM周期定点采集提示选型的时候宁可电源和驱动板余量大一点也不要刚好卡在额定值上实验后期你会感谢这个余量。1.2 供电、接线与信号完整性的那些坑平台搭好以后我以为可以开始写代码了没想到在简单的供电环节就被卡了半天。第一次上电我把电源电压调到25V超过电机额定24V一点点结果电机启动瞬间电流猛增电源电压被拖低控制板直接复位。这不是电机的问题而是电源输出能力不足。后来换了一台最大输出10A的直流电源并把电压稳定在24V才解决了启动掉压的问题。第二个坑是共地。驱动板、控制板、电源三者的地如果不连接到同一个参考点PWM信号回路就会形成压差。我的第一版接线里控制板的信号地单独接了一根线到驱动板但电源的负端又走了另一条路径结果PWM波形中叠加了极大的共模噪声。把地线改成星形汇流后噪声几乎消失。第三个坑是霍尔信号边沿抖动。霍尔传感器是开漏输出线一长上拉电阻不够强时边沿会变得很缓。控制器采样到的换相点忽前忽后导致电机换相噪声很大。我换成2.2k欧的上拉电阻并在IO口配置了输入滤波换相点才算平稳。这些看起来都是“低级问题”但在实验初期非常消耗时间。我现在养成了一个习惯每次上电前先拿万用表确认电源输出电压、检测关键引脚电平、检查地线连接再决定是否上电。这个习惯帮我省下的时间远超检查本身花掉的时间。2. 从能转到转得好控制算法架构演进2.1 开环控制先让电机转起来做电机控制的第一个目标很简单让无刷电机转起来。但无刷电机不是直流有刷电机直接给绕组接电源只能产生一个恒定磁场转子无法自动换向所以需要电子换相。我用的霍尔传感器方案每隔60度电角度就改变一次三相绕组的通电状态六个状态构成一个完整电周期电机就能连续旋转。我把这套六步换相过程比作手摇机械卷扬机你摇动手柄的位置决定齿轮如何啮合手柄转到对应位置就要挂上对应的挡否则齿轮会打滑。同样电机转子每转过一定角度就必须切换桥臂否则产生的转矩就变成制动。开环阶段我固定输出50%占空比的PWM电机空载正常旋转。虽然转起来了但很快暴露了问题用手轻轻抵住转轴转速立刻下降把负载加到轴上转速甚至掉到开环值的一半以下。这是因为开环控制不感知负载系统本质上是一个固定增益的功率放大器。我当时写的换相代码结构大致是这样一个循环while (1) { hall_state read_hall(); switch (hall_state) { case HALL_1: set_bridge(AH, BL); break; case HALL_2: set_bridge(AH, CL); break; case HALL_3: set_bridge(BH, CL); break; case HALL_4: set_bridge(BH, AL); break; case HALL_5: set_bridge(CH, AL); break; case HALL_6: set_bridge(CH, BL); break; default: disable_bridge(); break; } delay_microseconds(50); }注意开环时我给换相加了一个延时模拟换相时间但其实正确做法是让换相完全由霍尔信号边沿触发。用主循环查询的方式在转速高起来之后CPU占用极大而且容易漏读状态。建议后续改用定时器捕获或外部中断。2.2 为什么闭环是必需的一步开环实验做完老师让我在电机轴上挂了一个很小的摩擦负载让我重新观察转速。我没有改任何代码只是增加了摩擦转速就从1500转掉到了1100转左右。这个实验直观地告诉我如果只是输出固定占空比的PWM根本无法保证期望转速。于是很自然要引入闭环反馈。闭环思想其实很简单测量当前转速与目标转速比较用控制器去修正PWM输出。但这个“控制器怎么做”就很有讲究。系统存在转动惯量、摩擦、PWM低通滤波效应开环增益太高会震荡太低又响应太慢。现代控制理论提供了很多工具但工程上最经典、最好用的还是PID。我当时的理解方式可以这样概括把PID三个项当作三个角色——比例项是“直觉反应”误差大就先猛推一把积分项是“记忆”把过去没做完的账补上微分项是“预感”看到误差要涨了提前刹车。三者配合既快又稳。2.3 PID离散化与工程实现细节教材上的PID公式是连续的但单片机只能按周期执行离散化的算法。离散化之后还要处理积分限幅、微分滤波、输出限幅和抗积分饱和这些才是工程实现的关键。我第一版速度环代码非常简单就是一个误差比例输出结果空载时转速差一直在因为摩擦和死区导致必须有一个稳态输出才能平衡。加入积分项之后稳态误差逐渐被修正但同时出现了新的问题电机启动瞬间误差很大积分项快速积累等到转速接近期望时积分项还在冲转速就超调了一大截。这就是积分饱和。我的处理办法是积分项限幅最大最小值设为输出限幅的20%左右具体值按实验微调。微分项不直接对误差求导而是先经过一阶低通滤波器再求差分。最终输出限幅限制最大占空比避免过流。改进后的PID更新函数离散形式如下float pid_step(float setpoint, float measurement, float dt) { float error setpoint - measurement; integral error * dt; integral clamp(integral, -integral_limit, integral_limit); float derivative_raw (error - prev_error) / dt; derivative lpf(derivative_raw, lpf_cutoff, dt); float output kp * error ki * integral kd * derivative; output clamp(output, -output_limit, output_limit); prev_error error; return output; }这几个细节直接决定了PID能不能调参成功。很多人把时间花在试Kp、Ki、Kd上却忽略积分饱和、微分噪声这些问题最后怎么调都震荡还以为是参数的问题。注意如果调参怎么都调不稳定先把积分限幅、微分滤波和采样周期检查一遍很多震荡是这些实现细节导致的而不是PID参数本身的问题。3. 关键实验记录速度环与电流环的实操细节3.1 速度环实验调参步骤与判定标准速度环实验的目标是让电机在空载和带载情况下都能稳定跟踪目标转速。整个实验我用了大约一个下午核心工作就是调PID参数。下面是我的完整调试流程。先只启用比例项积分和微分都设为零。从一个很小的Kp开始逐步增加。Kp太小时转速爬升很慢像一个慢性子的人走路Kp增大后转速响应加快但超调开始出现当Kp大到临界值转速出现持续等幅震荡记下这个临界值。取临界值的一半作为Kp的初值这是工程上常用的临界比例度法整定思路虽然不精确但能快速进入可工作区域。然后加入积分项。Ki从小到大增加重点观察带载后的稳态误差。当转速误差稳定消除时Ki基本合适。Ki过大的典型表现是低频震荡周期在秒量级此时应当立即减小Ki。微分项我加得很谨慎。因为编码器测速本身有量化误差直接做微分会把噪声放大。实验中Kd只用了很小一个值用于压超调。如果看到高频抖动第一反应不是加Kd而是检查测速滤波。调试过程中我每改变一次参数都通过串口把目标转速、实际转速和PWM输出发到上位机绘制成实时曲线。盯曲线而不是盯着示波器的一根电压线是调PID最有效的手段。实验结束后记录下来的最终参数大概是这样仅供参考不同平台差异很大参数数值范围说明Kp0.5-0.8比例系数Ki0.2-0.4积分系数Kd0.01-0.03微分系数积分限幅20%输出防止积分饱和控制频率1kHz速度环采样率判定标准我写进了实验报告空载阶跃超调小于5%调节时间小于0.5秒带载稳态误差小于10转。这几个指标不一定完全适合你的实验但可以当参照系。3.2 电流环实验采样窗口与相电流重构速度环做完后我开始接触电流环。电流环的物理对象是绕组电流它的时间常数远小于速度环控制周期必须足够快。我把开关频率设为20kHz电流环控制频率也是20kHz即每个PWM周期执行一次电流采样和一次电流调节。采样方案上我用的是低端母线采样再通过开关状态重构相电流。这样硬件成本低只用一个采样电阻和一个运放就能得到母线电流再根据当前哪一相导通来换算到对应相电流。关键是采样点的选取。一开始我在PWM输出的边沿触发ADC采到的电流信号全是毛刺因为开关管导通和关断瞬间电流振铃非常严重。后来我把ADC触发点改到PWM周期中段此时开关状态已经稳定电流波形相当干净。我实测过同样的电流信号边沿采样时ADC读数跳动达到几百个LSB改到中段采样后跳动下降到十几个LSB。电流环还要处理运放零漂。我的做法是每次启动时先让电机不工作连续采集10次ADC取平均作为零漂基准在后续的采样值中减去它。这个校准步骤看起来多余但省掉它之后电流环的稳态误差至少会增大一个量级。做电流环实验时我看到了一个非常直观的效果给电流环一个阶跃指令绕组电流能在几个毫秒内跟上目标电机转矩脉动明显减轻。这也为后来做FOC打下了基础因为FOC的内环就是电流环。3.3 六步换相与FOC怎么选在我做实验的那段时间经常被问“你为什么不直接做FOC”。我的回答是在有限学时内先用六步换相把整个电机控制的流程走通再去做FOC效率更高。六步换相加霍尔优点是实现简单、计算量小、对转子位置精度要求低缺点是转矩脉动大、高速性能一般。FOC通过坐标变换将三相电流分解为励磁分量和转矩分量分别控制动态性能好、效率高、噪声小但需要更高精度的转子位置信息算法也复杂很多。很多课程设计用六步换相绰绰有余而工业机器人关节则基本离不开FOC。如果你时间充裕建议按这个顺序走先用六步换相建立换相和反馈的概念再学FOC里的电流环设计。两个实验的硬件平台大部分可以复用唯一需要补充的是把霍尔信号换成高分辨率编码器。我当时就把霍尔和编码器都接上了做FOC时只需要改算法不需要改硬件。4. 调试工具与波形判读技巧4.1 示波器探头怎么接才不白测在电机控制实验中示波器的重要性甚至超过万用表和逻辑分析仪。但我一开始并不会用示波器或者说不会正确使用探头。测PWM波形时我用了标配的鳄鱼夹地线拖着长长一根线。波形显示出来之后PWM沿上全是毛刺和振铃。我第一反应是驱动板干扰太大换了一块还是同样。后来把探头换成短接地弹簧紧贴测量点波形毛刺立刻减少了一个数量级。原理其实很简单长地线形成一个大环路像一个接收天线把电源噪声耦合进测量回路。测量开关节点时尽量保持测量回路面积最小。高端栅极驱动波形测量要格外小心探头地线不能接在开关管源极上否则可能造成干扰甚至短路。如果条件允许用隔离探头或者差分探头没有的话就测低端信号来间接判断。我做的对比实验是同一个电压点长地线夹测量时毛刺峰峰值1.2V短接地弹簧测量时只有不到0.2V。所以说看到示波器波形不好先检查探头接法再怀疑硬件。提醒示波器看到的“异常”不一定是电路异常先检查探头接法再下结论能省掉无数冤枉时间。4.2 编码器测速与数据滤波速度环反馈的核心是编码器测速。编码器采样主要有M法和T法。M法在一定时间窗口内计数脉冲数高速时分辨率高T法测量两个脉冲之间的时间间隔低速时更有优势。我实验的转速范围从100转到3000转只用M法低速段测不准只用T法高速段数据更新太慢所以最终做了混合低速切T法高速切M法切换点大约在1000转。测速得到的数据不能直接当作PID反馈因为量化误差造成的抖动会通过微分项放大。我加了一阶低通滤波截止频率大约200Hz把高频抖动压掉。滤波也有代价就是相位滞后。截止频率越低滞后越大速度环的响应就越慢。我的经验是先把滤波加上让曲线平滑再调PID如果发现系统响应太慢再逐步提高截止频率。这一招能大幅降低PID调试的难度。另外编码器方向检查是必做项。我经历过一次很诡异的震荡排查到最后发现是编码器A、B相接线反了导致反馈方向与期望相反形成正反馈。检查方法其实特别简单把电机用手往一个方向转看上位机读到的转速符号是否正确不正确就交换A、B相。4.3 波形问题与系统故障的快速映射长时间实验后我养成了一种“看波形猜故障”的习惯。下面这张表是我从多次实验中总结出来的不一定全面但覆盖面比较广。波形现象系统问题针对性检查PWM边沿振铃严重栅极驱动回路阻尼不足检查栅极电阻匹配、走线布局电流波形每个周期都有毛刺ADC采样点设置在开关边沿将采样点移到PWM周期中段转速阶跃响应持续等幅震荡Kp过大或反馈方向错误降低Kp、检查编码器方向启动瞬间电压跌落电源输出能力不足增大电源电流检查线路压降霍尔信号边沿缓、毛刺多上拉电阻不够或者滤波不足增大上拉、开启输入滤波相电流波形明显不对称六步换相时序表错误对照霍尔状态逐一排查这张表最直接的用途是实验出问题时不用从头查起直接按照现象定位到大概率的方向然后再用万用表、示波器去确认。5. 常见故障与排查笔记5.1 故障速查表把整个实验期间记录在笔记本上的故障再次汇总我做了下面这个速查表方便后续遇到同样问题时直接查。写完表之后我才发现至少有一半的故障都跟硬件连接和供电有关而不是代码。现象可能原因排查顺序电机不转使能信号缺失、驱动板供电缺失、hall信号异常测供电、测使能电平、测hall波形电机抖动换相表错误、hall接线松动、PWM频率过低核对换相表、查hall接线、升PWM频率启动后转一会停转过流保护触发、采样值异常查电流是否超限、降低占空比限幅低速震荡测速方法不合适、滤波器截止频率过高换T法、降低截止频率、检查PID高速带载没力母线电压跌落、电流环限幅不足检查电源带载能力、增加限幅控制器偶尔复位电源纹波大、地线接触不良加大电容、检查星形接地5.2 三个让人印象深刻的排查案例第一个案例是“电机时转时不转”。第一天下午还跑得好好的第二天一上电电机转两秒就停过一会又能转两秒。我怀疑过代码死循环、过流保护误触发最后检查发现驱动板使能引脚接的杜邦线松了导致使能信号时有时无。重新插紧问题消失。这个案例给我最大的教训是间歇性故障优先怀疑物理连接。第二个案例是“速度环重新上电后震荡”。头天调试完参数保存了代码第二天重新烧录转速开始震荡。我看了半天代码觉得逻辑没问题最后用示波器测编码器输出发现有一路信号偶发丢失。原因是编码器线缆转接端子接触不良。这个案例让我意识到复现实验时硬件的疲劳和老化也要考虑。第三个案例是“电流采样噪声大怎么滤波都滤不掉”。我一度认为是运放受干扰想换硬件后来临时把ADC采样点从PWM边沿移到了周期中段问题瞬间解决。滤波代码删了个干净。这个案例教会我做电流环时采样时序永远比滤波算法更重要。这三个案例看似不相关背后的共同点却是问题表象在软件根因在硬件。所以我最终养成了一个排查习惯——先看硬件再查时序最后动代码。这个顺序能帮你节省无数时间。整套电机控制实验做完后我最大的体会可以浓缩成一句话电机控制是一项“把每一个细节都做对”的系统工程。你可以在理论上把PID推导得很漂亮但在实验台上一个松动的插头、一个采样窗口的偏差、一根太长的示波器地线都能让你的转速曲线面目全非。如果让我给还在做实验的同学提一个建议那就是一定要养成记录的习惯。每一次失败的波形截图、每一个参数改动前后的效果对比甚至每一根线接错时的表现都值得写进笔记里。我这份实验笔记就是从这些看似零散的记录里整理出来的。你现在看到的这些章节本质上就是我踩过的坑的总和。也希望这份笔记能让你少踩几个坑。做电机控制实验最快乐的时刻不是最终跑通的那一刻而是你终于明白之前为什么会抖、为什么会响、为什么会崩的那一瞬间。

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

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

免费获取报价 →
↑