基于ST MC SDK 5.2版本的应用
一般的电机操作调用API就足够控制基本的电机运行
下图是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…的循环
在程序中修改速度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);
速度正转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);
}