人为构造svpwm

1:下图引用来自

SVPWM和矢量控制是一回事吗? - 知乎要说SVPWM得先说说目前另一种使用较广泛的脉宽调制方法——正弦脉宽调制法(SPWM),从电机控制这一领域来说,提到SPWM自然会想到异步电机的 变频调速技术,简单来说,这种调速方式要求能够同时做到变频和变压。【补…https://zhuanlan.zhihu.com/p/22423674

 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:注意事项

  1. 延时时间需要调试
  2. Tx,Ty的模长要给的适量,不要太大
  3. 比较值的更新在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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值