使用STM32实现无感无刷电机控制中的PLL锁相环和滑膜观测器

        上一期为大家介绍了滑膜观测器正反切的应用案例,收到不少小伙伴的反馈是否有PLL的案例,大概看了一下网上的资料,讲理论的很多,能转化成源码的几乎没有。前半年工作和家里的事情都比较多,一拖再拖,终于在6月将源码调试好了,在这里跟大家分享一下调试过程以及注意事项。

        我们都知道,滑膜控制在滑动膜态下伴随着高频抖阵,因此估算的反电动势中存在高频抖阵现象。基于反正切函数的转自位置估计方法将这种抖阵直接引入反正切函数的除法运算中,导致这种高频抖阵的误差被放大,进而造成较大的角度估计误差。采用锁相环结构对转子位置进行跟踪估计,可以大大提高系统的跟踪精度和改善系统的控制性能。所以,这一次将讲解一下锁相环PLL系统来提取转子的位置信息。

硬件介绍:

        硬件平台使用的stm32F4系列单片机,可以进行浮点计算,主频168Mhz,性能可以完爆F103的单片机了。

        开发板链接

        还是我们这一款板子:

软件功能:

        相较于F1的板子,增加了电位器调速功能。

        滑膜观测器+PLL控制,更准确提取转子的速度和角度信息。

        软件上还是保持了三个功能,滑膜模式(Smoloop)、霍尔模式(Hallloop)和开环 OpenLoop模式。

         通过程序中的宏进行模式选择。

 

滑膜观测器的设计:

         滑膜控制是一种变结构的控制系统,控制系统的特性在于控制系统的不连续性,能让系统在一定条件下沿着规定的轨迹作小幅度、高频率上下运动,因此我们称之为滑膜动态。这种动态与参数和扰动无关,并且是可以设计的。

         滑膜观测器的具体原理我就不在这里赘了,不了解的可以看一下F103上滑模观测器反正切的介绍,也可以参考一下网上的资料,进行一下基础知识的普及,在这里我贴上源码,方便大家更直观的了解如何从理论到程序转变。

滑膜观测器初始化:


void  SMO_Pare_init(void)  
{
	SMO_MotorPare.Rs = Motor_Rs;     
	SMO_MotorPare.Ls = Motor_Ls;  
	SMO_MotorPare.Ib = 1 ;        
	SMO_MotorPare.Vb = 1 ;       
	SMO_MotorPare.Ts = Control_Ts;  
	SMO_MotorPare.POLES = Motor_Pn;   
  
    SMO_MotorPare.Fsmopos = exp((-SMO_MotorPare.Rs/SMO_MotorPare.Ls)*(SMO_MotorPare.Ts));
	SMO_MotorPare.Gsmopos = (SMO_MotorPare.Vb/SMO_MotorPare.Ib)*(1/SMO_MotorPare.Rs)*(1-    
    SMO_MotorPare.Fsmopos);
  
	Angle_SMOPare.Kslide = 5.0;  //     
	Angle_SMOPare.Kslf = 0.158;     //      
	Angle_SMOPare.E0 = 0.5;      //
  
  /***************PLL参数************************************/
  Angle_SMOPare.tPll.Kp = 20.0f;//5.0
  Angle_SMOPare.tPll.Ki = 12.0;//15.0
  
  Angle_SMOPare.tPll.Speed_coeff = (60.0)/(2*SMO_MotorPare.POLES*PI); 
  Angle_SMOPare.tPll.Kslf = 0.3; 
  
}

锁相环的位置和速度估算:

        滑模控制系统中估算的反电动势在通入低通滤波器中会导致高频都在误差变大,角度误差变大。采用PLL系统来提取转子速度和角度信息。

PLL的滑模控制系统实现框图

下面为PLL计算的C源码:

void  Pll_Compute(Ppll_obj_t ptHandle,float Coff_Sine,float Coff_Cos)
{
    float Sin_Value = 0;
    float Cos_Value = 0;
    Cos_Value = arm_cos_f32(ptHandle->Theta); //Q15
    Sin_Value = arm_sin_f32(ptHandle->Theta); //Q15
    
    ptHandle->Err = Coff_Cos * Cos_Value  - Coff_Sine * Sin_Value; 
  
    ptHandle->Err = (ptHandle->Err > PI/6)  ?  (PI/6) : (ptHandle->Err);
    ptHandle->Err = (ptHandle->Err < -PI/6) ? (-PI/6) : (ptHandle->Err);
  
    ptHandle->Interg += ptHandle->Err * ptHandle->Ki;
  
    ptHandle->Ui = ptHandle->Err*ptHandle->Kp + ptHandle->Interg;
      
    
    ptHandle->Speed_Rpm = ptHandle->Speed_coeff * ptHandle->Ui;
 
    ptHandle->SpeedLpf_Rpm = ptHandle->SpeedLpf_Rpm + ptHandle->Kslf * (ptHandle->Speed_Rpm - ptHandle->SpeedLpf_Rpm);

}

仿真分析:

       仿真部分建议买一本袁雷老师的simulink仿真那本书,内容很不错。

 角度波形:

 反电动势波形:

通过上位机查看电流启动波形:

最后:

        用锁相环控制系统替代串通的滑模观测器系统,通过滑模增益和反电动势的估算来减小系统误差与抖动,并根据锁相环控制系统推导出转角和转速公式,通过搭建的仿真模型可以看出,在PLL滑模观测器转速突变的情况下,能及时快速跟踪电机的实际转速和转角变化,通过PLL的滑模观测器比反正切的控制方法精准度更高,动态性能更好以及鲁棒性更强,可以满足电机实际控制性能的要求。

物联沃分享整理
物联沃-IOTWORD物联网 » 使用STM32实现无感无刷电机控制中的PLL锁相环和滑膜观测器

发表评论