STM32电机控制--API函数应用

 基于ST MC SDK 5.2版本的应用
 一般的电机操作调用API就足够控制基本的电机运行
 下图是API函数的列表: 

在这里插入图片描述
在这里插入图片描述

1. 应用一 :API速度的控制-控制电机的启动停止

程序启动后,电机以3000RMP的速度运行10S后停止
停止5S后,电机重新以3000RPM转速运行10S后停止
以上过程重复操作

注意:速度指令参数是以0.1Hz为单位,3000RPM=3000/6(0.1Hz)

在这里插入图片描述
在这里插入图片描述

速度指令

在MotorControl Workbench 5.2.0生成的程序基础上添加代码,在main.c中添加

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------*/

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */
void Delay_Handler(void)
{
    
    
  delay_cnt++;
  if(delay_cnt>2000)          //1s计时
	{
    
    
		delay_cnt=0;

		if(delay_start_flag==0x30)  //启动10s计时
		{
    
    
			delay_cnt1++;
			if(delay_cnt1>9)          //10S
			{
    
    
				delay_cnt1=0;
				delay_start_flag=0x20;    
				delay_10s_flag=1;       //10S时间到标志位
			} 
		}
		else if(delay_start_flag==0x20)  //启动5s计时
		{
    
    
			delay_cnt1++;
			if(delay_cnt1>4)           //5S
			{
    
    
			  delay_cnt1=0;
			  delay_start_flag=0x30;
			  delay_5s_flag=1;   //5S时间到标志位
			}
		}  
	}
}
/* USER CODE END 0 */

int main(void)中

  /* USER CODE BEGIN 2 */
     
  MC_ProgramSpeedRampMotor1(3000/6,1000);  //1s内加速到3000RPM
  MC_StartMotor1();      //启动电机
	
  /* USER CODE END 2 */
  /* USER CODE BEGIN 3 */
		
		if(delay_10s_flag==1)     //10S
		{
    
    
			MC_StopMotor1();         //停止电机运行
			delay_10s_flag=0;
		}
		if(delay_5s_flag==1)     //5S
		{
    
    
			MC_StartMotor1();
			delay_5s_flag=0;
		}

在stm32f4xx_mc_it.c中添加
滴答定时中断程序里面调用定义的函数Delay_Handler(void);
在这里插入图片描述
添加完后编译下载即可实现3000RPM运行10S停止5S运行10S…的循环
在这里插入图片描述

2. 应用二 :PI组件接口函数做在线参数修改

在程序中修改速度PI值
修改为原始值的2倍
修改为原始值的0.3倍
观察参数修改后的速度曲线

在MotorControl Workbench 5.2.0生成的程序基础上添加代码,在main.c中添加

添加头文件mc_extended_api.h

/* USER CODE BEGIN Includes */
#include "mc_extended_api.h"
/* USER CODE END Includes */

变量定义

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
MCT_Handle_t *pMctHdl;                       //定义的变量
static int16_t Speed_Kp,Speed_Ki;
/* USER CODE END PV */

main函数中添加

  /* USER CODE BEGIN 2 */
  pMctHdl = GetMCT(M1);
  Speed_Kp= PID_GetKP(pMctHdl->pPIDSpeed);
  Speed_Ki= PID_GetKI(pMctHdl->pPIDSpeed);
  
  PID_SetKP(pMctHdl->pPIDSpeed,Speed_Kp*2);
  PID_SetKI(pMctHdl->pPIDSpeed,Speed_Ki*2);
  /* USER CODE END 2 */

编译下载并查看速度曲线

  • 原始倍数的时候
  PID_SetKP(pMctHdl->pPIDSpeed,Speed_Kp*1);
  PID_SetKI(pMctHdl->pPIDSpeed,Speed_Ki*1);

在这里插入图片描述

  • 2倍PI的时候
  PID_SetKP(pMctHdl->pPIDSpeed,Speed_Kp*2);
  PID_SetKI(pMctHdl->pPIDSpeed,Speed_Ki*2);

在这里插入图片描述

  • 0.3倍PI的时候
  PID_SetKP(pMctHdl->pPIDSpeed,Speed_Kp*0.3);
  PID_SetKI(pMctHdl->pPIDSpeed,Speed_Ki*0.3);

在这里插入图片描述

3. 应用三 :基于MC SDK状态的切换

速度正转3000rpm
速度立刻反转-3000rpm
产生状态报错,需要程序返回报错信息
清除报错信息,返回到IDLE状态
然后继续执行反转-3000rpm速度指令

在这里插入图片描述
这个实验一开始是采用的HALL传感器来测试,但是发现速度能进行正常切换,不会报故障停机,然后换了无传感器模式的之后,就会报速度反馈错误的故障停机,下边是基于无传感器模式的:

在MotorControl Workbench 5.2.0生成的程序(Sensorless)基础上添加代码,在main.c中添加

main函数中添加

  /* USER CODE BEGIN 2 */
  MC_ProgramSpeedRampMotor1(3000/6,1000);  
  MC_StartMotor1();  
  HAL_Delay(5000);                        
  MC_ProgramSpeedRampMotor1(-3000/6,1000); 
  /* USER CODE END 2 */

速度正转3000rpm后立刻反转-3000rpm,产生状态报错(速度反馈),需要程序返回报错信息
在这里插入图片描述
在这里插入图片描述
状态报错,需要程序返回报错信息,清除报错信息,返回到IDLE状态,然后继续执行反转-3000rpm速度指令

程序添加,main函数中

  /* USER CODE BEGIN 1 */    
	 State_t sts_motor1; 
  /* USER CODE END 1 */

  /* USER CODE BEGIN 3 */
    sts_motor1 = MC_GetSTMStateMotor1();     //获取电机状态
		
    if(sts_motor1 == FAULT_OVER)             //电机报错
    {
    
    
      MC_AcknowledgeFaultMotor1();           //清除故障,返回到IDLE状态
      
    }
    else if(sts_motor1 == IDLE)              //继续执行反转-3000rpm速度指令
    {
    
    
      MC_StartMotor1();
      MC_ProgramSpeedRampMotor1(MC_GetLastRampFinalSpeedMotor1(), 1000);
    }

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq1291917670/article/details/111945076