作为一个工科生,电机控制实验几乎贯穿了我整个本科高年级阶段。说实话,刚开始我对“电机控制”这四个字的理解非常幼稚,以为就是给两根线通上电,转子就乖乖转起来。真正走进实验室,看到示波器上的毛刺、绕组里飙升的电流、怎么调都不稳定的转速曲线,我才意识到,把一个直流无刷电机从“会转”做到“转得稳、转得准、带载不掉速”,中间隔着的是一整套由功率变换、状态反馈、信号采样和闭环算法组成的系统工程。
这篇笔记,就是我完成一整套电机控制实验后,把硬件搭建、算法实现、参数整定、波形调试和故障排查的过程完整梳理下来的记录。它不是什么高深的理论推导,更多的是一手实验记录和踩坑总结。如果你正在做类似的课程设计、开放实验,或者刚接触电机控制想快速上手,这篇笔记能帮你少走很多弯路。
我尽量讲清楚每一个步骤背后的原因,不只是告诉你“要这样做”,而是告诉你“为什么这样做”。毕竟,实验的价值不在于复现一个成功的结果,而在于理解结果是如何被一步步逼出来的。
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最有效的手段。
实验结束后记录下来的最终参数大概是这样(仅供参考,不同平台差异很大):
| 参数 | 数值范围 | 说明 |
|---|---|---|
| Kp | 0.5-0.8 | 比例系数 |
| Ki | 0.2-0.4 | 积分系数 |
| Kd | 0.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推导得很漂亮,但在实验台上,一个松动的插头、一个采样窗口的偏差、一根太长的示波器地线,都能让你的转速曲线面目全非。
如果让我给还在做实验的同学提一个建议,那就是一定要养成记录的习惯。每一次失败的波形截图、每一个参数改动前后的效果对比,甚至每一根线接错时的表现,都值得写进笔记里。我这份实验笔记,就是从这些看似零散的记录里整理出来的。你现在看到的这些章节,本质上就是我踩过的坑的总和。
也希望这份笔记能让你少踩几个坑。做电机控制实验,最快乐的时刻不是最终跑通的那一刻,而是你终于明白之前为什么会抖、为什么会响、为什么会崩的那一瞬间。