STM32 使用IQmath实现SVPWM 正弦波无刷电机控制

         带有浮点运算的MCU在市场上已经越来越多了,但是便宜好开发的却没有。可不可以使用我们常用的ST的103系列的MCU来做一个svpwm的控制器呢?当然是可以了,但是直接使用不太行,因为M3内核的MCU不具备浮点运算功能,F4系列的具有浮点运算功能,可惜价格不便宜,假货还挺多。在这里介绍一下TI的浮点运算库,IQmath。以及如何应用在SVPWM无刷电机控制,充分降低控制器的成本。

IQmath优势:

        用于定点处理器的数学函数库,加快了计算浮点值的速度。

提供Sin,cos,tan,arcsin,arccos,sqrt,fractional mpy,dv等的计算

在以下应用领域可以提高处理速度:

        电机控制

        伺服控制

        音频/图像编码和解码

        定点Q数学

        图形旋转 :根据应用要求调节分辨率

        指定GLOBAL_Q24:可在定点和浮点器件之间实现代码的无缝兼容性。

我们这里主要是对电机控制的应用,下面我们一起看一下程序。

 case Ready:
         Offset_CurrentReading();     //读取偏移量
         if(AdcValue.OffestFlag ==1 && Keynob == KeyStart)
         {     
           if(Controdmode == Hallloop)
           {
             mcState = Start;
						 IqStartSet = IqStart;
           }
           else 
           {
             mcState = Align;
           }
         }    
      break;

程序中我们在判断控制模式是否为hallloop,紧接着是状态赋值,IqstartSet = Iqstart;

 电机的状态定义了一个enum

typedef enum
{
  Ready,
  Align,
  Start,
  Run,
  Stop,
}McStateTypedef;

IQstart宏定义一个启动电流,调用__IQ().

#define IqStart        _IQ(0.28); //启动电流

在整个控制的过程中主要使用了__IQ(),没有调用其他的函数,下面我们看一下完成的控制部分代码

void MC_Control(void)
{ 
  switch(mcState)
  { 
    case Ready:
         Offset_CurrentReading();     //读取偏移量
         if(AdcValue.OffestFlag ==1 && Keynob == KeyStart)
         {     
           if(Controdmode == Hallloop)
           {
             mcState = Start;
						 IqStartSet = IqStart;
           }
           else 
           {
             mcState = Align;
           }
         }    
      break;
    
    case Align:
         Motor_Align();
         if(TimeStateCount == 0)
         { 
           mcState = Start;   
         }
                  
      break;
    case Start:
         if(Controdmode == Openloop)
         {
              mcState = Run; 
              Angle.Acc_a = _IQ(0.005); //加速度
              Angle.Setp_Max = 50;// 匀速度	          
					    
					 
         }
         else if(Controdmode == Hallloop)
         {  
						if(StateFlag.HallStartSetFlag ==0)
						{
							StateFlag.HallStartSetFlag = 1;
							HallStartAngle();
							Angle.Acc_a = _IQ(0.005); //加速度
							Angle.Setp_Max = 60;// 匀速度	
							Angle.Temp = Hall_Three.ele_angleIQ;
							TimeStateCount = 5000;
						}
						HallStart();
						
            ThreeHallanglecale();//得到角度

						if(TimeStateCount == 0)
						{
						 mcState = Run;     
						}							     
         }
         else if(Controdmode == SMOloop)
         {   
            if(StateFlag.StartSetFlag == 0)
            {
              StateFlag.StartSetFlag =1;
              TimeStateCount = 5000;
						  Angle.Acc_a = _IQ(0.005); //加速度
              Angle.Setp_Max = 55;// 匀速度
							IqStartSet = IqStart;
						}
						  Motor_IFStart();  
            if(TimeStateCount == 0)
            { 
               mcState = Run;
            }            
         }
      break;
    
    case Run:
         if(Controdmode == Openloop)
         {
              Motor_Open(); 
					    ThreeHallanglecale();//得到角度

         }
         else if(Controdmode == Hallloop)
         { 
              Mode_Hall_loop();    
         }
         else if(Controdmode == SMOloop)
         {
              SMO_SpeedLoop();
         }
      break;
    case Stop: 
         StopMotor();
		     if(Keynob == KeyStart)
					{
					  mcState = Ready;
						StateFlag.AlignSetFlag =0;
						StateFlag.StartSetFlag = 0 ;
						TimeStateCount = 0;
						Hall_Three.OldHall_State = 0;
						PWMZD_count = 0;
						Hall_Three.Speed_RPM = 0;
						Hall_Three.old_ele_angleIQ = 0;
						StateFlag.HallStartSetFlag = 0;
					}
      break;
  }

从实验现象来看,电机转动的还是很流畅。

ky_motor Foc 测试视频

实验开发板:开发板

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32使用IQmath库,首先需要将IQmath库添加到项目中。根据引用\[2\]中的描述,在Keil环境下进行开发,需要使用rvmdk-cm3路径下的静态库和头文件。可以按照以下步骤进行操作: 1. 解压IQmath库,可以得到各个平台下的静态库和头文件。 2. 打开Keil工程,在菜单界面点击图标进入project items。 3. 添加IQmath组,并添加rvmdk-cm3路径下的静态库和头文件。 4. 进入工程属性设置,添加rvmdk-cm3静态库的路径和头文件的包含路径。 完成以上步骤后,就可以在STM32使用IQmath库进行开发了。IQmath库适用于CM3芯片,因此可以在STM32F1系列上使用。该库提供了一些数学函数和运算符,可以方便地进行浮点运算。通过使用IQmath库,可以降低控制器的成本,并实现SVPWM无刷电机控制。 #### 引用[.reference_title] - *1* [【嵌入式】适用于Cortex-M3(STM32F10x)的IQmath库](https://blog.csdn.net/cyy010617/article/details/125906490)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [STM32 使用IQmath实现SVPWM](https://blog.csdn.net/u010632165/article/details/104042283)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [STM32 使用IQmath实现SVPWM 正弦波无刷电机控制](https://blog.csdn.net/richardgann/article/details/128445037)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值