矢量控制DSP2812:TMS320F2812主控的PMSM有传感器转速电流双闭环控制程序
矢量控制dsp2812 主控为TMS320F2812,PMSM的有传感器的转速、电流双闭环控制程序。
在DMS车间调试电机的日子,总免不了和DSP2812的代码死磕。今天咱们聊聊基于TMS320F2812的永磁同步电机矢量控制——那个让我掉了不少头发的双闭环系统。先说核心:电流环负责稳住转矩,转速环控制电机飞多快,两者配合得像火锅配香油碟才算合格。
电流采样这块坑最多,先看ADC配置代码:
void InitAdc(void) {
AdcRegs.ADCTRL1.bit.ACQ_PS = 0x1; //采样保持窗口=75ns
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; //级联模式
AdcRegs.ADCMAXCONV.bit.MAX_CONV = 0x2; //转换3个通道
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; //A相电流
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1; //B相电流
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2; //母线电压
}
这里有个骚操作:三相电流只采两相,C相电流用Ia+Ib+Ic=0计算出来。这么做省了个ADC通道,但得确保算法里做好符号处理,否则电流环会抽风。
坐标变换是矢量控制的灵魂,Clarke变换的代码看着简单:
void Clarke_Transform(float ia, float ib, float *ialpha, float *ibeta) {
*ialpha = ia;
*ibeta = (ia + 2*ib) * 0.57735f; //1/√3系数
}
实际上这里的0.57735得用IQmath库的_IQdiv(),不然定点DSP会溢出。Park变换更刺激,角度要是没实时更新,分分钟给你表演电机跳舞。

矢量控制dsp2812 主控为TMS320F2812,PMSM的有传感器的转速、电流双闭环控制程序。
转速环的PI调节器最考验参数整定,来看这段带限幅的代码:
void Speed_PI_Update(PI_Obj *v, float target, float actual) {
v->err = target - actual;
v->integral += v->Ki * v->err;
//抗饱和处理
if(v->integral > 5000.0f) v->integral = 5000.0f;
else if(v->integral < -5000.0f) v->integral = -5000.0f;
v->output = v->Kp * v->err + v->integral;
}
重点在积分限幅,没这玩意儿电机加速时会像喝醉的熊一样乱撞。调试时记得先调Kp让系统有反应,再加Ki消除静差,别一上来就两个参数一起调——那酸爽,谁调谁知道。
SVPWM生成是最后的大招,这段代码决定了电压矢量的合成:
void CalcSVPWM(float Valpha, float Vbeta) {
float Vref = sqrt(Valpha*Valpha + Vbeta*Vbeta);
float theta = atan2(Vbeta, Valpha);
//扇区判断
sector = (int)(theta/(PI/3)) + 1;
if(sector >6) sector =6;
//作用时间计算
t1 = _IQmpy(_IQsin(sector*60 - theta), Vref);
t2 = _IQmpy(_IQsin(theta - (sector-1)*60), Vref);
t0 = pwm_period - t1 - t2;
//配置CMP寄存器
CMPR1 = (t1 + t2/2) * PWM_PERIOD_SCALE;
CMPR2 = t2/2 * PWM_PERIOD_SCALE;
}
这里用IQmath库做定点运算比浮点快三倍,但得注意数值范围。曾经有个兄弟没做Vref限幅,直接让IGBT放烟花,那场面真是...挺壮观的。
最后说中断优先级配置:ADC采样必须在PWM中断里同步触发,电流环执行时间要控制在50us以内,转速环可以放宽到100us。别忘了在代码里加硬件保护,过流阈值设个6000就差不多,别学我当年设8000结果烧了八颗MOS管。

调这系统就像熬火锅底料,参数火候差一点味道就变了。但当你看到电机从颤抖到丝滑旋转的那一刻——值了!
更多推荐
所有评论(0)