第3章:系统辨识入门:扫频法、阶跃响应法,给平台做个“体检”
做纳米定位,最怕什么?
怕你调了半天PID,结果连平台本身的“脾气”都没摸清楚。
我见过太多工程师,上来就对着PID三个参数猛调,调得满头大汗,平台却像喝醉了酒一样乱晃。其实,问题不在PID,在于你根本不知道你的平台是个什么“性格”。
所以,这一章我们不讲PID怎么调。我们先给平台做个“体检”。
这个体检,在控制领域叫系统辨识。说白了,就是通过实验,摸清平台的频率响应、时间常数、阻尼比这些“身体指标”。
核心观点: 没有系统辨识的PID整定,就是盲人摸象。你连平台的带宽是多少都不知道,怎么敢设定PID的积分时间?
3.1 为什么要做系统辨识?
你想想看,一个纳米定位平台,它里面有压电陶瓷、有柔性铰链、有电容传感器。这些东西组合在一起,就是一个复杂的二阶甚至高阶系统。
它的特性会随着温度、负载、老化而变化。今天调好的参数,明天可能就不好使了。
系统辨识能告诉你三件事:
- 带宽:平台能响应多快的指令?超过这个频率,指令就白给了。
- 谐振频率:平台在哪个频率点会“发抖”?这是PID需要避开或抑制的地方。
- 阻尼比:平台是“软绵绵”的还是“硬邦邦”的?这决定了你的微分项该怎么设。
我个人习惯,拿到一个新平台,第一件事不是上电,而是先做一次扫频。就像医生听诊,先听听心肺有没有杂音。
3.2 方法一:扫频法(频率响应分析)
扫频法,是辨识系统最直观的方法。它就像给平台做一次“听力测试”。
我们给平台输入一个正弦波信号,频率从低到高慢慢扫过去。然后看平台的输出幅值变化了多少,相位滞后了多少。
具体操作步骤:
- 给平台施加一个正弦波电压指令,幅值不要太大(比如满量程的5%),避免损坏平台。
- 从1Hz开始,逐步增加到平台带宽的3-5倍(比如1000Hz)。
- 在每个频率点,记录输出位移的幅值和相位。
- 画出Bode图(幅频曲线和相频曲线)。
嗯,这里要注意:扫频的步长要合理。低频段可以粗一点,高频段(尤其是谐振点附近)要细一点。我在项目中遇到过,有人用等间距扫频,结果谐振峰根本没扫到,整定出来的参数全是错的。
扫频法的核心输出:
| 参数 | 含义 | 对PID的影响 |
|---|---|---|
| -3dB带宽 | 幅值衰减到0.707倍时的频率 | 决定了你的系统能跑多快,PID的P项不能超过这个频率 |
| 谐振频率 | 幅值出现尖峰的位置 | 需要陷波滤波器或降低P增益来抑制 |
| 谐振峰值 | 谐振点的幅值增益 | 峰值越高,系统越容易振荡,I项要保守 |
| 相位裕度 | 在增益穿越频率处的相位差 | 相位裕度低于30°,系统基本不稳定 |
我的小技巧: 扫频时,我习惯用对数扫频,而不是线性扫频。因为系统的动态特性在低频和高频段差异很大,对数扫频能更均匀地覆盖整个频段。另外,每个频率点至少采集10个周期,取平均值,这样噪声影响会小很多。
3.3 方法二:阶跃响应法(时域分析)
扫频法虽然全面,但操作起来有点麻烦。有时候,我们只需要快速摸个底。
这时候,阶跃响应法就派上用场了。它就像给平台一个“突然的指令”,看它怎么反应。
怎么做?
- 给平台一个阶跃电压(比如从0V跳到1V)。
- 用示波器或数据采集卡记录位移响应曲线。
- 从曲线上读出几个关键指标:上升时间、超调量、稳态误差、调节时间。
阶跃响应法最大的好处是快。几秒钟就能拿到结果。但它的缺点也很明显:只能看到时域特性,看不到频域细节。比如,它很难发现高频谐振。
从阶跃响应曲线能读出什么?
- 上升时间(Tr): 从10%上升到90%所需的时间。时间越短,系统响应越快。
- 超调量(Mp): 峰值超过稳态值的百分比。超调越大,系统阻尼越小。
- 稳态误差(Ess): 最终稳定值与目标值的偏差。这个值决定了你的I项需要多大。
- 调节时间(Ts): 进入±2%误差带所需的时间。这反映了系统的整体响应速度。
警告: 阶跃响应的幅值不能太大!我曾经有一次,为了看更明显的响应,给了平台一个50%满量程的阶跃。结果平台直接冲过了限位,把柔性铰链给崩了。嗯,从那以后,我阶跃测试从来不超过满量程的10%。
3.4 两种方法的对比与选择
你可能会问:那我到底该用哪种方法?
我的建议是:先用阶跃响应法快速摸底,再用扫频法精细分析。
阶跃响应法就像体检时的“问诊”,快速了解有没有明显问题。扫频法就像“CT扫描”,把系统的每一个细节都看清楚。
什么时候用阶跃响应法?
- 现场调试,时间紧迫,需要快速估算PID参数。
- 系统有明显的非线性(如摩擦、间隙),阶跃响应能直观反映出来。
- 只需要粗略的上升时间和超调量。
什么时候用扫频法?
- 需要精确的带宽和相位裕度数据。
- 系统存在高频谐振,需要设计陷波滤波器。
- 做学术研究或产品开发,需要建立精确的数学模型。
3.5 实战:用Python做一次简单的扫频辨识
光说不练假把式。我写了一个简单的Python脚本,可以帮你快速完成扫频测试。当然,实际项目中你需要用数据采集卡,但原理是一样的。
import numpy as np
import matplotlib.pyplot as plt
# 模拟一个二阶系统(纳米定位平台简化模型)
def second_order_system(freq, wn=100, zeta=0.1):
"""wn: 无阻尼自然频率(rad/s), zeta: 阻尼比"""
w = 2 * np.pi * freq
mag = 1 / np.sqrt((1 - (w/wn)**2)**2 + (2*zeta*w/wn)**2)
phase = -np.arctan2(2*zeta*w/wn, 1 - (w/wn)**2)
return mag, phase
# 扫频参数
freqs = np.logspace(0, 3, 100) # 1Hz 到 1000Hz
mags = []
phases = []
for f in freqs:
mag, phase = second_order_system(f, wn=200, zeta=0.15)
mags.append(20 * np.log10(mag)) # 转换为dB
phases.append(np.degrees(phase))
# 绘制Bode图
plt.figure(figsize=(10, 6))
plt.subplot(2, 1, 1)
plt.semilogx(freqs, mags)
plt.grid(True, which='both', linestyle='--')
plt.ylabel('幅值 (dB)')
plt.title('扫频法辨识结果 - Bode图')
plt.subplot(2, 1, 2)
plt.semilogx(freqs, phases)
plt.grid(True, which='both', linestyle='--')
plt.xlabel('频率 (Hz)')
plt.ylabel('相位 (度)')
plt.tight_layout()
plt.show()
这段代码模拟了一个谐振频率在200Hz、阻尼比0.15的二阶系统。你运行后,会看到幅频曲线在200Hz处有一个明显的尖峰,这就是平台的谐振点。
实际项目中,你需要把这段代码里的second_order_system函数替换成你的数据采集和FFT分析代码。但核心逻辑是一样的:输入正弦波,测量输出,计算幅值和相位。
3.6 避坑指南:系统辨识中的常见错误
做了这么多年,我踩过的坑不少。分享几个最常见的:
- 激励幅值太小: 信号被噪声淹没了,辨识出来的结果全是噪声。我建议信噪比至少20dB以上。
- 激励幅值太大: 平台进入非线性区(比如压电陶瓷的迟滞),辨识出来的模型是错的。记住,系统辨识的前提是系统是线性的。
- 采样率不够: 根据奈奎斯特定理,采样率至少是最高频率的2倍。但实际中,我建议5-10倍。比如你要扫到1000Hz,采样率至少10kHz。
- 忽略了环境振动: 纳米定位平台对环境振动非常敏感。做扫频时,最好在隔振台上进行,或者至少避开人员走动的时间段。
总结一下: 系统辨识不是可做可不做的“选修课”,而是PID整定的“必修课”。扫频法给你频域的全貌,阶跃响应法给你时域的直觉。两者结合,你才能真正了解你的平台。
下一章,我们会拿着这些“体检报告”,开始真正的PID参数整定。到时候你会发现,有了系统辨识的数据,整定PID就像按图索骥,轻松多了。