基于TMS320F2812 DSP的永磁同步电机(PMSM)矢量控制

一、硬件初始化配置

// 系统时钟配置(150MHz)
void InitSysCtrl() {
    EALLOW;
    ClkCfgRegs.PLLCR.bit.DIV = 0x01;    // 主频150MHz
    ClkCfgRegs.PLLSTS.bit.DIVSEL = 0x00;
    EDIS;
}

// GPIO配置(PWM1-6用于逆变器驱动)
void InitGpio() {
    EALLOW;
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;  // PWM1A
    GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;  // PWM1B
    GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;  // PWM2A
    GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1;  // PWM2B
    GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 1;  // PWM3A
    GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 1;  // PWM3B
    EDIS;
}

// ADC初始化(12位分辨率,连续采样模式)
void InitAdc() {
    AdcRegs.ADCTRL1.bit.ACQ_PS = 0x0B;   // 采样保持时间75ns
    AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;    // 级联模式
    AdcRegs.ADCMAXCONV.bit.MAX_CONV = 0x02; // 最大转换通道2
    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x00; // 通道0: A相电流
    AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x01; // 通道1: B相电流
    AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x02; // 通道2: DC母线电压
}

// PWM初始化(20kHz频率,死区时间1.5μs)
void InitPwm() {
    EPwm1Regs.TBPRD = 1500;             // 周期值(150MHz时钟下对应20kHz)
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 双向计数
    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;       // 禁用相位加载
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2;      // 高速分频
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV2;         // 主时钟分频
    EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE; // 禁用同步输出
    EPwm1Regs.ETSEL.bit.SOCAEN = 1;             // 使能SOC事件
    EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_ZERO;    // 选择计数器归零事件
    EPwm1Regs.ETPS.bit.SOCAPRD = ET_1ST;          // 生成一次SOC事件
    EPwm1Regs.ETCLR.bit.SOCA = 1;                 // 清除SOC标志
}

二、中断服务程序(AdcISR)

interrupt void AdcISR() {
    static _iq Ia=0, Ib=0, Vdc=0;
    
    // 读取ADC转换结果(Q15格式)
    Ia = _IQmpy(_IQ(AdcRegs.ADCRESULT0^0x8000), 0.00048828125); // 0-3.3V转Q15
    Ib = _IQmpy(_IQ(AdcRegs.ADCRESULT1^0x8000), 0.00048828125);
    Vdc = _IQmpy(_IQ(AdcRegs.ADCRESULT2^0x8000), 0.00048828125);

    // 三相电流重构(Clark变换)
    Ialpha = Ia;
    Ibeta = (Ia + 2*Ib) * _IQ(0.57735);  // 1/√3系数

    // 启动下一次ADC转换
    AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // 清除中断标志
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 清除ACK
}

三、坐标变换与磁场定向

// Clarke变换(3→2相静止坐标系)
void Clarke_Transform(float ia, float ib, float *ialpha, float *ibeta) {
    *ialpha = ia;
    *ibeta = (ia + 2*ib) * 0.57735f;  // 1/√3系数
}

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

// 逆Park变换(旋转→静止坐标系)
void IPark_Transform(float vd, float vq, float theta, float *valpha, float *vbeta) {
    *valpha = vd * _IQcos(theta) - vq * _IQsin(theta);
    *vbeta = vd * _IQsin(theta) + vq * _IQcos(theta);
}

// 逆Clark变换(2→3相静止坐标系)
void InvClarke_Transform(float valpha, float vbeta, float *va, float *vb, float *vc) {
    *va = valpha;
    *vb = -0.5f*valpha + 0.8660254f*vbeta;  // √3/2系数
    *vc = -0.5f*valpha - 0.8660254f*vbeta;
}

四、双闭环控制算法

// PI控制器结构体
typedef struct {
    _iq Kp;    // 比例系数
    _iq Ki;    // 积分系数
    _iq Kd;    // 微分系数
    _iq Integral; // 积分项
    _iq Output;   // 输出值
} PI_Obj;

