2、电机模型与系统辨识:直流电机传递函数、时间常数、增益的测量方法
做电机控制这么多年,我越来越觉得一个道理:调参调得好不好,七分靠模型,三分靠手感。很多人一上来就对着PID三个参数猛调,调了半天发现电机要么抖得像筛子,要么慢得像蜗牛。其实说白了,你连这电机到底什么脾气都没摸清楚,怎么可能调得好?
这一章,我们就来聊聊怎么给直流电机“把脉”——也就是系统辨识。我会把传递函数、时间常数、增益这些听起来很唬人的概念,用最接地气的方式讲清楚。
2.1 直流电机的数学模型长什么样?
先别急着上公式。你想想看,一个直流电机接上电,它为什么会转?
简单说就是:电压加在电枢上,产生电流,电流在磁场里受力,于是转子转起来。但转起来之后,转子切割磁感线又会产生反电动势,反过来抑制电流。这一来一回,就构成了一个动态系统。
我习惯把直流电机简化成这样一个模型:
电枢回路:U = iR + L(di/dt) + e
反电动势:e = Ke * ω
转矩方程:T = Kt * i
运动方程:T - TL = J(dω/dt) + Bω
这里U是输入电压,ω是转速,i是电枢电流。把这些方程拉普拉斯变换一下,就能得到从电压到转速的传递函数:
G(s) = ω(s)/U(s) = K / (τs + 1)
嗯,你没看错,就是一个一阶惯性环节。为什么?因为电气时间常数通常比机械时间常数小得多,我们一般忽略电气动态,只考虑机械部分。
关键参数解读:
- K(增益):稳态时,1V电压能让电机转多少rad/s?这就是增益。
- τ(时间常数):电机从0加速到稳态速度的63.2%,需要多长时间?这就是时间常数。
我在项目中遇到过一台奇怪的电机,怎么调参数都振荡。后来一测,发现它的时间常数比标称值大了三倍。原来是负载惯量没算进去。你想想看,一个空载电机和一个带大飞轮的电机,响应速度能一样吗?
2.2 怎么测量增益K和时间常数τ?
理论讲完了,咱们来点实在的。怎么测?我推荐两种方法,都是我在实验室里反复验证过的。
方法一:阶跃响应法(最直观)
这个方法说白了就是:给电机一个固定的电压,看它转速怎么变化。
具体步骤:
- 电机空载,给一个阶跃电压(比如12V)。
- 用编码器或测速机记录转速随时间的变化曲线。
- 等转速稳定后,记录稳态转速ωss。
- 找到转速上升到0.632 * ωss的时间点,这个时间就是τ。
- 增益K = ωss / U。
我的小技巧: 做阶跃响应时,电压不要给太大。我一般用额定电压的30%-50%。给太大容易电流过冲,搞不好会烧驱动。另外,记得先让电机在零速状态下稳定1-2秒再给阶跃,这样数据更干净。
方法二:频率响应法(更精确)
阶跃响应法虽然简单,但容易受噪声干扰。如果你需要更精确的模型,我建议用频率响应法。
做法是:给电机输入不同频率的正弦波电压,记录输出转速的幅值和相位变化。然后画出伯德图,从图上读出截止频率ωc,时间常数τ = 1/ωc,增益K就是低频段的幅值。
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 阶跃响应法 | 简单快速,直观 | 易受噪声影响 | 快速估算、现场调试 |
| 频率响应法 | 精度高,抗噪好 | 需要信号发生器,操作复杂 | 实验室建模、高精度控制 |
2.3 实操:用代码实现阶跃响应辨识
光说不练假把式。我写了个简单的Python脚本,帮你自动计算K和τ。你只需要把采集到的转速数据喂进去就行。
import numpy as np
import matplotlib.pyplot as plt
def identify_step_response(time, speed, voltage):
"""
从阶跃响应数据中辨识K和tau
time: 时间数组 (s)
speed: 转速数组 (rad/s)
voltage: 阶跃电压值 (V)
"""
# 找到稳态转速(取最后10%数据的平均值)
steady_speed = np.mean(speed[-int(len(speed)*0.1):])
# 计算增益
K = steady_speed / voltage
# 找到63.2%稳态值对应的时间
target_speed = 0.632 * steady_speed
idx = np.argmin(np.abs(speed - target_speed))
tau = time[idx]
print(f"增益 K = {K:.3f} (rad/s)/V")
print(f"时间常数 τ = {tau:.3f} s")
# 绘制拟合曲线
fitted = K * voltage * (1 - np.exp(-time/tau))
plt.plot(time, speed, 'b-', label='实测')
plt.plot(time, fitted, 'r--', label='拟合')
plt.legend()
plt.show()
return K, tau
注意: 这个代码假设你的数据已经去除了直流偏置和噪声。我建议在采集数据前先做一下低通滤波,截止频率设在10Hz左右就够了。另外,阶跃响应的起始点要找准,不然时间常数会偏大。
2.4 避坑指南:我踩过的三个坑
做系统辨识这么多年,我踩过的坑比走过的路还多。分享三个最常见的,你遇到了可以少走弯路。
坑一:摩擦力的影响
我曾经有一台电机,测出来的增益总是偏小。后来发现是电刷摩擦太大,导致低速时电机根本转不起来。解决办法是:在辨识前先给电机通一个小电压,让它在低速下“热身”几分钟,等摩擦力稳定了再测。
坑二:电源内阻
你用的电源不是理想电压源。当电机启动瞬间电流很大,电源电压会被拉低。我遇到过用电池供电的情况,12V的电池一启动就掉到10V,测出来的增益自然不准。建议用稳压电源,或者在辨识时同时记录实际电压值。
坑三:负载变化
电机在实际系统中往往带着负载。你空载辨识出来的参数,带上负载后完全不能用。我的做法是:分别在空载和满载下各做一次辨识,然后取中间值作为初始参数。后续再通过自适应控制在线调整。
2.5 小结:拿到参数后怎么用?
好了,现在你手里有了K和τ。接下来呢?
这两个参数可以直接用来设计PID控制器。比如,用齐格勒-尼科尔斯整定法,或者更现代的内模控制法。我个人习惯用τ作为积分时间的参考值,K用来估算比例增益的初始范围。
举个例子:如果τ=0.1s,K=10,那么我一般会把Ki设在1/τ=10左右,Kp先试0.5/K=0.05,然后根据响应微调。当然,这只是个起点,具体还要看你的性能要求。
下一章,我们会深入PID参数的具体整定方法。但请记住:模型是基础,参数是上层建筑。基础没打好,上层建筑再漂亮也是空中楼阁。
嗯,这一章就到这里。如果你在辨识过程中遇到什么奇怪的现象,欢迎来交流。我微信deep3321,公众号蓝海资料掘金营上也会定期分享一些实战案例。