最近在TI的M0芯片上MspM0G3507上实现了VF启动和SMO滑模观测器过程分享给大家 :

1. VF开环变频启动: 首先,VF启动,也就是电压频率启动,是一种开环控制方法,通过调节电压和频率的比例,来控制电机的启动过程。 在没有无位置传感器位置传感器的情况下,通过逐步增加电压和频率,使电机从静止加速到一定速度,之后切换到闭环控制, 同时进行无感滑模观测器来估算转子位置和速度。VF启动常用于交流感应电机或者永磁同步电机(PMSM)的无传感器控制中。 VF启动的原理类似于变频启动,通过控制电压和频率的比值保持恒定,避免电机在启动时过流,同时逐步提升转速。

VF启动的原理。包括电压和频率的线性增加,保持V/f比恒定,以维持磁通恒定。例如,在电机启动时, 给定一个初始频率,我启动是10Hz,对应的电压也按比例给定,然后逐渐增加频率和电压,使电机加速。此处我设定为Openloop 由于没有位置反馈,开环控制开始会有一定的误差,同时增加SMO的运行,但启动阶段可能负载较轻,或者通过电流限制来防止过流。

VF启动阶段,没有使用到反电动势的信息,而是根据预设的V/f曲线,逐步提升频率和电压,设定每个控制周期增加一定的频率, 同时电压按比例增加。此时,电机的实际转速会跟随频率的变化,但由于负载的存在,可能会有滑差。 VF启动需要保证足够的电压以产生足够的转矩,为了避免过流,我进行电流闭环控制,限制电流在安全范围内。

V/f恒定原则 保持电压与频率的比例恒定(constV/f=const),以确保电机磁通恒定,避免饱和或转矩不足。 初始阶段:低频低压启动(如1Hz,对应低电压)。 加速阶段:逐步线性增加频率f和电压幅值V,驱动电机加速。

2.SMO滑模观测器: 滑模观测器(SMO)。滑模控制是一种非线性控制方法,通过使系统状态沿着预设的滑模面运动,从而达到鲁棒控制的目的。 在无感控制中,SMO用来根据电机的电流和电压等测量值,估算转子的位置和转速。滑模观测器的核心涉及到电机的数学模型, 比如电机的电压方程和反电动势模型,然后设计滑模面,使得观测的电流误差趋近于零,从而得到反电动势的估计值,进而计算出转子位置和转速。

3.VF+SMO的切换 VF和SMO切换是程序的关键点,我在此处多次不成功,特别是单电阻采样,在第一次ID切换的过程中,就会角度切换失败,此时应该进行角度切换的滑动 滤波就会有比较好的效果

1.VF开环启动代码:

主函数:


#include "VF_angle.h"
#include "Sensorless_SMO.h"

/* ISR_FREQUENCY is PWM frequency  16 khz, TY one calculator us time*/
#define ISR_FREQUENCY     16
float   TY_time= 0.001/ISR_FREQUENCY;

VF_Angle     VF_AnglePare=VF_angle_DEFAULTS ;
logic        logicContr=logic_DEFAULTS;

/*********************************************************************************************************
** Function name:    
** Descriptions:     
** input parameters: 
** output parameters:
** Returned value:   
** RD Date:          
*********************************************************************************************************/
void  VFAngle_init(void )
{
 VF_AnglePare.step_anglemax= _IQ(VF_AnglePare.BASE_FREQ*TY_time);   // _IQ(0.02);  12500/VF_AnglePare.BASE_FREQ=50
 VF_AnglePare.step_Speed=_IQ(0.0005);
}

/*********************************************************************************************************
** Function name:    
** Descriptions:     
** input parameters: VF_AnglePare.step_angle
** output parameters:VF_AnglePare.Angle_theta
** Returned value:   
** RD Date:          
*********************************************************************************************************/
void VFAngle_cale(void)
{
   VF_AnglePare.Angle_theta += VF_AnglePare.step_angle  ;

   if(VF_AnglePare.Angle_theta > _IQ(1.0)){
	   VF_AnglePare.Angle_theta -= _IQ(1.0);
	   
   }else if(VF_AnglePare.Angle_theta < _IQ(0.0)){
       VF_AnglePare.Angle_theta += _IQ(1.0);
   }
}

关键核心实现,在1ms状态机中被调用部分程序如下:

/*********************************************************************************************************
** Function name:    
** Descriptions:     
** input parameters: 
** output parameters:
** Returned value:   
** RD Date:          
*********************************************************************************************************/
void VF_start_control(void)
{

	if( logicContr.Start_order==1)            //  第一步:   VF 输入电压和频率	启动  当VF=10 %时,后0.5s切换无感开环控制 进入第二步
	{
  		VF_AnglePare.SpeedRef= _IQ(0.0399) ;  // 0.05   pi_spd.Ref  VF启动转速
  		
  		/* about speed_target caluec the Vq */
  		VF_AnglePare.VF_Vq= _IQmpy(_IQ(1.5),VF_AnglePare.Speed_target);
  		
  		Angle_SMOPare.Kslide=_IQ(0.0168);

  		VF_AnglePare.Speederror = VF_AnglePare.SpeedRef - VF_AnglePare.Speed_target;

      /* step_speed is speed one puls value=_IQ(0.0005) */
  	  if(_IQabs(VF_AnglePare.Speederror)>= VF_AnglePare.step_Speed){
  	    
    			if(VF_AnglePare.SpeedRef > VF_AnglePare.Speed_target ){
    			    VF_AnglePare.Speed_target += VF_AnglePare.step_Speed ;
    			}else if(VF_AnglePare.SpeedRef < VF_AnglePare.Speed_target){
    			    VF_AnglePare.Speed_target -= VF_AnglePare.step_Speed;
    			}else{
    			    VF_AnglePare.Speed_target = VF_AnglePare.SpeedRef;
    	    }
  	  
  	  /* value < _IQ(0.0005) change status  Start_order=2*/
  	  }else{
          VF_AnglePare.Speed_target = VF_AnglePare.SpeedRef;
          logicContr.Qiehuan_count++;
          
          if(logicContr.Qiehuan_count>=50){
         	    logicContr.Qiehuan_count=0;
         	    logicContr.Start_order=2;
          }
      }
      
      /* output the value angle */
  	  VF_AnglePare.step_angle= _IQmpy(VF_AnglePare.step_anglemax, VF_AnglePare.Speed_target);
  }

  if( logicContr.Start_order==2){        // 第二步: 调整 滤波系数 Kslide 大约1.5s 后进入步骤三

//	    VF_AnglePare.VF_Vq= pi_spd.Ref;
	    logicContr.Qiehuan_count++;
	    VF_AnglePare.Delta_thetaF += _IQ(0.00018);
	    
	    if(VF_AnglePare.Delta_thetaF >= _IQ(0.25)){
	        VF_AnglePare.Delta_thetaF = _IQ(0.25);
	    }
	    
	    if(logicContr.Qiehuan_count >= 100){
	  	    logicContr.Qiehuan_count = 0;
	        logicContr.Start_order   = 3;
	    }
	}
}

欢迎邮件沟通。