STM32電機控制--API函式應用

語言: CN / TW / HK
 基於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);
    }

在這裡插入圖片描述
在這裡插入圖片描述