STM32f103 SMO滑膜观测器的 无感无刷FOC驱动DIY

        小时候玩航模了解到无刷电机,又从方波控制了解到FOC控制,在接触了一些开源项目的时候,感叹做的真好,不论是方波的还是Foc的启动都是那么丝滑,软件做的虽然好,但在这几年电机驱动芯片和部分型号的单片机价格都居高不下,做一个低成本的Foc驱动器利用网上开源资料已经不够用了。

ky_motor Foc 测试视频

        假期趁着有时间做一套Foc驱动器,从硬件到软件,从夏天到冬天,真是不容易,总算差不多了。

开发板:​​​​​​​开发板链接

        硬件选用了STM32F103单片机,程序内容并不是很多,103c8,103rb都可以满足需求,为了后期可以扩展资源,我选用了rbt6,价格大约16元一颗,不是用的ST电机库,因此程序可以移植到国产芯片上,不过我没有移植过,毕竟我不太相信国产芯片(个人观点)。

        驱动芯片选用的EG2134,没什么可说的,就是图便宜,一颗大约1.5元,比国产的峰绍还要便宜个几毛钱,这难道不是我选它的理由吗?

         运放选用的是LM324,也是几毛钱的物料,追求更好的效果可以选用精度更高的运放,而不是我选用的这个玩具级,运放采样做的是一个差分输入的方式,看电流波形还可以。

          Mos用的是Irlr7843,性能很好的一颗mos,以前做航模的时候总用这个mos,就是假货比较多,我这个板子也没打算跑太大的电流,因此这个Mos不论从价格还是从性能,都能满足我的需求。

       三个控制按键,复位,开始,停止。实际的程序样式也是按start电机开始转动,按stop电机停止转动,复位键用于debug调试使用。预留一个电位器接口,用来调速。

       电阻采样用了三颗0.05R的采样电阻,通过三电阻采样的方式保证了电流采样的精度(当然,运放有些拉跨)。

        剩下的就是辅助电路了,预留了IIC接口,SPI接口,后期方便加传感器或者OLED。

        硬件介绍完了,剩下的就是软件部分了,当然也是最精彩的部分了,篇幅有限,我简单介绍一下功能,后面有时间我会在专栏里给大家详细的讲解一下Foc的控制方法。

        使用了SMO 滑膜观测器,SMO代码精简,性能稳定,值得多花一些时间对其进行改进。比如,在反电势滤波方法上。SMO参数调整相对来说比较简单,实际调试电机过程中能很快的调出让电机稳定运行的参数。有没有参数更容易调整的观测器?有的,对传统滑模观测器添加一个自适应律,得到自适应滑模观测器。当然,最重要的还是我比较擅长SMO,其他的都不重要。

        控制模式上写了三个模式,Hallloop(霍尔闭环),SMOloop(滑膜闭环),Openloop(开环)这三个模式。我先把这部分代码贴上来,后期测试的视频我在传上来。

        Openloop

void Motor_IFStart(void)
{
    Angle_Acc(Angle);
    AngleSin_Cos.IQAngle = Angle.Set;//角度
    pi_iq.Ref = IqStart; //启动电流设置

    ADC_Sample();//采集电流 得到UV电流
   
    
     AngleSin_Cos.IQSin = _IQsinPU(AngleSin_Cos.IQAngle);
     AngleSin_Cos.IQCos = _IQcosPU(AngleSin_Cos.IQAngle);
  /**************Clark变换****************/
     ClarkI.As = AdcValue.PhaseUCurr;
     ClarkI.Bs = AdcValue.PhaseVCurr;
     CLARK_MARCO(ClarkI);//clark变换 
    
  /**************Park变换****************/   
     ParkI.Alpha = ClarkI.Alpha;
     ParkI.Beta  = ClarkI.Beta;
     ParkI.Sine  = AngleSin_Cos.IQSin;
     ParkI.Cosine = AngleSin_Cos.IQCos;
     PARK_MARCO(ParkI);//Park变换 
    
 /************d轴控制器*******************/    
     pi_id.Ref = 0; //给定id
     pi_id.Fbk = ParkI.Ds;  //反馈id     
     PI_MACRO(pi_id);//  d轴控制器
     
 /************q轴控制器*******************/    
     pi_iq.Fbk = ParkI.Qs;  //反馈iq     
     PI_MACRO(pi_iq);//  q轴控制器 
     
  /************PARK逆变换*******************/     
     IparkU.Ds = pi_id.Out;
     IparkU.Qs = pi_iq.Out;
    
     IparkU.Sine = AngleSin_Cos.IQSin;//查表得到正弦值
     IparkU.Cosine=AngleSin_Cos.IQCos;//查表得到余弦值

     PARKinv_MARCO(IparkU) 
  
     Svpwm.Ualpha = IparkU.Alpha;
     Svpwm.Ubeta =  IparkU.Beta;
     
     SMO_Angle(ClarkI.Alpha,ClarkI.Beta,IparkU.Alpha,IparkU.Beta); //滑膜估算角度

     SVPWM_Gen(&Svpwm); //得到占空比
     PWM_CMP(); //得到PWM比较值    
}

        SMOloop

