欢迎光临
我们一直在努力

电流环 PI 控制器(六)

第 6 篇:电流环 PI 控制器

前面搭好了 SVPWM(执行器)和电流采样(传感器),现在缺一个大脑——控制器。

电流环是 FOC 最内层的闭环,也是最重要的一环。速度环和位置环都建立在电流环之上,电流环不稳,后面全崩。


1. PI 控制器的直觉

PI = P(比例)+ I(积分)

P:看到误差立刻反应——"现在差多少?"
反应快,但会有稳态误差(永远差一点点)

I:把过去的误差累加起来——"欠了多少?"
消除稳态误差,但反应慢,还容易积分饱和

速度环用 PI、电流环用 PI、有些位置环只用 P——PI 在电机控制里几乎是万能的。


2. 离散化 PI 控制器实现

typedef struct {
float kp; // 比例系数
float ki; // 积分系数
float integral; // 积分累加器
float output_max; // 输出上限
float output_min; // 输出下限
float integral_max; // 积分限幅
float integral_min;
} pi_controller_t;

void pi_init(pi_controller_t *pi, float kp, float ki,
float out_max, float out_min)
{
pi->kp = kp;
pi->ki = ki;
pi->integral = 0;
pi->output_max = out_max;
pi->output_min = out_min;
pi->integral_max = out_max;
pi->integral_min = out_min;
}

float pi_update(pi_controller_t *pi, float setpoint, float feedback, float dt)
{
float error = setpoint feedback;

// 比例项
float p_out = pi->kp * error;

// 积分项(带限幅)
pi->integral += pi->ki * error * dt;
if (pi->integral > pi->integral_max)
pi->integral = pi->integral_max;
if (pi->integral < pi->integral_min)
pi->integral = pi->integral_min;

float i_out = pi->integral;

// 总输出(带限幅)
float output = p_out + i_out;
if (output > pi->output_max) output = pi->output_max;
if (output < pi->output_min) output = pi->output_min;

return output;
}


3. 电流环结构

FOC 有两个独立的电流环:

id_ref ──→ [PI_d] ──→ Vd ──→ 反Park ──→ SVPWM ──→ 电机

iq_ref ──→ [PI_q] ──→ Vq ──→ 反Park ──→ SVPWM ──→ 电机
↑ ↑
id_fb, iq_fb ←── Park ←── Clarke ←── ADC

d 轴电流环控制励磁,q 轴电流环控制转矩。


4. 电流环主循环代码

#define PWM_FREQ 20000.0f // 20kHz
#define CURRENT_DT (1.0f / PWM_FREQ)

pi_controller_t pi_d, pi_q;
float id_ref = 0.0f; // 表贴式电机 id_ref = 0
float iq_ref = 0.5f; // 目标电流 0.5A

void foc_current_loop(float theta_e)
{
// 1. 读三相电流
phase_current_t curr_raw = read_phase_currents();

// 2. Clarke 变换
float i_alpha, i_beta;
clarke_transform(curr_raw.ia, curr_raw.ib, curr_raw.ic,
&i_alpha, &i_beta);

// 3. Park 变换
float id, iq;
park_transform(i_alpha, i_beta, theta_e, &id, &iq);

// 4. PI 控制
float vd = pi_update(&pi_d, id_ref, id, CURRENT_DT);
float vq = pi_update(&pi_q, iq_ref, iq, CURRENT_DT);

// 5. 反 Park 变换
float v_alpha, v_beta;
inv_park_transform(vd, vq, theta_e, &v_alpha, &v_beta);

// 6. SVPWM
uint8_t sector = get_sector(v_alpha, v_beta);
float ta, tb, tc;
calc_svpwm_duty(v_alpha, v_beta, VDC, sector, &ta, &tb, &tc);
set_pwm_duty(ta, tb, tc);
}

在定时器中断中调用 foc_current_loop,每 50μs(20kHz)执行一次。


5. 前馈解耦——让电流环更稳

前面的 PI 控制器忽略了 dq 轴之间的耦合。高速时耦合项(ω×Lq×iq 和 ω×Ld×id)会变显著,导致电流环响应变差。

// 在 PI 输出上叠加前馈解耦项
float vd_ff = omega_e * Lq * iq;
float vq_ff = omega_e * (Ld * id + flux_linkage);

vd = pi_update(&pi_d, id_ref, id, dt) + vd_ff;
vq = pi_update(&pi_q, iq_ref, iq, dt) + vq_ff;

前馈项不经过 PI,直接加在输出上——相当于"预判"了耦合的影响。


6. 电流环 PI 参数初始值计算

在不知道具体参数时,用带宽法估算初始值:

电流环带宽 ω_c = PWM频率 / 20 (如 20kHz/20 = 1kHz)
Kp = ω_c × Ld (或 Lq)
Ki = ω_c × Rs

例如:Ld = 0.5mH, Rs = 0.5Ω, ω_c = 2π × 1000 = 6283
Kp = 6283 × 0.0005 = 3.14
Ki = 6283 × 0.5 = 3141

这只是初始值,后面需要实测调优(第 11 篇会详细讲)。


7. 验证:电流阶跃响应

给 iq_ref 施加一个阶跃信号(如 0 → 0.5A),用上位机观察 iq_fb 的响应:

理想的电流阶跃响应:
– 上升时间:几个 PWM 周期内跟上
– 超调量:< 10%
– 稳态误差:接近 0

如果震荡——Kp 太大;如果响应慢——Kp 太小或 Ki 太小。


8. 小结

  • d 轴和 q 轴电流环独立控制,实现了转矩和励磁的解耦
  • PI 控制器简单但够用,关键是参数整定
  • 前馈解耦在高速时显著提升电流环性能
  • 电流环跑在 20kHz 定时器中断中,是整个 FOC 的心跳

下一篇:编码器与角度反馈——位置环的第一步


下一篇:编码器与角度反馈——位置环的第一步

赞(0)
未经允许不得转载:171主机测评 » 电流环 PI 控制器(六)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址