基于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);
}


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/243370.html
標籤:其他
