
FOC单电阻采样电流重构的Matlab仿真
最近在调FOC遇到个头疼的问题——单电阻采样电流重构总是不准,索性用Matlab搭了个仿真模型摸
清它的脾气。这玩意儿看着简单,实际藏着不少魔鬼细节,今天就把踩过的坑和代码实现掰开了说说。
先看单电阻采样的核心痛点:采样窗口稍纵即逝。代码里这个时间参数设置不好,后面怎么算都是
白搭。咱先用Simulink里的PWM模块生成典型的三相波形:
```matlab
% 生成两电平PWM波形
carrier = sawtooth(2*pi*Fsw*t, 0.5);
Ua = 0.5*M + 0.5*M.*sin(2*pi*Freq*t);
Ub = 0.5*M + 0.5*M.*sin(2*pi*Freq*t - 2*pi/3);
Uc = 0.5*M + 0.5*M.*sin(2*pi*Freq*t + 2*pi/3);
PWM_A = (Ua > carrier) - (Ua < -carrier);
```
关键在采样时刻的捕获。仿真中发现,当任意两相桥臂下管同时导通时(比如PWM_A低电平且PWM_B
低电平),母线电流才流过采样电阻。这时候ADC触发必须卡在电流稳定的平台区,早了晚了都会采到毛刺:
```matlab
% 确定有效采样窗口
valid_region = (PWM_A < 0) & (PWM_B < 0) | ...
(PWM_B < 0) & (PWM_C < 0) |
(PWM_C < 0) & (PWM_A < 0);
sampling_point = find(diff(valid_region)>0) + 1;
```
电流重构算法这块,传统方案是每个扇区用特定公式计算,但实际仿真中发现噪声容限太低。后来
改用最小二乘拟合,把相邻三个采样点的数据扔进矩阵运算:
```matlab
H = [cos(theta-30), sin(theta-30);
cos(theta+90), sin(theta+90);
cos(theta+210), sin(theta+210)];
I_alpha_beta = pinv(H) * [I_samp1; I_samp2; I_samp3];
```