直流有刷电机的系统辨识与前馈控制
为了更好地控制直流有刷电机,我们常常会在速度环的输出上加上前馈,以使得电机更快地到达目标转速。
系统建模
一般来说,直流有刷电机控制的物理过程是这样的:PWM占空比 -> 电压 -> 电流 -> 力矩 -> 角加速度 -> 角速度。
让我们用更加物理的语言描述这个过程。
占空比 D 和线圈两端电压 Us 呈正比关系,为了简化计算表达,我们直接认为 PWM 的本质就是电压 Us。
当然这两者单位肯定不一样就是。甚至占空比是一个无量纲量。不过为了讨论方便我们直接讨论电压而不是占空比。
根据欧姆定律,我们有电压 U 和电流 I 的关系:
I=RU
考虑电机在转速 ω 下产生的反向电动势 E:
E=Keω
电机线圈两端真正的电压是:
Us−E
代入上面的欧姆定律公式得:
I=RUs−Keω
接下来电流 I 产生的力矩 Te 也近似满足比例关系:
Te=KtI
其中 Kt 是个常数。
大学物理告诉我们,对于旋转运动,力矩 T、转动惯量 J、角加速度 α 满足关系:
T=Jα
代入上面的力矩和电流的关系式 Te=KtI,我们可以得到角加速度 α 和电流 I 的关系为:
α=JTe=JKtI
角加速度 α 是角速度 ω 对时间 t 的导数:
α=dtdω
于是我们把上面那几坨全部无脑代入,就有了占空比 D 影响角速度 ω 的完整物理公式:
dtdω=JKtR(Us−Keω)
整理一下就有:
Jdtdω=RKt(Us−Keω)
这就是忽略摩擦、负载、电感的电机物理模型。
推导需要辨识的参数
我们把这个公式展开、移项:
KtKeRJdtdω+ω=Ke1Us
令
τ=KtKeRJ
以及
K=Ke1
我们就能得到:
τdtdω+ω=KUs
由于角加速度 dtdω 可以表示为 ω˙:
τω˙+ω=KUs
于是我们得到了最终的忽略电机电感、摩擦、负载的参数辨识公式。
我们只需要知道 τ 和 K,就可以直接通过目标转速求解出电机占空比,以此实现在无负载条件下开环控制电机转速。
参数辨识
那么我们如何知道 τ 和 K 这两个参数呢?
首先我们考虑一个很简单的情况:电机加速到稳定匀速。
求系统增益
此时角加速度 ω˙=0,我们就可以得到当时间 t→∞ 时的转速 ω∞ 和电压 U0 满足关系:
KU0=ω∞
也就是只要给电机一个恒定的电压 U0(也就是恒定的占空比 D),通过编码器读出转速 ω∞,就能直接求出 K。
求时间常数
接下来就要解决 τ 怎么求。这就需要一点点数学上的技巧。
首先我们看 τ 的原始表达式:
τ=KtKeRJ
利用量纲法我们可以发现 τ 的单位是时间(这也是为啥 τ 被叫做时间常数)。
于是我们可以猜测 τ 实际上是系统在某一状态下的时间。
因此我们需要求出系统在给定电压 U0 后从 0 开始加速的这个过程中唯一的可观测量 ω,也就是电机转速关于时间的表达式 ω(t)。
这就需要一点点数学上的技巧。
首先我们对原公式进行换元,令
x=KU0−ω
x 对 t 求导,由于 KU0 在上文的恒定电压场景下是一个常数,于是我们得到:
dtdx=dtd(KU0−ω)=−dtdω
回看原式:
τdtdω+ω=KU0
代入 x=KU0−ω,注意到:
dtdω=τx
于是我们有:
dtdx=−τx
这是一个一阶线性齐次常微分方程。我们来解这个方程。首先整理为:
xdx=−τ1dt
积分得:
∫x1dx=−τ1∫dt
求得:
lnx=−τ1t+C
两边取指数,我们最终可以解得:
x=Ce−t/τ
这就是 x 关于 t 的函数:
x(t)=Ce−t/τ
接下来我们要求常数 C 是个啥。毕竟原始公式里面没有这玩意,我们肯定不能再辨识一个参数。
于是我们注意到当 t=0 时,也就是电机刚启动的时候:
ω(0)=0
也就是电机刚启动的时候转速为 0。
那么代入我们前面换元的 x 的公式 x=KU0−ω,就有:
x(0)=KU0−ω(0)
毕竟 K 和 U0 在我们上面提到的电压恒定场景下都是常数。
于是:
x(0)=KU0
代回刚才我们解出的 x(t)=Ce−t/τ,就有:
x(0)=Ce0=C=KU0
最终我们得到:
x(t)=KU0e−t/τ
然后我们把 x 的换元 x(t)=KU0−ω(t) 再换回去:
ω(t)=KU0−x(t)=KU0−KU0e−t/τ=KU0(1−e−t/τ)
我们最终得到了这个十分重要的公式:
ω(t)=KU0(1−e−t/τ)
于是我们就可以回过头来看我们的问题:如何辨识 τ?
我们发现,在 t=τ 时,公式就看起来非常好看了:
ω(τ)=KU0(1−e−τ/τ)=KU0(1−e−1)
然后这个 KU0 我们利用系统在 t→∞ 时的状态也已经求出:
KU0=ω∞
再加上
1−e−1≈0.632
于是我们有:
ω(τ)≈0.632ω∞
也就是说我们只要记录电机从 0 加速到 0.632ω∞ 的时间就可以算出 τ 了!
这就是著名的 63.2% 法。
总结
我们可以在电机无负载的状态下给电机一个阶跃电压 U0,然后记录电机从转速为 0 到转速稳定的时间 t 和转速 ω 的关系图。
一般来说我们会直接假设一个电机转速稳定需要的最长时间 T,我们直接记录 0∼T 这段时间内的 t 和转速 ω 的关系,并且对末尾段取几个点的平均值,就可以找到 ω∞ 了。
找到 ω∞ 后,我们可以直接计算:
K=U0ω∞
然后通过查表,找到电机加速到 0.632ω∞ 对应的时间,就是 τ。
前馈控制
得到了电压和实际转速的关系式,就可以开始着手设计闭环方案了。
由于大部分电机都是运行在有负载工况下,我们可以比较无脑地直接对系统在有负载工况下进行参数辨识。虽然这和实际模型是有差别的,但是差别在负载固定且仅仅将辨识参数用于计算速度环前馈的场景下几乎可以忽略。
无脑将 PI 速度环的输出和我们计算出的这个前馈输出相加,就可以得到经典的带有前馈的速度环方案了:

也就是说,对于目标恒定转速 ω0,此时目标加速度 ω0˙=0,我们可以直接代入电机模型,得到前馈电压 Uff:
Uff=Kω0
其实就是一个标准的线性关系。
除此之外,还能借助我们前面辨识出的 K 和 τ,和我们人为给定的一个电机响应速度 λ,就可以推导出电机速度环的 Kp 和 Ki 参数:
Kp=Kλτ
Ki=Kλ1
但是实际调试中这两个参数其实并不是十分好用,不如手调得好。加上推导过程比较简单,因此推导过程这里不做展开(其实是因为懒得写了)。