
文章目录
🚀 电机控制中的标幺化(Per Unit)全面解析:从理论到代码实践
✨ 标幺化技术概述
标幺化是电机控制系统中至关重要的基础技术,它通过将物理量转换为相对值来实现系统归一化处理。这种处理方式特别适用于数字信号处理器(DSP)和微控制器(MCU)实现的电机控制系统,能有效防止数据溢出、提高计算精度,并增强算法在不同功率等级电机间的通用性。
核心思想:将物理量的实际值除以一个同单位的基准值(通常为额定值或系统最大值),得到无量纲的标幺值(pu)。例如,电压标幺值表示为: V_pu = V_actual / V_base 。
基准值选择原则:
- 电压基准值:通常采用额定相电压或系统最大允许电压
- 电流基准值:通常采用额定电流或ADC最大测量范围
- 频率基准值:根据控制系统采样频率或电机额定频率确定
🔌 电机模型标幺化
理论基础
电机模型标幺化的核心是将电压方程、磁链方程等转换为标幺形式。以永磁同步电机(PMSM)在d-q坐标系下的电压方程为例:
原始方程:
u_d = R_s*i_d + L_d*d(i_d)/dt - ω_e*L_q*i_q
u_q = R_s*i_q + L_q*d(i_q)/dt + ω_e*(L_d*i_d + ψ_f)
标幺化后:
u_d_pu = R_s_pu*i_d_pu + (1/ω_base)*d(i_d_pu)/dt - ω_e_pu*L_q_pu*i_q_pu
u_q_pu = R_s_pu*i_q_pu + (1/ω_base)*d(i_q_pu)/dt + ω_e_pu*(L_d_pu*i_d_pu + ψ_f_pu)
基准值计算
基准值的选择需要满足电机方程的内在关系:
// 基准值计算示例代码
// 假设电机额定参数
#define V_RATED 380.0f // 额定电压(V)
#define I_RATED 10.0f // 额定电流(A)
#define F_RATED 50.0f // 额定频率(Hz)
#define P_POLES 4 // 极对数
// 计算基准值
float V_base = V_RATED / sqrt(3.0f); // 相电压基准值
float I_base = I_RATED; // 电流基准值
float ω_base = 2 * PI * F_RATED; // 电角速度基准值
float Z_base = V_base / I_base; // 阻抗基准值
float L_base = Z_base / ω_base; // 电感基准值
float ψ_base = V_base / ω_base; // 磁链基准值
// 实际参数标幺化
float R_actual = 0.5f; // 实际电阻(Ω)
float Ld_actual = 0.001f; // d轴实际电感(H)
float ψf_actual = 0.1f; // 永磁体磁链(Wb)
float R_pu = R_actual / Z_base;
float Ld_pu = Ld_actual / L_base;
float ψf_pu = ψf_actual / ψ_base;
标幺化模型的优势
- 数值稳定性:标幺化后,电机参数通常在0~1附近,避免了极大/极小数值运算
- 参数无关性:同一套控制代码可适用于不同功率的电机,只需调整基准值
- 保护逻辑简化:过流/过压保护可直接比较标幺值(如I_pu > 1.2触发保护)
🎮 电流PI控制器标幺化
标幺化原理
电流环PI控制器在dq坐标系下的离散表达式为:
连续时间域:
u_out = Kp * e(t) + Ki * ∫e(t)dt
离散时间域(标幺化前):
u_out[k] = Kp * e[k] + Ki * Σe[i] * Ts
标幺化后:
u_out_pu[k] = Kp_pu * e_pu[k] + Ki_pu * Σe_pu[i] * Ts_pu
标幺化PI控制器代码实现:
// 电流PI控制器结构体定义
typedef struct {
float Kp_pu; // 比例系数(标幺)
float Ki_pu; // 积分系数(标幺)
float integral_pu; // 积分项(标幺)
float output_limit_pu; // 输出限幅(标幺,通常为1.0)
float Ts_pu; // 采样时间(标幺)
float I_base; // 电流基准值(A)
float V_base; // 电压基准值(V)
} Current_PI_Controller;
// PI控制器初始化
void PI_Current_Init(Current_PI_Controller *pi, float Kp, float Ki, float Ts, float I_base, float V_base) {
pi->Kp_pu = Kp * (I_base / V_base); // 比例系数标幺化
pi->Ki_pu = Ki * (I_base / V_base) * Ts; // 积分系数标幺化
pi->Ts_pu = Ts;
pi->I_base = I_base;
pi->V_base = V_base;
pi->integral_pu = 0.0f;
pi->output_limit_pu = 1.0f; // 标幺系统通常限幅在±1
}
// PI控制器执行函数(标幺化版本)
float PI_Current_Execute_PU(Current_PI_Controller *pi, float error_pu) {
// 比例项
float proportional_pu = pi->Kp_pu * error_pu;
// 积分项(带抗饱和)
pi->integral_pu += pi->Ki_pu * error_pu;
// 积分限幅
if (pi->integral_pu > pi->output_limit_pu) {
pi->integral_pu = pi->output_limit_pu;
} else if (pi->integral_pu < -pi->output_limit_pu) {
pi->integral_pu = -pi->output_limit_pu;
}
// 输出计算
float output_pu = proportional_pu + pi->integral_pu;
// 输出限幅
if (output_pu > pi->output_limit_pu) {
output_pu = pi->output_limit_pu;
} else if (output_pu < -pi->output_limit_pu) {
output_pu = -pi->output_limit_pu;
}
return output_pu;
}
// 标幺值转换为实际电压
float PU_to_Voltage(float value_pu, float V_base) {
return value_pu * V_base;
}
抗饱和(Anti-Windup)处理
在实际系统中,积分饱和是常见问题,需要特殊处理:
// 改进的PI控制器(带抗饱和处理)
float PI_Current_Execute_AntiWindup(Current_PI_Controller *pi, float error_pu, float actual_output_pu) {
// 比例项
float proportional_pu = pi->Kp_pu * error_pu;
// 积分项
pi->integral_pu += pi->Ki_pu * error_pu;
// 抗饱和处理:当输出饱和时,停止积分
float output_pu = proportional_pu + pi->integral_pu;
if (output_pu > pi->output_limit_pu) {
output_pu = pi->output_limit_pu;
// 输出饱和时,停止积分增长
if (error_pu > 0) {
pi->integral_pu -= pi->Ki_pu * error_pu; // 回退本次积分
}
} else if (output_pu < -pi->output_limit_pu) {
output_pu = -pi->output_limit_pu;
// 输出饱和时,停止积分增长
if (error_pu < 0) {
pi->integral_pu -= pi->Ki_pu * error_pu; // 回退本次积分
}
}
return output_pu;
}
🔄 锁相环(PLL)标幺化
PLL标幺化原理
锁相环在电机控制中用于精确跟踪电机反电动势相位,其标幺化处理重点在环路滤波器参数。
PLL基本方程:
dθ/dt = ω_base + Kp*e_θ + Ki*∫e_θdt
其中e_θ是相位误差。
标幺化后:
dθ_pu/dt = 1 + Kp_pu*e_θ_pu + Ki_pu*∫e_θ_pudt
标幺化PLL代码实现:
// 标幺化PLL结构体
typedef struct {
float Kp_pu; // 比例系数(标幺)
float Ki_pu; // 积分系数(标幺)
float integral_pu; // 积分项(标幺)
float theta_pu; // 输出相位(标幺,0~1对应0~2π)
float omega_pu; // 输出频率(标幺)
float omega_base; // 基准频率(rad/s)
float Ts_pu; // 采样时间(标幺)
float output_limit_pu; // 输出限幅
} PLL_Controller;
// PLL初始化
void PLL_Init(PLL_Controller *pll, float Kp, float Ki, float Ts, float omega_base) {
pll->Kp_pu = Kp / omega_base; // 比例系数标幺化
pll->Ki_pu = Ki / omega_base * Ts; // 积分系数标幺化
pll->omega_base = omega_base;
pll->Ts_pu = Ts;
pll->integral_pu = 0.0f;
pll->theta_pu = 0.0f;
pll->omega_pu = 1.0f; // 初始化为基准频率
pll->output_limit_pu = 0.2f; // 频率变化限幅
}
// PLL相位检测(基于q轴电压)
float PLL_Phase_Detector(float u_alpha, float u_beta, float theta_est) {
// 计算q轴分量(在估计的d-q坐标系下)
float sin_theta = sinf(2 * PI * theta_est);
float cos_theta = cosf(2 * PI * theta_est);
// q轴电压 = -u_alpha*sinθ + u_beta*cosθ
float u_q = -u_alpha * sin_theta + u_beta * cos_theta;
return u_q; // 作为相位误差
}
// 标幺化PLL执行函数
void PLL_Execute_PU(PLL_Controller *pll, float u_alpha, float u_beta) {
// 1. 相位检测(获取相位误差)
float phase_error = PLL_Phase_Detector(u_alpha, u_beta, pll->theta_pu);
// 标幺化相位误差(归一化到±1范围内)
float phase_error_pu = phase_error / pll->omega_base;
// 2. PI控制器处理相位误差
float proportional = pll->Kp_pu * phase_error_pu;
pll->integral_pu += pll->Ki_pu * phase_error_pu;
// 积分限幅
if (pll->integral_pu > pll->output_limit_pu) {
pll->integral_pu = pll->output_limit_pu;
} else if (pll->integral_pu < -pll->output_limit_pu) {
pll->integral_pu = -pll->output_limit_pu;
}
// 3. 频率调整
float delta_omega_pu = proportional + pll->integral_pu;
pll->omega_pu = 1.0f + delta_omega_pu; // 1pu对应基准频率
// 4. 相位积分
pll->theta_pu += pll->omega_pu * pll->Ts_pu;
// 相位归一化(0~1范围)
if (pll->theta_pu >= 1.0f) {
pll->theta_pu -= 1.0f;
} else if (pll->theta_pu < 0.0f) {
pll->theta_pu += 1.0f;
}
}
// 获取实际频率值(Hz)
float PLL_Get_Frequency_Hz(PLL_Controller *pll) {
return (pll->omega_pu * pll->omega_base) / (2 * PI);
}
// 获取实际相位值(rad)
float PLL_Get_Phase_Rad(PLL_Controller *pll) {
return pll->theta_pu * 2 * PI;
}
PLL参数整定建议
根据,PLL带宽通常设置为同步频率的10倍左右:
// PLL参数整定示例
float sync_freq = 50.0f; // Hz
float pll_bandwidth = 10.0f * sync_freq; // 500Hz
float omega_base = 2 * PI * sync_freq;
// 根据带宽计算PI参数
float Kp = 2 * PI * pll_bandwidth;
float Ki = (2 * PI * pll_bandwidth) * (2 * PI * pll_bandwidth) / 4;
PLL_Init(&pll_controller, Kp, Ki, 0.0001f, omega_base); // Ts=100us
💻 完整系统集成示例
下面展示一个完整的FOC系统标幺化集成示例:
// FOC系统标幺化集成示例
typedef struct {
// 电机参数(标幺)
float R_s_pu;
float Ld_pu;
float Lq_pu;
float psi_f_pu;
// 控制器
Current_PI_Controller id_pi;
Current_PI_Controller iq_pi;
PLL_Controller pll;
// 基准值
float I_base;
float V_base;
float Omega_base;
float Psi_base;
// 系统状态(标幺)
float id_ref_pu;
float iq_ref_pu;
float theta_pu;
float omega_pu;
} FOC_System;
// FOC系统初始化
void FOC_System_Init(FOC_System *foc, Motor_Params *params) {
// 计算基准值
foc->I_base = params->I_rated;
foc->V_base = params->V_rated / sqrt(3.0f);
foc->Omega_base = 2 * PI * params->f_rated;
foc->Psi_base = foc->V_base / foc->Omega_base;
// 电机参数标幺化
foc->R_s_pu = params->R_s / (foc->V_base / foc->I_base);
foc->Ld_pu = params->Ld / foc->Psi_base * foc->I_base;
foc->Lq_pu = params->Lq / foc->Psi_base * foc->I_base;
foc->psi_f_pu = params->psi_f / foc->Psi_base;
// 控制器初始化
PI_Current_Init(&foc->id_pi, 0.5f, 100.0f, 0.0001f, foc->I_base, foc->V_base);
PI_Current_Init(&foc->iq_pi, 0.5f, 100.0f, 0.0001f, foc->I_base, foc->V_base);
float pll_bandwidth = 10.0f * params->f_rated;
float Kp_pll = 2 * PI * pll_bandwidth;
float Ki_pll = (Kp_pll * Kp_pll) / 4;
PLL_Init(&foc->pll, Kp_pll, Ki_pll, 0.0001f, foc->Omega_base);
}
// FOC主循环函数
void FOC_Execute(FOC_System *foc, float ia, float ib, float u_dc) {
// 1. Clarke变换
float i_alpha = ia;
float i_beta = (ia + 2.0f * ib) / sqrt(3.0f);
// 2. 位置估算(通过PLL)
float u_alpha, u_beta; // 需从ADC获取或估算
PLL_Execute_PU(&foc->pll, u_alpha, u_beta);
foc->theta_pu = foc->pll.theta_pu;
// 3. Park变换(使用估算的角度)
float sin_theta = sinf(2 * PI * foc->theta_pu);
float cos_theta = cosf(2 * PI * foc->theta_pu);
float id = i_alpha * cos_theta + i_beta * sin_theta;
float iq = -i_alpha * sin_theta + i_beta * cos_theta;
// 标幺化电流
float id_pu = id / foc->I_base;
float iq_pu = iq / foc->I_base;
// 4. 电流环PI控制
float id_error_pu = foc->id_ref_pu - id_pu;
float iq_error_pu = foc->iq_ref_pu - iq_pu;
float ud_pu = PI_Current_Execute_PU(&foc->id_pi, id_error_pu);
float uq_pu = PI_Current_Execute_PU(&foc->iq_pi, iq_error_pu);
// 5. 前馈解耦(标幺化版本)
ud_pu += -foc->omega_pu * foc->Lq_pu * iq_pu;
uq_pu += foc->omega_pu * (foc->Ld_pu * id_pu + foc->psi_f_pu);
// 6. 反Park变换
float u_alpha_ref = ud_pu * cos_theta - uq_pu * sin_theta;
float u_beta_ref = ud_pu * sin_theta + uq_pu * cos_theta;
// 7. SVM调制(将标幺电压转换为占空比)
// ... SVM算法实现
}
📊 标幺化系统的调试技巧
基准值选择策略
根据,基准值选择需注意:
- 电压基准:通常采用额定相电压或ADC最大测量范围
- 电流基准:采用额定电流或最大允许电流
- 特殊处理:当电感值很小时,G系数(Ts/L)可能大于1,需左移处理:
// 小电感特殊处理
float L_actual = 0.00001f; // 10uH
float G_actual = Ts / L_actual; // 可能远大于1
// 左移处理
int shift_bits = 0;
while (G_actual > 1.0f && shift_bits < 16) {
G_actual /= 2.0f;
shift_bits++;
}
// 计算时需考虑左移补偿
Q格式与标幺化结合
在定点DSP中,标幺化常与Q格式结合:
// Q15格式标幺值处理(定点DSP)
#define Q15_SCALE (32767.0f)
// 标幺值转换为Q15
short voltage_pu_q15 = (short)(voltage_pu * Q15_SCALE);
// Q15转换为标幺值
float voltage_pu = (float)voltage_pu_q15 / Q15_SCALE;
// Q15格式PI运算
long proportional_q15 = (long)(Kp_q15 * error_q15) >> 15;
integral_q15 += (long)(Ki_q15 * error_q15) >> 15;
💎 总结与实践建议
电机控制系统标幺化是提升代码可移植性、数值稳定性和系统可靠性的关键技术。通过本文的详细分析和代码示例,可以看到:
- 电机模型标幺化使得同一套代码可适配不同功率等级的电机
- PI控制器标幺化简化了参数整定,增强了系统稳定性
- PLL标幺化确保了相位同步精度和系统动态响应
实践建议:
- 新项目开发时优先采用标幺化系统架构
- 基准值选择要兼顾测量范围和精度需求
- 在定点处理器中结合Q格式实现高效运算
- 通过仿真验证标幺化系统的动态响应(如提到的Simulink仿真)
标幺化技术虽增加了前期理解成本,但长期看显著提升代码复用性和系统维护性,是现代电机控制工程师必备的核心技能。
1万+

被折叠的 条评论
为什么被折叠?



