基于TMS320F28335的永磁同步电机矢量控制源程序实现

基于TMS320F28335的永磁同步电机矢量控制源程序实现,包含硬件抽象层、坐标变换、滑模观测器和SVPWM调制等核心模块:


一、系统架构设计

+---------------------+
| 主程序              |
| - 系统初始化        |
| - 主循环            |
+----------+----------+
           |
           v
+----------+----------+
| 中断服务            |
| - ADC采样中断       |
| - EPWM中断          |
+----------+----------+
           |
           v
+----------+----------+
| 矢量控制算法        |
| - 电流环PI          |
| - 速度环滑模观测器  |
| - 坐标变换          |
+----------+----------+
           |
           v
+----------+----------+
| 硬件抽象层          |
| - EPWM配置          |
| - ADC配置           |
| - QEP编码器接口     |
+---------------------+

二、核心代码实现

1. 系统初始化

#include "DSP28x_Project.h"
#include "foc.h"

// 全局变量
FocCtrl gFocCtrl;  // 矢量控制结构体
MotorParam gMotor; // 电机参数

void System_Init() {
    // 硬件初始化
    InitSysCtrl();    // 系统时钟配置
    InitGpio();       // GPIO初始化
    InitEPwm();       // EPWM模块初始化
    InitAdc();        // ADC模块初始化
    InitQEP();        // 增量编码器接口初始化
    
    // 控制参数初始化
    gMotor.Rs = 0.1;        // 定子电阻(Ω)
    gMotor.Ld = 0.005;      // d轴电感(H)
    gMotor.Lq = 0.005;      // q轴电感(H)
    gMotor.pole_pairs = 4;  // 极对数
    gMotor.Rr = 0.002;      // 转子电阻(Ω)
    
    // 控制环初始化
    FOC_Init(&gFocCtrl, &gMotor);
}

2. 矢量控制主循环

void Main_Loop() {
    static float32_t target_speed = 1500.0;  // 目标转速(rpm)
    
    // 1. 读取编码器位置
    float32_t theta = QEP_GetPosition() * 2 * PI / ENCODER_RESOLUTION;
    
    // 2. 电流环控制
    FOC_CurrentLoop(&gFocCtrl);
    
    // 3. 速度环控制
    float32_t iq_ref = Speed_Controller(target_speed, gFocCtrl.actual_speed);
    gFocCtrl.iq_ref = iq_ref;
    
    // 4. 反Park变换
    ParkClarkeInverse(&gFocCtrl);
    
    // 5. SVPWM生成
    SVPWM_Update(&gFocCtrl);
}

3. 坐标变换模块

// Clarke变换(三相→静止两相)
void Clarke_Transform(float32_t ia, float32_t ib, float32_t ic, 
                     float32_t *ialpha, float32_t *ibeta) {
    *ialpha = ia - 0.5*(ib + ic);
    *ibeta = (sqrt(3)/2)*(ib - ic);
}

// Park变换(静止→旋转坐标系)
void Park_Transform(float32_t ialpha, float32_t ibeta, float32_t theta,
                   float32_t *id, float32_t *iq) {
    *id = ialpha*cosf(theta) + ibeta*sinf(theta);
    *iq = -ialpha*sinf(theta) + ibeta*cosf(theta);
}

// 反Park变换(旋转→静止坐标系)
void ParkClarkeInverse(ParkClarke *pc) {
    pc->ialpha = pc->id*cosf(pc->theta) - pc->iq*sinf(pc->theta);
    pc->ibeta = pc->id*sinf(pc->theta) + pc->iq*cosf(pc->theta);
}

4. 滑模观测器实现

typedef struct {
    float32_t id_est;
    float32_t iq_est;
    float32_t theta_est;
    float32_t omega_est;
    float32_t z_alpha;
    float32_t z_beta;
} SlidingModeObserver;

void SMO_Init(SlidingModeObserver *smo) {
    smo->id_est = 0.0;
    smo->iq_est = 0.0;
    smo->theta_est = 0.0;
    smo->omega_est = 0.0;
    smo->z_alpha = 0.0;
    smo->z_beta = 0.0;
}

