1:下图引用来自
2:实现代码
/******************************************************************************
* 函数名称: bldc_rotation_direction_test()
* 功 能: bldc电机的旋转方向与控制矢量的关系测试
* 参 数:ms --- 矢量维持时间,单位:毫秒
*
* 返 回 值:err --- 错误码
* 说 明:本函数默认为矢量顺序按UVW排列为 100->110->010->011->001->101
* 作 者:zhengpan
******************************************************************************/
int bldc_rotation_direction_test(U16_T ms){
int err =0;
U16_T Ts;
U16_T Tx,Ty,Tz;
U16_T Sector=0;
Ts = Foc_Ctrl.pwmHalfPer; //1333
Tx = Foc_Ctrl.AlignPulse/8;//1333/8=166,当前扇区分量大小
Ty = Foc_Ctrl.AlignPulse/8;//1333/8=166,当前扇区分量大小
if(svpwm_ctrl.Modtype == FOC_SVM_7STATE){
Tz = (Ts - Tx -Ty)/2;
}
else{
Tz = 0;
}
bldc_get_IshuntAD_trigpoint(Sector,Ts,Tx,Ty,Tz);
bldc_update_svpwm_waves();
bldc_io_switch_to_pwmmode();
while(1){
Watchdog_feed();
for(int i=0; i<6; i++) {
Sector =i;
err=svpwm_pulse_param_gen(Sector,Tx,Ty,Tz);//扇区切换,波形重新构造
if(err) {
svpwm_pulse_param_gen(Sector,0,0,0);
break;
}
bldc_get_IshuntAD_trigpoint(Sector,Ts,Tx,Ty,Tz);
delayms_Bycode(ms);//每个扇区合成矢量的时间
}
if(err) break;
}
return err;
}
3:实现代码子函数svpwm_pulse_param_gen
/******************************************************************************
* 函数名称: svpwm_pulse_param_gen()
* 功 能: svpwm调制计算脉宽控制参数
* 参 数:sector --- 扇区编号
* Tx,Ty --- 当前扇区的分量大小
* Tz --- 零矢量的大小
*
* 返 回 值:出错码
* 作 者:zhengpan
******************************************************************************/
int svpwm_pulse_param_gen(U16_T sector,U16_T Tx,U16_T Ty,U16_T Tz){
int err=0;
U16_T Tbuf[3];
Tbuf[0] = Tx;
Tbuf[1] = Ty;
Tbuf[2] = Tz;
err = svpwm_pulse_width_cal(sector,Tbuf);
return err;
}
4:实现代码子函数svpwm_pulse_width_cal
/******************************************************************************
* 函数名称: svpwm_pulse_width_cal()
* 功 能: svpwm调制计算脉宽控制参数
* 参 数:sector --- 扇区编号
* Tbuf --- 分量大小缓存
*
* 返 回 值:出错码
* 作 者:zhengpan
******************************************************************************/
static inline int svpwm_pulse_width_cal(U16_T sector,U16_T *Tbuf){
int err =0;
switch(sector){
case 0:
svpwm_ctrl.PWMCMPV[0] = Tbuf[0]+Tbuf[1]+Tbuf[2];
svpwm_ctrl.PWMCMPV[1] = Tbuf[1]+Tbuf[2];
svpwm_ctrl.PWMCMPV[2] = Tbuf[2];
break;
case 1:
svpwm_ctrl.PWMCMPV[0] = Tbuf[0]+Tbuf[2];
svpwm_ctrl.PWMCMPV[1] = Tbuf[0]+Tbuf[1]+Tbuf[2];
svpwm_ctrl.PWMCMPV[2] = Tbuf[2];
break;
case 2:
svpwm_ctrl.PWMCMPV[0] = Tbuf[2];
svpwm_ctrl.PWMCMPV[1] = Tbuf[0]+Tbuf[1]+Tbuf[2];
svpwm_ctrl.PWMCMPV[2] = Tbuf[1]+Tbuf[2];
break;
case 3:
svpwm_ctrl.PWMCMPV[0] = Tbuf[2];
svpwm_ctrl.PWMCMPV[1] = Tbuf[0]+Tbuf[2];
svpwm_ctrl.PWMCMPV[2] = Tbuf[0]+Tbuf[1]+Tbuf[2];
break;
case 4:
svpwm_ctrl.PWMCMPV[0] = Tbuf[1]+Tbuf[2];
svpwm_ctrl.PWMCMPV[1] = Tbuf[2];
svpwm_ctrl.PWMCMPV[2] = Tbuf[0]+Tbuf[1]+Tbuf[2];
break;
case 5:
svpwm_ctrl.PWMCMPV[0] = Tbuf[0]+Tbuf[1]+Tbuf[2];
svpwm_ctrl.PWMCMPV[1] = Tbuf[2];
svpwm_ctrl.PWMCMPV[2] = Tbuf[0]+Tbuf[2];
break;
default:
svpwm_ctrl.PWMCMPV[0] = 0;
svpwm_ctrl.PWMCMPV[1] = 0;
svpwm_ctrl.PWMCMPV[2] = 0;
err =-1;
break;
}
if(svpwm_ctrl.PWMCMPV[0]>=svpwm_ctrl.PWMPulseMax){
svpwm_ctrl.PWMCMPV[0]=svpwm_ctrl.PWMPulseMax;
}
if(svpwm_ctrl.PWMCMPV[1]>=svpwm_ctrl.PWMPulseMax){
svpwm_ctrl.PWMCMPV[1]=svpwm_ctrl.PWMPulseMax;
}
if(svpwm_ctrl.PWMCMPV[2]>=svpwm_ctrl.PWMPulseMax){
svpwm_ctrl.PWMCMPV[2]=svpwm_ctrl.PWMPulseMax;
}
return err;
}
5:注意事项
- 延时时间需要调试
- Tx,Ty的模长要给的适量,不要太大
- 比较值的更新在ept的中断里面
7段式和5段式
7段:t0/4, t4/2, t6/2, t7/2, t6/2, t4/2, t0/4
5段:t0/2, t4/2, t6, t4/2, t0/2 或者 t4/2, t6/2, t7, t6/2, t4/2