// 电流环PI调节(Q15格式)
void Current_PI_Update(PI_Obj *pi, _iq ref, _iq fdb, _iq *out) {
    _iq error = _IQmpy(ref - fdb, _IQ(0.5));  // 误差计算(比例项)
    pi->Integral += error;                    // 积分项累加
    *out = _IQmpy(pi->Kp, error) + _IQmpy(pi->Ki, pi->Integral);
}

// 转速环PI调节(浮点格式)
void Speed_PI_Update(PI_Obj *pi, float ref, float fdb, float *out) {
    float error = ref - fdb;
    pi->Integral += error * DT;  // 积分项累加(DT=1/10kHz=0.0001s)
    *out = pi->Kp*error + pi->Ki*pi->Integral;
}

五、SVPWM生成与死区补偿

// SVPWM生成(扇区判断+作用时间计算)
void SVPWM_Generate(float va, float vb, float vc) {
    static _iq Ta=0, Tb=0, Tc=0;
    static int sector=0;

    // 扇区判断(0-5)
    if(va >=0 && vb >=0 && vc >=0) sector=1;
    else if(va >=0 && vb >=0 && vc <0) sector=2;
    // ...其他扇区判断(完整代码需补充)

    // 作用时间计算(Q15格式)
    Ta = _IQmpy(_IQ(0.5), _IQ(1) - Tb - Tc);
    Tb = _IQmpy(_IQ(0.5), _IQ(1) - Ta - Tc);
    Tc = _IQmpy(_IQ(0.5), _IQ(1) - Ta - Tb);

    // 死区补偿(1.5μs)
    EPwm1Regs.CMPA.half.CMPA = (Ta + Tb) >> 1;
    EPwm2Regs.CMPA.half.CMPA = (Tb + Tc) >> 1;
    EPwm3Regs.CMPA.half.CMPA = (Tc + Ta) >> 1;
}

// PWM中断服务程序
interrupt void EvbTimerISR() {
    static float theta=0.0;
    
    // 位置/速度检测(QEP解码)
    theta = QEP_GetPosition();  // 获取机械角度(单位:弧度)

    // 坐标变换
    Clarke_Transform(Ia, Ib, &Ialpha, &Ibeta);
    Park_Transform(Ialpha, Ibeta, theta, &Id_ref, &Iq_ref);

    // 电流环控制
    Current_PI_Update(&current_PI, Iq_ref, Iq_actual, &Vq_cmd);

    // 转速环控制
    Speed_PI_Update(&speed_PI, target_speed, actual_speed, &Id_ref);

    // 逆坐标变换
    IPark_Transform(Vd_cmd, Vq_cmd, theta, &Valpha_cmd, &Vbeta_cmd);
    InvClarke_Transform(Valpha_cmd, Vbeta_cmd, &va, &vb, &vc);

    // SVPWM生成
    SVPWM_Generate(va, vb, vc);

    // 清除中断标志
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}

六、系统保护机制

// 过流保护处理
void OverCurrent_Protection() {
    if(ADC_GetValue(2) > 3000) {  // DC母线电压检测
        EPwm1Regs.TBCTL.bit.ENABLE = 0;  // 关闭PWM输出
        FLAG_OVERLOAD = 1;
    }
}

// 过温保护处理
void OverTemp_Protection() {
    if(ADC_GetValue(3) > 2500) {  // 温度传感器检测
        EPwm1Regs.TBCTL.bit.ENABLE = 0;  // 关闭PWM输出
        FLAG_OVERTEMP = 1;
    }
}

参考代码 基于dspf2812的永磁同步电机矢量控制程序 www.youwenfan.com/contentcsm/72037.html

七、调试与优化建议

  1. 电流采样校准 采用三相两线法采样,通过软件补偿零点漂移 校准公式:I_actual = (ADC_val - ADC_offset) * ADC_gain
  2. 参数整定技巧 电流环PI参数:Kp=0.5, Ki=0.01(需根据电机参数调整) 转速环PI参数:Kp=0.1, Ki=0.005(带前馈补偿)
  3. 死区补偿优化 动态补偿公式:T_comp = (1.5μs - T_dead)/T_PWM 补偿范围限制:0 ≤ T_comp ≤ 0.5
  4. 磁场定向精度 采用滑模观测器估算转子位置(替代机械编码器) 观测器方程:x(k+1) = Ax(k) + Bu(k) + L(y(k)-Cx(k))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值