- 基于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);
复制代码
- PID_SetKP(pMctHdl->pPIDSpeed,Speed_Kp*2); PID_SetKI(pMctHdl->pPIDSpeed,Speed_Ki*2);
复制代码
- 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://blog.csdn.net/qq1291917670/article/details/111945076
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |