0%

电机参数辨识算法

电机参数识别算法个人心得 —— 递归最小二乘法(RLS)

1. 为什么要做参数辨识

最近在项目里需要搞电机的参数估计,说白了就是要实时获取电机的关键参数,比如定子电阻 、定子电感 还有磁链。之前一直觉得参数测量这种事是硬件组的活儿,没想到我也要弄。于是就开始研究递归最小二乘法(RLS),发现它不仅能搞定这些参数,还能实时更新,在参数整定方面还是很实用的。所以,这篇笔记就是我在搞清楚这套算法之后的心得,边学边写,顺便记个脑子。

2. 电机的 d-q 轴模型

先从基础说起。电机的 d-q 轴模型其实不复杂,就是把三相电机的电压和电流转换成一个固定的参考系。可以这么理解:通过数学变换,把三相电流、电压搞成两个直轴上的量,这样计算起来方便很多,尤其是在控制上。

方程如下:

我们可以把电压 ,电流 ,以及电角速度 看作已知的测量值。通过这两个方程,我们可以推导出 和磁链 的表达式。没错,目标就是把这些参数“猜”出来。

然后再做个假设:磁链 跟电流 是线性关系(这是合理的物理假设):

3. 离散化是个啥?

在电机控制里,信号是离散的(因为都是采样来的数据)。所以,我们得把连续的公式转换成离散形式。最简单的办法就是用有限差分公式,比如:

这意思就是我们用电流的差值除以采样周期 来近似电流的导数。用这个方式,我们可以把之前的电机方程转换成离散形式:

公式虽然有点长,但不用慌,核心就是把电压、电流、速度这些量联系起来,然后推导出

4. 递归最小二乘法(RLS)

现在,重点来了——RLS。说简单点,RLS 是个在线学习算法,它通过历史数据和新数据结合起来,不断优化你要估计的参数。RLS 的公式看起来也没那么复杂,就是矩阵乘法+求逆:

  1. 更新数据矩阵

    其中 是遗忘因子(你可以理解成新数据和旧数据的权重比例,值越接近 1,旧数据占的比重越大)。

  2. 求逆
    如果增广矩阵 的条件数过低(就是说矩阵的逆不好求),就加个小扰动(防止算不出逆)。

  3. 更新参数

    这个公式就是通过反馈误差,不断优化参数的过程。

5. 代码解析

写了半天理论,终于到代码部分了!下面是这个算法的代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
function [Rs,Ls,Flux] = param_identify(ud, uq, id, iq, we)
% 参数初始化
persistent A_star x iq_last id_last I_unit lamda;

if isempty(A_star)
A_star = single(eye(3)); % 初始化协方差矩阵
x = single(zeros(3, 1)); % 参数向量 [Rs, Ls, Psi]
I_unit = single(eye(3)); % 单位矩阵
iq_last = single(0);
id_last = single(0);
lamda = single(1); % 遗忘因子

% 初始估计值
x(1)=0.45; % Rs 初始值
x(2)=0.0085; % Ls 初始值
x(3)=0.171; % Psi 初始值
end

Tpwm = 10000; % PWM 采样周期

% 构造 alpha_k 矩阵
alpha_k = single([iq, we * id+(iq - iq_last) * Tpwm, we;
id, (id - id_last) * Tpwm - we * iq, 0]);
beta_k = single([uq; ud]);

% 更新上次的电流值
iq_last = single(iq);
id_last = single(id);

% 更新 A_star 矩阵
A_star = single(lamda * A_star + alpha_k' * alpha_k);

% 判断 A_star 是否可逆
if rcond(A_star) < eps
% 如果不可逆,可以考虑加入扰动项,但这里注释掉了
%A_star_inv = single((A_star + k * I_unit) \ I_unit);
else
A_star_inv = single(A_star \ I_unit);
% 参数更新
x = x + single(A_star_inv * alpha_k' * (beta_k - alpha_k * x));
end

% 输出参数估计值
Rs = x(1);
Ls = x(2);
Flux = x(3);
end

核心部分:

  • 初始化:用 persistent 来保存历史数据,保持每次调用函数时的上下文。
  • 矩阵更新:用当前时刻的输入输出数据构造矩阵
  • 参数更新:判断 的逆是否存在,若存在则更新参数向量
  • 输出结果:返回当前估计的

6. 最后总结

递归最小二乘法真的是个强大工具,尤其是做这种在线参数估计的时候,它能在数据变化的情况下自适应调整参数。这段代码的实现核心思想很简单:通过历史数据和新数据的结合,不断优化你想要的参数。当然了,实际用的时候,调参也很重要,尤其是遗忘因子 这东西,得根据具体情况调到合适的值。

好了,学完 RLS,电机参数识别这部分算是搞定了,接下来就可以尝试在实际系统中跑一跑,看效果了。