1. 项目概述:为什么要费劲测一台直流电机的频率响应
做电机控制这些年,我一直觉得一个有意思的事情是:很多工程师调试伺服系统、PID参数时,全靠“感觉”和“试错”。先给个积分增益,跑一下看抖不抖;再给个比例增益,听一下有没有嗡嗡声。说实话,这种方法并不是不行,但它的天花板很低——尤其是当你面对一台新型号电机、一套不熟悉的机械负载,或者一个要求很高的运动控制项目时,这种“玄学调参”会浪费大量时间,甚至把系统调到震荡边缘还不自知。
测量直流电机的频率响应,本质上就是在做一件事:把这个“玄学”变成“科学”。它就像给电机做一次体检,把电机从“电压输入”到“转速输出”这一整条路径的动态特性,用一条清晰的曲线画出来。这条曲线,我们通常叫它伯德图(Bode Plot),它告诉我们:这台电机在什么频率下响应灵敏,在什么频率下开始衰减,在什么频率下会出现谐振峰值,以及它的相位滞后有多大。
为什么这些信息值钱?因为闭环控制器的设计,本质上就是在跟这些“频率特性”打交道。你知道了电机的带宽,就知道你的速度环增益最多能推到多少而不引发振荡;你知道了机械谐振点的位置,就知道该在滤波器里加陷波器还是低通;你看懂了相位裕度,就知道系统的稳定余量到底够不够。
这篇博文适合谁?说实话,它不是写给纯做理论的人看的。如果你正在做运动控制、机器人、自动化设备、无人机云台、电动工具,或者任何用到直流电机闭环控制的项目,而且你已经对PID、编码器、PWM这些概念有一定基础,那么这篇内容对你最有用。当然,如果你想深入了解电机特性,或者纯粹好奇工程师怎么给电机“做体检”,这篇文章也足够通俗,你可以跟着步骤把实验复现出来。
我在这里要提醒一句:这个测量方法不只是针对“直流有刷电机”,它同样适用于无刷直流电机(BLDC)、永磁同步电机(PMSM)的机械频率特性辨识,只是驱动方式稍有不同。文章里的核心思路是通用的。
2. 整体思路拆解:扫频vs逐点正弦,我的选型理由
2.1 频率响应测量的两种主流方案
测量系统频率响应,业界最常用的方法大概分两类:扫频正弦(Swept Sine / Chirp)和步进正弦(Stepped Sine)。这两种我都实测过,都有自己的优缺点,这里说下我的感受。
扫频正弦的思路很简单:从一个低频(比如0.1Hz)开始,连续或分段地把正弦信号的频率逐渐升高到目标上限(比如100Hz甚至更高),同时记录系统的输入和输出,最后通过FFT或相关分析法,得到每个频率点的幅值增益和相位差。
步进正弦则更“笨”一点:不连续扫频,而是设定一系列离散的频率点(比如0.1、0.2、0.5、1、2、5、10、20、50、100Hz),在每个频率点单独发一段固定频率的正弦波,等系统稳定后记录稳态输出,算完这个点的幅值相位,再跳到下一个频率点。
我做这个项目时,两台电机一台用了扫频,一台用了步进正弦,对比下来发现:
| 维度 | 扫频正弦 | 步进正弦 |
|---|---|---|
| 测量速度 | 快(几十秒完成全频段) | 慢(每个频点都要等待稳定,可能要几分钟) |
| 频谱泄露风险 | 高,需要加窗处理 | 低,稳态正弦信号本身就很干净 |
| 非线性敏感度 | 较高,瞬态响应会混入结果 | 较低,可以只取稳态部分平均 |
| 对摩擦/死区的鲁棒性 | 较弱,低速段容易失真 | 较强,每个点都可以做补偿 |
| 硬件实现难度 | 低(一个对数扫频信号即可) | 低(但要控制频率切换时序) |
| 数据后处理 | 复杂(需要FFT加窗) | 简单(逐点算RMS和相位) |
如果你只求快、求方便,而且电机负载不复杂,扫频完全够用。但如果电机带载后存在明显非线性(比如齿轮箱齿隙、皮带打滑、摩擦负载),建议老老实实用步进正弦。这个项目里最终我主要采用步进正弦,因为实测数据更干净,拟合出的模型参数也更可信。
2.2 为什么选择电流环内环+机械外环的测量拓扑
这里有一个关键设计决策,值得展开讲讲。直流电机的“完整”传递函数,既包括电气部分(电枢回路)也包括机械部分(转动惯量、阻尼)。理论上你确实可以直接从“电压输入”到“转速输出”建一个完整模型。但实际测量时,我强烈建议你把电流环先闭环起来,然后测量“电流给定→转速输出”的频响。
为什么?两个原因。
第一,电机的电气时间常数通常远小于机械时间常数。直接测电压到转速,得到的伯德图会在某个转折频率处混合着电气和机械两个极点,你很难把它们区分开。但如果先把电流环闭环(带宽通常做到1kHz以上),电流环的动态相对机械响应来说快得多,于是整个测量主通道就简化成了“电流→力矩→转速”的机械路径,物理意义更单纯。
第二,电流环闭环后,会显著降低电枢电阻、反电动势等因素对测量结果的影响。这意味着你测出来的频率响应曲线更接近“纯机械特性”,这对后续机械参数辨识、负载识别都更有利。
实际接线也很简单:你用一台带电流环的驱动器,把速度环断开,直接给电流环一个电流指令信号,然后高速采集编码器转速,作为系统的输出。整套系统的“输入”就是电流指令(安培),“输出”就是电机转速(rad/s)。
2.3 激励信号幅值的选择逻辑
选幅值这件事,看起来好像没什么技术含量,其实坑很多。如果激励幅值太大,电机会跑飞、电流会超限,甚至撞上机械限位;如果幅值太小,摩擦和死区会吃掉有效信号,输出的转速波形会严重扭曲,测出来的增益比实际偏小。
我可以分享一个实际选择的经验公式:先用一个很小的正弦电流(比如额定电流的2%),频率放在中频段(比如10Hz),观察电机的转速波动幅度。如果转速波动峰值小于额定转速的2%,说明激励太弱,需要放大;如果超过额定转速的10%,就要小心非线性带来的谐波污染。
对于多数小型直流电机(额定电流1~3A),我从额定电流的5%开始试,基本都能找到合适的区间。另外一个实用技巧是:低速运行阶段,把电流幅值适当加大一些,因为摩擦在低速段占的比重很大,你需要用更大的力矩来“冲破”静摩擦的束缚,才能在输出里看到有效的运动。
3. 核心细节解析与实操要点
3.1 硬件链路的搭建:编码器分辨率决定了你的测量上限
测频响,本质上是一个高保真“录音”过程:输入一个已知信号,记录输出响应。这套系统里最关键的两个硬件是信号生成端和转速测量端。
信号生成端,我用的是一块带16位DAC的实时控制板,配合一个简单的C程序生成正弦扫频序列。很多人会问:直接用函数信号发生器行不行?完全可以,但要注意信号发生器输出的是电压信号,而你的驱动器电流环输入通常也是电压接口(比如0-10V对应0-额定电流),所以要做一下标定——知道几伏对应几安培。不做这一步,后面拟合模型时电流到力矩的换算就会出现系统性偏差。
转速测量端,我强烈建议用增量式编码器 + 高速计数器/定时器捕获,而不是用测速发电机的模拟电压。测速发电机的输出电压纹波大、响应慢,而且模拟采样的噪声会直接污染你的频响曲线。编码器的分辨率直接决定了你的测量精度上限——比如每转1000线的编码器,配合4倍频后是4000计数/转,在转速100rpm(约1.67rps)下,每秒能产生约6670个脉冲。如果你的采样频率是1kHz,那么每个采样周期内大约能捕获6-7个脉冲,够用了。但如果转速低到10rpm,每周期只有不到1个脉冲,测出来的转速数据会锯齿状严重,频响的数据质量就完蛋了。
我在这个项目里用的是一台2000线编码器(4倍频后8000计数/转),配合5kHz的采样频率,在最低测试频率0.1Hz、转速波动幅度可控的前提下,数据质量还是能保证的。
3.2 采样率与抗混叠噪声控制的配合
关于采样率,我遇到过不少新手翻车的情况:采样率设低了,高频段频率响应完全错乱;采样率设高了,数据文件大得离谱,后处理时电脑卡顿。我的经验是:采样率至少设为最高激励频率的50~100倍。比如你最高测100Hz,采样率至少要5kHz~10kHz。这样既不会出现混叠,又能对高频段的转速信号做足够精细的重建。
这里还有一个细节:很多控制板上的ADC或编码器捕获自带一个简单的低通滤波,这个滤波的截止频率如果低于你的最高激励频率,就会在高频段引入额外相位滞后。实测中我发生过这种问题,后来学乖了:所有滤波一律关掉,或者把截止频率设到采样率的五分之一以上,宁可让数据里带一点高频噪声,也不要把有效的频响信息给滤没了。
3.3 数据采集时的时间戳同步问题
开始的时候我没有太在意时间同步,觉得只要同时采就行。但这个项目里,因为输入信号是控制板DAC发的,输出信号是编码器捕捉的,两者分属不同的硬件模块,如果不在同一个时间基准下记录,那么每个频率点的相位都会偏一个随机量——这会导致最后画的伯德图相位曲线像被狗啃过一样,完全没法看。
解决办法有两个:
第一,用同一个定时器中断去触发ADC采样和编码器寄存器读取,然后在同一个中断服务程序里把这两个数据打上同一个全局时间戳。这是最干净的方法。我用的控制板正好支持这种操作,实测相位曲线平滑得多了。
第二,如果没有这种硬实时能力,那就只能用互相关的方法来离线对齐输入输出。方法是在信号的前面加一段已知的参考标记(比如一个短脉冲),在数据分析时先找出这个标记,然后按照已知的采样率把输入输出对齐。这个方法稍微麻烦一点,但确实有效。
3.4 电机安全工作区确认
这是整个实验里最不能跳过的一步。电机的频率响应测量,意味着你要故意给电机一个波动的指令,让它在一个宽频范围内来回转动。如果你不控制好安全工作区,轻则数据作废,重则烧驱动、毁电机。
我的安全检查清单:
- 电流限制:驱动器的电流限幅设为额定电流的120%,留一点缓冲但不至于失控。尤其做低频段测试时,电机可能要持续输出大力矩,长时间运行容易过热。
- 速度限制:在控制器里加一个转速软限位,万一出现意外(比如机械谐振放大),立即把电流指令置零。我见过一次谐振引起的啸叫,声音听起来像金属被撕裂,如果不是限位及时,电机轴估计要废。
- 机械行程:如果你测试的对象是带减速器的机构,不要让电机连着机构跑太远。最好把负载脱开,只测电机本体的空载频响,这样既安全又纯粹。
4. 实操过程与核心环节实现
4.1 测试平台的搭建与初始标定
我这次实验用了一台额定电压24V、额定电流2.1A、额定转速3000rpm的直流有刷电机,配一个2000线增量编码器,驱动器工作在电流环模式。整个测试平台的接线如下:
- 控制板DAC输出 → 驱动器电流指令输入(0~10V对应-2.1A~+2.1A)
- 编码器A/B相 → 控制板正交解码接口
- 驱动器故障输出 → 控制板数字输入(急停用)
硬件连线完成后,第一件事不是测频响,而是做静态标定。给电流指令一个已知的直流值(比如1A),看电机是否以稳定的力矩趋势运行,再用测速仪验证编码器读数是否正确。这个步骤看似浪费几分钟,实际能帮你排除大量低级错误。
标定的核心项目:
| 标定项目 | 方法 | 作用 |
|---|---|---|
| 电流指令标定 | 用万用表测量驱动器电流监视输出,对照指令电压 | 确认“几伏对应几安” |
| 编码器方向检测 | 手动正向转动电机,观察计数方向 | 防止闭环后正反馈 |
| 转速换算系数 | 已知转速下核对编码器计数 | 确认rpm到计数/s的换算因子 |
4.2 步进正弦测试的执行流程
标定完成后,我写了一个简单的Python脚本,通过串口控制板切换工作模式。核心流程是这样的:
第1步:设定频率点序列。我用的频率点是[0.1, 0.2, 0.5, 1, 2, 3, 5, 8, 10, 15, 20, 30, 50, 80, 100] Hz。注意:低频段取了更多点,因为机械系统的幅频特性在低频过渡带变化剧烈,需要更细的分辨率来捕捉转折点。
第2步:逐个频率点执行测试。对每个频率f,先估算需要多少个周期才能让系统进入稳态。经验公式:稳态时间 = 2 / (2πf × 阻尼比),对于典型的直流电机系统,阻尼比大约在0.2~0.5之间,所以低频时要等很长时间。0.1Hz时需要等约20~30秒才稳定,高频段就快得多。为了平衡时间和精度,我再取稳态后的5~10个周期做数据记录。
第3步:转速数据处理。对记录的转速波形,计算每个周期内的峰值、零点和平均值,然后把所有周期做平均,消除随机噪声和谐波影响。这种做法本质上是“时域同步平均”,效果非常好。
4.3 从时域数据到频响曲线:计算增益与相位
这一步是整个项目中最核心的计算环节。
对于每一个测试频率f,我们拿到了输入电流信号I(t) = A·sin(2πft) 和输出转速信号ω(t) = B·sin(2πft + φ)。通过以下方法提取B和φ:
- 增益= 20·log10(B/A),单位是dB(如果以转速/电流为单位则变为dB·(rpm/A))
- 相位差φ,单位是度
实际操作中我是用Python的scipy.signal做的。具体来说,用正弦拟合(sine curve fitting)比简单FFT更精确:
import numpy as np from scipy.optimize import curve_fit def sine_func(t, amplitude, phase, offset): return amplitude * np.sin(2 * np.pi * freq * t + phase) + offset # 对每个频率点做拟合 for freq in freq_list: # t 是时间向量,omega 是转速数据 p0 = [np.std(omega) * np.sqrt(2), 0.0, np.mean(omega)] popt, _ = curve_fit(sine_func, t, omega, p0=p0) amp_out = popt[0] phase_out = popt[1] # gain = 20*log10(amp_out / amp_in)这里有一个重要的细节:曲线拟合时一定要把直流偏移量offset也拟合出来。很多教程里默认信号均值为零,但电机转速因为摩擦的存在,往往带有一个非零的平均转速,如果不拟合offset,振幅和相位都会出现偏差。
4.4 我实测的一组数据和模型拟合结果
整个频段测完后,我得到了一组典型的直流电机机械频响数据。以1Hz为参考,增益设为0dB,部分实测数据如下:
| 频率(Hz) | 实测增益(dB) | 实测相位(deg) | 模型增益(dB) | 模型相位(deg) |
|---|---|---|---|---|
| 0.1 | -0.2 | -3 | -0.1 | -2 |
| 0.5 | -1.1 | -15 | -1.2 | -14 |
| 1.0 | 0.0 | -25 | 0.0 | -26 |
| 2.0 | -1.5 | -48 | -1.6 | -47 |
| 5.0 | -8.0 | -75 | -8.3 | -77 |
| 10.0 | -13.5 | -88 | -13.2 | -87 |
| 20.0 | -18.0 | -92 | -17.5 | -91 |
| 50.0 | -23.0 | -95 | -23.6 | -95 |
这个数据形态非常典型:低频段增益基本平坦(0dB),在转折频率附近开始以约-20dB/decade的斜率下降,相位从0度逐步向-90度逼近。这说明系统可以用一个一阶惯性模型来近似:
转子模型:G(s) = K / (τs + 1)
其中,K是直流增益(单位:rpm/A),τ是机械时间常数。从数据里看到,转折频率大约在0.8Hz左右,对应时间常数τ = 1/(2π×0.8) ≈ 0.2s。直流增益K可以直接从低频段的输出转速除以输入电流得到,比如在0.1Hz时输入0.15A电流,转速稳定在约500rpm,则K ≈ 3333 rpm/A。
把这两个参数代回一阶模型,得到图中的红色曲线,和实测数据对得非常好。这说明这台电机本身没有明显的机械谐振——很多实际系统会在这里出现一个谐振峰,如果有,你就得把模型升级为二阶系统,并额外引入一个谐振频率和阻尼比。
4.5 如果测出谐振峰,该怎么处理
虽然我这次测试的电机没出现明显的谐振峰,但干这一行总会遇到。电机装上负载后,联轴器的弹性、皮带的柔性、负载本身的转动惯量都会引入谐振。我处理过一台带着同步带的直流电机,在25Hz处出现了一个6dB的谐振峰,相位从-90度直接跳到-170度,当时的闭环PID只要增益稍微调高一点就啸叫。
对于这种情况,测出来的频响曲线会很像一个“二阶弹性能系统+一阶惯性系统”的组合。拟合模型时要加入一个谐振项:
G(s) = K / ((τs+1) · (s²/ωn² + 2ζs/ωn + 1))
通过最小二乘法拟合谐振频率ωn和谐振阻尼比ζ,然后你就可以在控制器里加一个陷波滤波器(Notch Filter),专门在谐振频率处把增益压下去,再稳定地提高环路的整体增益。这在伺服驱动器的参数自整定功能里是非常常规的操作。
5. 实操过程中踩过的坑:问题排查与解决实录
5.1 转速波形严重削顶:激励幅值过大的信号
第一次做步进正弦测试时,我在低频段(0.1Hz~0.5Hz)发现转速波形看起来像方波,正弦的顶部和底部被“削平”了。这不是电机问题,而是电流指令太猛,转速超出了正常运行范围,被驱动器限速或者电机反电动势限制,输出被“限幅”了。
解决方式很直接:立即减小低频段的电流激励幅值。我用了一个可变的激励安排:低频段幅值为额定电流的3%,中频段5%,高频段8%。这个安排的逻辑是:低频段电机的响应增益高,小信号就能产生足够的转速波动;高频段电机响应衰减大,需要更大的信号才不至于让输出幅度掉到噪声里。
5.2 相位曲线在某一点突然跳变180度:方向反了
测试过程中我还碰到过一个诡异的现象:当频率超过某个点后,相位曲线突然从-170度跳到-350度,看起来像是不连续的。后来分析才发现,这根本不是什么物理现象——是因为在该频率点,输出的转速信号幅度太小,有效信号和噪声混在一起,正弦拟合的相位结果不稳定,跳到了错位。
排查方法是看这个频率点附近的相干性(Coherence)指标。相干性低于0.9的数据点,基本上不可信。我处理的方式是:在数据处理流程中加一道过滤,凡是拟合残差过大(R²<0.95)的频率点,自动标记为无效,并提高激励幅值重新补测一次。
5.3 摩擦非线性导致低频段增益偏差大
低频测量还有个老大难问题:摩擦。0.1Hz时电机的速度很慢,接近零速时摩擦从动摩擦过渡到静摩擦,表现为一个“粘滞”区。这会使得输出转速不再是平滑的正弦波,而是带有明显的“平顶”和“死区”。
这种情况下,强行用正弦拟合会得到偏小的增益和偏大的相位滞后。解决办法有几个:
- 使用更大的电流幅值,让电磁力矩远大于摩擦力矩,压缩非线性的相对影响。
- 在测试前先做摩擦辨识补偿,把已知的库仑摩擦力矩前馈补进去,相当于在输入端把摩擦抵消掉。
- 只记录稳态部分的数据,并且把所有数据段做周期平均,尽量减少随机干扰。
我在这个项目里采用了第一种+第三种组合,效果足够好了。
5.4 高频段数据被噪声淹没时的解决方案
当频率升到50Hz以上时,电机的机械响应已经衰减得很厉害了,转速波动幅度可能只有1~2rpm,而编码器量化噪声和机械震动噪声在这个量级上是不可忽略的。这时候数据信噪比急剧下降,幅频曲线开始乱跳。
我的应对方案是:增大正弦波的数据记录长度,而不是一味地增大激励幅值。每一个高频频率点记录100个周期再做同步平均,这相当于把周期性的信号在时域里叠加100次,而随机噪声按根号100=10倍减弱。信噪比提高了20dB,数据一下就清晰了。这个方法非常实用,在强噪声环境下做辨识时几乎是必选项。
5.5 常见问题速查表
| 现象 | 可能原因 | 处理方法 |
|---|---|---|
| 低频段转速波形削顶 | 激励幅值过大,转速超限 | 降低低频段电流幅值 |
| 高频段幅频曲线乱跳 | 信噪比不足 | 增加记录周期数并做同步平均 |
| 相位曲线不连续 | 信号过弱导致拟合相位翻转 | 提高该频点幅值重测,或标记无效 |
| 相位曲线整体偏大 | 输入输出时间戳不同步 | 使用同一中断里采集或离线对齐 |
| 截止频率处增益异常凸起 | 存在机械谐振 | 用二阶谐振模型拟合,考虑加陷波器 |
| 1Hz以下增益明显低于预测 | 摩擦/死区非线性 | 提高激励幅值或加摩擦前馈补偿 |
6. 进一步扩展:如何利用频响结果优化闭环控制
6.1 根据频响数据设计速度环增益
测频响并不是为了画一张好看的图,而是为了给控制设计提供依据。以我实测的那台电机为例,它的频响在0.8Hz处有一个转折,相位在10Hz附近已接近-90度。如果给速度环加一个PI控制器,理论推导和经验都表明,穿越频率每接近其相位滞后-135度的频率点,系统就越接近不稳定边界。
按照这个数据,我很快算出了速度环带宽的安全上限大约在10~15Hz,PI增益可以据此设定。再去跑实际闭环测试时,一上来就落在了一个比较稳的起点上,后续只需要微调几个参数就够了。
6.2 与离线仿真模型的交互验证
拿到实测频响之后,我还在MATLAB/Simulink里搭了一个仿真模型,把真实测到的K和τ填进去,对比了开环阶跃响应。实测和仿真基本吻合,说明这个模型已经足够用于后续的控制器设计仿真。之后再改控制算法时,就可以先在电脑上验证,少烧一堆硬件。
6.3 从频响辨识到参数自整定
很多商用伺服驱动器里的“自动整定”功能,底层逻辑就是这套东西:给系统一个激励信号,测出频率响应,自动辨识出模型参数,再根据模型计算出最优PID增益。你自己动手实现了这套测量流程之后,就相当于掌握了一个简易的“参数自整定仪”。以后遇到新电机或者新机构,只要跑一遍这个流程,就能快速掌握它的“性格”,再也不用凭感觉盲调了。
最后再分享一个小的实操体会:测频响这件事,第一次做可能会因为各种细节问题折腾一两天,但一旦把流程跑通,后续再做任何电机项目的速度都很快。这套方法值得你花时间在实验室里沉淀成自己的标准工具。