void SMO_SpeedLoop(void)
{  
 
    PWMZD_count++;
    if(PWMZD_count==25)
	  {
	    PWMZD_count=0; 
      SMO_Speedcale();
      pi_spd.Ref = SpeedRef;
      pi_spd.Fbk = Speed_estPare.Speed_RPM;
      PI_SPEED_MACRO(pi_spd);//速度环PI  
    } 
  
    AngleSin_Cos.IQAngle =  IQAtan_Pare.IQAngle;//估算角度
    pi_iq.Ref = pi_spd.Out; //速度输出
    
    ADC_Sample();//采集电流 得到UV电流
        
     AngleSin_Cos.IQSin = _IQsinPU(AngleSin_Cos.IQAngle);
     AngleSin_Cos.IQCos = _IQcosPU(AngleSin_Cos.IQAngle);
  /**************Clark变换****************/
     ClarkI.As = AdcValue.PhaseUCurr;
     ClarkI.Bs = AdcValue.PhaseVCurr;
     CLARK_MARCO(ClarkI);//clark变换 
    
  /**************Park变换****************/   
     ParkI.Alpha = ClarkI.Alpha;
     ParkI.Beta  = ClarkI.Beta;
     ParkI.Sine  = AngleSin_Cos.IQSin;
     ParkI.Cosine = AngleSin_Cos.IQCos;
     PARK_MARCO(ParkI);//Park变换 
    
 /************d轴控制器*******************/    
     pi_id.Ref = 0; //给定id
     pi_id.Fbk = ParkI.Ds;  //反馈id     
     PI_MACRO(pi_id);//  d轴控制器
     
 /************q轴控制器*******************/    
     pi_iq.Fbk = ParkI.Qs;  //反馈iq     
     PI_MACRO(pi_iq);//  q轴控制器 
     
  /************PARK逆变换*******************/     
     IparkU.Ds = pi_id.Out;
     IparkU.Qs = pi_iq.Out;
    
     IparkU.Sine = AngleSin_Cos.IQSin;//查表得到正弦值
     IparkU.Cosine=AngleSin_Cos.IQCos;//查表得到余弦值

     PARKinv_MARCO(IparkU) 
  
     Svpwm.Ualpha = IparkU.Alpha;
     Svpwm.Ubeta =  IparkU.Beta;
     
     SMO_Angle(ClarkI.Alpha,ClarkI.Beta,IparkU.Alpha,IparkU.Beta); //滑膜估算角度

     SVPWM_Gen(&Svpwm); //得到占空比
     PWM_CMP(); //得到PWM比较值    
}

Hallloop

void Mode_Hall_loop(void) 
{
    PWMZD_count++;
    if(PWMZD_count==25)
	  {
	    PWMZD_count=0;
	    Hall_Three_Speedcale(); 

      pi_spd.Ref = SpeedRef;
      pi_spd.Fbk = Hall_Three.Speed_RPM;
      PI_SPEED_MACRO(pi_spd);//速度PI控制器 
    }
    
     ThreeHallanglecale();//得到角度
    
     AngleSin_Cos.IQAngle = Hall_Three.ele_angleIQ;

     ADC_Sample();//采集电流 得到UV电流
       
     AngleSin_Cos.IQSin = _IQsinPU(AngleSin_Cos.IQAngle);
     AngleSin_Cos.IQCos = _IQcosPU(AngleSin_Cos.IQAngle);
    /*****************************************************************************/
   
    
  /**************Clark变换****************/
     ClarkI.As = AdcValue.PhaseUCurr;
     ClarkI.Bs = AdcValue.PhaseVCurr;
     CLARK_MARCO(ClarkI);//clark变换 
    
  /**************Park变换****************/   
     ParkI.Alpha = ClarkI.Alpha;
     ParkI.Beta  = ClarkI.Beta;
     ParkI.Sine  = AngleSin_Cos.IQSin;
     ParkI.Cosine = AngleSin_Cos.IQCos;
     PARK_MARCO(ParkI);//Park变换 
    
 /************d轴控制器*******************/    
     pi_id.Ref = 0; //给定id
     pi_id.Fbk = ParkI.Ds;  //反馈id     
     PI_MACRO(pi_id);//  d轴控制器
     
 /************q轴控制器*******************/    
     pi_iq.Ref = pi_spd.Out; //速度输出
     pi_iq.Fbk = ParkI.Qs;  //反馈iq     
     PI_MACRO(pi_iq);//  q轴控制器 
     
  /************PARK逆变换*******************/     
     IparkU.Ds = pi_id.Out;
     IparkU.Qs = pi_iq.Out;
    
     IparkU.Sine = AngleSin_Cos.IQSin;//查表得到正弦值
     IparkU.Cosine=AngleSin_Cos.IQCos;//查表得到余弦值

     PARKinv_MARCO(IparkU) 
   
     Svpwm.Ualpha = IparkU.Alpha;
     Svpwm.Ubeta =  IparkU.Beta;
     
     SMO_Angle(ClarkI.Alpha,ClarkI.Beta,IparkU.Alpha,IparkU.Beta); //滑膜估算角度
    
     SVPWM_Gen(&Svpwm); //得到占空比
     PWM_CMP(); //得到PWM比较值
        
}

        增加了一个上位机接口,用于观测电流波形Iabc,SMO和speed。上位机用的是VOFA,一个开源的上位机。

 这是Iabc的波形。