void SMO_Update(SlidingModeObserver *smo, float32_t u_alpha, float32_t u_beta,
               float32_t i_alpha, float32_t i_beta) {
    // 电流误差计算
    float32_t e_alpha = smo->id_est - i_alpha;
    float32_t e_beta = smo->iq_est - i_beta;
    
    // 滑模控制律
    float32_t k = 1.0;  // 滑模增益
    smo->z_alpha = (u_alpha - smo->R*sma->id_est + 
                   smo->Ls*(smo->omega_est*smo->ibeta - k*e_alpha)) / smo->Ls;
    smo->z_beta = (u_beta - smo->R*sma->iq_est - 
                  smo->Ls*(smo->omega_est*smo->ialpha + k*e_beta)) / smo->Ls;
    
    // 角度更新
    smo->omega_est += (smo->Ls*(smo->z_beta*smo->ialpha - 
                              smo->z_alpha*smo->ibeta)) / smo->Ld_Lq;
    smo->theta_est += smo->omega_est * DT;
}

5. SVPWM生成模块

typedef struct {
    float32_t Ta;  // 有效矢量作用时间1
    float32_t Tb;  // 有效矢量作用时间2
    float32_t T0;  // 零矢量作用时间
} SVGen;

void SVGen_Calculate(SVGen *sv, float32_t Valpha, float32_t Vbeta) {
    const float32_t Vdc = 12.0;  // 直流母线电压
    const float32_t PI = 3.14159;
    
    // 扇区判断
    int sector = 0;
    if(Valpha >= 0 && Vbeta >= 0 && Valpha > Vbeta) sector = 1;
    else if(Valpha >= 0 && Vbeta >= 0 && Valpha <= Vbeta) sector = 2;
    // ... 其他扇区判断
    
    // 作用时间计算
    sv->Ta = (sqrt(3)*Vdc/2)*Valpha / Vdc;
    sv->Tb = (sqrt(3)*Vdc/2)*Vbeta / Vdc;
    sv->T0 = SV_PERIOD - sv->Ta - sv->Tb;
}

// PWM更新中断服务
interrupt void EPwm1_ISR() {
    // 1. 清除中断标志
    EPwm1Regs.TIFR.bit.INT = 1;
    
    // 2. 读取电流采样值
    gFocCtrl.ia = (AdcResult.ADCRESULT0 * 3.3f / 4096.0f) - 1.65f;
    gFocCtrl.ib = (AdcResult.ADCRESULT1 * 3.3f / 4096.0f) - 1.65f;
    
    // 3. 执行矢量控制
    FOC_Execute(&gFocCtrl);
    
    // 4. 更新PWM占空比
    EPwm1Regs.CMPA.half.CMPA = (gFocCtrl.dutyA + 0.5f) * PWM_PERIOD;
    EPwm2Regs.CMPA.half.CMPA = (gFocCtrl.dutyB + 0.5f) * PWM_PERIOD;
    EPwm3Regs.CMPA.half.CMPA = (gFocCtrl.dutyC + 0.5f) * PWM_PERIOD;
}

三、关键参数配置

1. 电机参数表

参数 符号 典型值 单位
定子电阻 Rs 0.1 Ω
d轴电感 Ld 0.005 H
q轴电感 Lq 0.005 H
转子惯量 J 0.002 kg·m²
额定转速 N_rated 3000 rpm
极对数 P 4

2. PI控制器参数

PI_Controller gCurrentPI = {
    .Kp = 0.5f,
    .Ki = 0.01f,
    .IntegralLimit = 1000.0f,
    .OutputLimit = 1200.0f
};

PI_Controller gSpeedPI = {
    .Kp = 0.1f,
    .Ki = 0.005f,
    .IntegralLimit = 500.0f,
    .OutputLimit = 2000.0f
};

四、调试与优化

1. 波形观测要点

2. 常见问题解决方案

问题现象 可能原因 解决方法
电机振动 死区补偿不足 增加硬件死区(150ns)
低速转矩不足 弱磁控制未启用 启用Vd = Vq*sinθ算法
位置估算漂移 滑模增益K设置不当 调整K值(0.3-0.7)
电流环振荡 PI积分饱和 启用积分分离+抗饱和处理

参考代码 基于DSP28335的永磁同步电机矢量控制的源程序 www.youwenfan.com/contentcnr/56778.html

五、完整工程结构

PMSM_FOC/
├── Src/
│   ├── main.c
│   ├── foc.c
│   ├── svpwm.c
│   ├── smo.c
│   └── qep.c
├── Inc/
│   ├── main.h
│   ├── foc.h
│   └── hardware.h
├── Libs/
│   ├── DSP2833x_Device.h
│   └── IQmath.lib
└── Project/
    ├── .project
    └── .ccsproject

专注于matlab/simulink,电子电路,编程