从零实现无刷 永磁电机FOC驱动控制。 CCS进行DSP外设配置 对控制算法生成代码再到CCS进行集成。 最大限度发挥硬件自由度的同时加快算法的部署实现

当咱们把开发板、电机和示波器铺满工作台的时候,真正硬核的电机控制之旅才算开始。今天咱们直接上手TI的C2000系列DSP,用最原始的方式构建FOC驱动框架,感受电流环在PWM中断里狂奔的快感。

先祭出CCS的经典操作——外设配置别用图形化工具!直接手写寄存器才够味。拿EPWM模块开刀,三路互补PWM必须安排得明明白白:

void InitEPwm(void) {
    EPwm1Regs.TBPRD = SYSTEM_FREQ / (2 * PWM_FREQ); // 周期寄存器
    EPwm1Regs.CMPA.half.CMPA = 0; // 初始占空比清零
    EPwm1Regs.DBCTL.bit.OUT_MODE = 0x3; // 死区插入
    EPwm1Regs.DBFED = DEAD_TIME; 
    EPwm1Regs.TBCTL.bit.CTRMODE = 0x2; // 增减计数模式
    EPwm1Regs.ETSEL.bit.SOCAEN = 1; // 开启ADC触发
}

这段代码把PWM频率锁死在20kHz,死区时间设了500ns(具体值看你的MOS管参数)。重点在ETSEL寄存器的SOCA触发设置,这直接关系到ADC采样时机的精准度——做电流采样的都知道,采样窗口差半个PWM周期结果就全毁了。

FOC算法的核心三板斧必须自己造轮子。Clarke变换写成宏才是真男人的浪漫:

#define CLARKE_TRANSFORM(a, b, alpha, beta) \
    alpha = a; \
    beta = (a + 2*b)*0.57735026919f  // 1/sqrt(3)

注意这里直接省掉了第三个相的计算,反正无中线系统满足ia+ib+ic=0。Park变换的旋转因子建议查表法实现,实测比实时计算sin/cos快三倍:

float sin_table[512]; // Q格式角度输入
void InitSinTable() {
    for(int i=0; i<512; i++){
        sin_table[i] = sin(2*PI*i/512.0f);
    }
}

电流环PID别整什么浮点运算,Q15定点数才是实战派的选择。注意在中断服务程序里要加抗积分饱和:

#pragma CODE_SECTION(CurrentPID, "ramfuncs")
int16 CurrentPID(int16 err) {
    static int32 integral = 0;
    int32 output;
    
    integral += err * Ki;
    if(integral > 32767<<8) integral = 32767<<8; // 防溢出
    output = (err * Kp) + (integral >> 8);
    
    return __ssat(output, 16); // 饱和处理
}

这段代码用移位代替浮点乘法,SSAT指令直接做饱和限制。重点是把函数放在ramfuncs段执行,直接从RAM跑比Flash快两倍时钟周期。

最后在PWM中断服务程序里组装所有模块,注意执行顺序决定生死:

__interrupt void epwm1_isr(void) {
    AdcReadCurrents(&Ia, &Ib);  // 第一步采样
    ClarkeTransform(Ia, Ib, &I_alpha, &I_beta);
    ParkTransform(I_alpha, I_beta, theta, &Id, &Iq);
    Vd = CurrentPID(Id_ref - Id);
    Vq = CurrentPID(Iq_ref - Iq);
    InversePark(Vd, Vq, theta, &Valpha, &Vbeta);
    SVM_Generate(Valpha, Vbeta); // 空间矢量调制
    EPwm1Regs.CMPA = CalcDutyCycle(); // 更新PWM
    EPwm1Regs.ETCLR.bit.INT = 1; // 清中断标志
}

这里藏着两个魔鬼细节:ADC采样必须在PWM周期中间触发(配置EPwm的SOCA事件),SVPWM算法里要注意过调制时的钳位处理。曾有老哥因为没清中断标志导致程序跑飞,连着烧了五六个IPM模块...

当电机第一次发出平稳的电磁嗡鸣时,你会明白那些寄存器级别的操作、定点数运算的优化、中断时序的微调,都是值得的。这种从寄存器到控制理论的完整掌控感,才是嵌入式FOC开发的终极浪漫。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