这是SMO波形 

这是 速度speed波形

整体测试还算好吧,后续还有很多工作需要做。最后是测试视频 

  • 12
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: PMSM无感FOC控制是一种传统的控制方法,主要用于三相永磁同步电机的控制。该控制方法采用双闭环控制结构,在速度环和电流环之间分别设置了PI控制器,使电机达到精准控制。这种控制方法使用空间向量调制技术,结合三相电流反馈和三相电压反馈,实现电机的无感控制。 此外,PMSM无感FOC控制还使用了传统SVM技术,采用SVPWM波形,通过控制器的输出,使各相电流按照一定的规律变化,实现控制目标。 在标准FOC控制中,需要使用位置传感器来获取电机的位置信息,但PMSM无感FOC控制则使用基于传统的SVM技术来预测电机的位置信息。因此,不需要使用位置传感器即可实现对电机的控制,大大降低了系统成本。 总的来说,PMSM无感FOC控制是一种成熟的控制方法,在永磁同步电机控制中得到了广泛应用。在实际应用中,需要考虑控制器的参数与电机参数的匹配,以及实时性和稳定性等问题。 ### 回答2: PMSM无感FOC无感测控制技术)是一种高精度、高效率的电机控制技术,在工业控制领域中应用很广泛。相较于其他传统的电机控制技术,PMSM无感FOC具有以下优点: 首先,在控制效果方面,PMSM无感FOC可以实现高精度的转速控制和位置控制,具有响应速度快、控制精度高的特点。其次,在节能方面,由于无感FOC控制技术可以减小电机的逆磁电动势,并通过控制直流电流的大小和方向来控制电机运行状态,从而达到更好的节能效果。此外,PMSM无感FOC还具有抗干扰性强、控制性能稳定等优点。 对于传统SME控制过程中存在的一些问题,PMSM无感FOC采用了一种更加先进的控制方法。它主要是通过异步滤波器解决了转子位置和速度的估算问题。PMSM无感FOC还采用了PID控制算法,能够有效地改善系统的响应速度和控制精度。在实际使用过程中,PMSM无感FOC控制技术已经被广泛应用于家电、工业领域等多个方面,为工业应用提供了更加高效、稳定的电机控制方案。 ### 回答3: PMSM无感FOC控制是一种新型的电机控制方法,目前广泛应用于工业和家用电机系统中。传统的FOC控制方法需要使用霍尔传感器或编码器等硬件传感器来获取电机转子位置信息,但这些传感器会增加系统的复杂度和成本。相比之下,PMSM无感FOC控制方法通过算法来估算电机转子位置和速度,避免了传感器的使用,从而降低了系统的成本和故障率。 在PMSM无感FOC控制中,传统的滑模观测器(SME)已经不能满足要求,因为它对参数敏感,噪声容易干扰,不易消除不确定性,导致控制精度不高,反应缓慢。为了解决这些问题,研究人员开发了传统滑模观测器的改进版——新型滑模观测器SMO)。这种观测器采用了自适应观测器方法来估算电机参数,同时利用滑动模式控制来消除不确定性,提高控制精度和鲁棒性。 另外,PMSM无感FOC控制还需要使用支持向量机(SVM)算法来实现空间矢量调制(SVM)控制。SVM是一种基于统计学习理论的分类算法,它能够将多维特征空间映射到高维特征空间,从而更好地进行分类。在PMSM无感FOC控制中,SVM算法用来确定电机的磁场方向和转子速度,从而实现调制控制。 总之,PMSM无感FOC控制方法是一种高效、可靠、成本低的电机控制方法,相比传统FOC控制方法具有更好的控制精度和鲁棒性。它需要使用新型滑模观测器和SVM算法来实现,可以广泛应用于各种电机系统中,具有极高的应用前景。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值