电机控制中的标幺化(Per Unit)全面解析:从理论到代码实践

请添加图片描述


🚀 电机控制中的标幺化(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;

标幺化模型的优势

  1. 数值稳定性:标幺化后,电机参数通常在0~1附近,避免了极大/极小数值运算
  2. 参数无关性:同一套控制代码可适用于不同功率的电机,只需调整基准值
  3. 保护逻辑简化:过流/过压保护可直接比较标幺值(如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基本方程

/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算法实现
}

📊 标幺化系统的调试技巧

基准值选择策略
根据,基准值选择需注意:

  1. 电压基准:通常采用额定相电压或ADC最大测量范围
  2. 电流基准:采用额定电流或最大允许电流
  3. 特殊处理:当电感值很小时,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;


💎 总结与实践建议

电机控制系统标幺化是提升代码可移植性、数值稳定性和系统可靠性的关键技术。通过本文的详细分析和代码示例,可以看到:

  1. 电机模型标幺化使得同一套代码可适配不同功率等级的电机
  2. PI控制器标幺化简化了参数整定,增强了系统稳定性
  3. PLL标幺化确保了相位同步精度和系统动态响应

实践建议

  • 新项目开发时优先采用标幺化系统架构
  • 基准值选择要兼顾测量范围和精度需求
  • 在定点处理器中结合Q格式实现高效运算
  • 通过仿真验证标幺化系统的动态响应(如提到的Simulink仿真)

标幺化技术虽增加了前期理解成本,但长期看显著提升代码复用性和系统维护性,是现代电机控制工程师必备的核心技能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智驾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值