基于MspM0G3507实现VF启动和SMO滑模观测器1
最近在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;
}
}
}
欢迎邮件沟通。