2. 数字PID与模拟PID的区别:采样周期、量化误差对系统的影响
说实话,很多做运动控制的工程师,一开始都觉得PID嘛,不就是调三个参数的事?
但等你真正把PID算法往FPGA里一塞,就会发现事情没那么简单。数字PID和模拟PID,虽然名字里都有PID,但它们的脾气秉性差得挺远。
我最早做伺服驱动器的时候,就吃过这个亏。当时照着模拟电路的参数直接往数字PID里填,结果电机抖得像筛糠。后来才明白,采样周期和量化误差这两个东西,是数字PID绕不过去的坎。
2.1 模拟PID:连续世界的理想模型
模拟PID是用运放、电阻、电容搭出来的。信号是连续的,没有中断,没有延迟。
它的数学表达式长这样:
u(t) = Kp * e(t) + Ki * ∫e(t)dt + Kd * de(t)/dt
你看,积分是连续的积分,微分是连续的微分。说白了,模拟PID就像一条平滑的河流,水流一直不停,没有断点。
但问题来了——模拟电路有温漂,有元件老化,而且参数调起来很麻烦。你想改个Kp值?得换电阻。这在产品迭代中简直要命。
2.2 数字PID:离散世界的工程妥协
数字PID就不一样了。它把连续信号切成了一个个时间片。每个时间片里,CPU或FPGA算一次控制量。
它的表达式变成了这样:
u(k) = Kp * e(k) + Ki * Σe(i)*Ts + Kd * [e(k) - e(k-1)] / Ts
注意看,积分变成了累加,微分变成了差分。Ts就是采样周期。
这里有个关键点:数字PID永远是在“事后”做控制。你采样到当前误差,算完输出,电机动一下,然后等下一个采样点再来。这中间的时间差,就是延迟。
核心区别一句话总结:
模拟PID是“边看边调”,数字PID是“看一眼,算一下,调一下”。
2.3 采样周期:数字PID的命门
采样周期Ts,是数字PID最重要的参数之一。我甚至觉得它比Kp、Ki、Kd还关键。
采样周期太大会怎样?
- 系统响应变慢。你想想看,电机都跑出去老远了,你才反应过来要调整,这能稳吗?
- 微分项失效。微分本质上是预测未来,采样间隔太大,相邻两次误差的变化已经不能反映真实趋势了。
- 积分项容易饱和。误差累积时间太长,积分项会冲得很高,导致超调。
采样周期太小呢?
- 计算量暴增。FPGA虽然快,但也不是无限快的。采样周期小到一定程度,你的PID运算还没算完,下一个采样点又来了。
- 微分项对噪声敏感。采样间隔越小,相邻误差的差值受噪声影响越大。我见过有人把采样周期设到1微秒,结果微分项输出全是毛刺。
我的经验:
采样周期一般取系统机械时间常数的1/10到1/20。比如电机的时间常数是10ms,那采样周期设在0.5ms到1ms之间比较合适。当然,这只是个起点,具体还得看实际效果。
2.4 量化误差:被忽略的精度杀手
量化误差是什么?说白了,就是ADC把模拟量转成数字量时,丢掉的精度。
假设你的ADC是12位的,量程0-3.3V,那么一个LSB代表3.3V/4096 ≈ 0.8mV。如果你的误差信号只有0.4mV,ADC根本分辨不出来,直接当成0处理。
量化误差对PID的影响,主要体现在三个方面:
- 稳态误差变大:当误差小于1个LSB时,数字PID看到的误差是0,积分项停止累加,系统永远到不了目标位置。这就是所谓的“静差”。
- 微分项抖动:量化噪声会被微分项放大。你想想看,相邻两次采样值可能因为量化误差差了一个LSB,微分项就会输出一个很大的值,导致系统抖动。
- 积分项死区:误差太小,积分项不累加;误差突然变大,积分项又猛地跳一下。这种非线性行为,会让系统变得很难调。
我曾经踩过的坑:
有一次做高精度定位,用了16位ADC,觉得精度够了。结果系统在目标位置附近来回晃,就是稳不住。查了两天才发现,是量化误差导致微分项在零点附近反复跳变。后来加了死区处理,问题才解决。
2.5 知识体系:一张图看懂区别
下面这张图,是我自己总结的数字PID与模拟PID的核心差异。你看一眼就能明白:
2.6 如何应对采样周期和量化误差?
知道了问题在哪,接下来就是怎么解决。我分享几个实战中用过的方法:
应对采样周期:
- 多速率采样:电流环用高速率(比如10kHz),速度环用中速率(1kHz),位置环用低速率(100Hz)。没必要所有环路都用同一个采样周期。
- 预测补偿:在FPGA里做一个简单的预测器,估算两次采样之间的误差变化,减少延迟影响。
- 过采样:用比控制周期更快的速度采样,然后做平均或滤波,提高有效分辨率。
应对量化误差:
- 增加ADC位数:从12位换到16位,甚至24位。代价是成本上升,采样速度下降。
- 死区处理:在误差小于某个阈值时,强制让积分项停止累加,避免静差。
- 微分项滤波:对微分项做一阶低通滤波,把量化噪声滤掉。我常用的截止频率是控制频率的1/10。
- 增量式PID:用增量式代替位置式,可以减少积分饱和和量化误差的影响。
一个小技巧:
在FPGA里实现PID时,我习惯把内部变量都用定点数表示,并且保留足够的整数位和小数位。比如用Q16.16格式,这样既能保证精度,又不会占用太多资源。
2.7 实战中的选择建议
说了这么多,到底什么时候用模拟PID,什么时候用数字PID?
| 应用场景 | 推荐方案 | 理由 |
|---|---|---|
| 高精度定位(纳米级) | 模拟PID + 数字校正 | 模拟电路无量化误差,适合极低误差场景 |
| 高速伺服(kHz级带宽) | 数字PID(FPGA实现) | FPGA延迟低,可编程,适合复杂算法 |
| 低成本电机控制 | 数字PID(MCU实现) | 成本敏感,MCU够用,不需要太高精度 |
| 温度控制(慢变系统) | 数字PID(任意平台) | 系统响应慢,采样周期要求不高 |
我个人更倾向于数字PID,尤其是用FPGA实现。原因很简单:灵活、可重复、可调试。模拟电路调好了就别想动,数字PID改个参数就是几行代码的事。
但你要记住,数字PID不是万能的。采样周期和量化误差这两个东西,就像悬在头上的两把剑。你处理好了,系统稳如老狗;你忽略了,系统抖成筛子。
最后说一句:
做运动控制,别光盯着Kp、Ki、Kd。先把采样周期和量化误差搞明白,你的PID调参之路会顺畅很多。
公众号:蓝海资料掘金营,微信deep3321