请选择 进入手机版 | 继续访问电脑版

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

[复制链接]
西门听雨 发表于 2021-1-1 09:58:00 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
  1. 基于ST MC SDK 5.2版本的应用 一般的电机操纵调用API就足够控制根本的电机运行 下图是API函数的列表:
复制代码


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

  1. 程序启动后,电机以3000RMP的速度运行10S后停止停止5S后,电机重新以3000RPM转速运行10S后停止以上过程重复操纵注意:速度指令参数是以0.1Hz为单元,3000RPM=3000/6(0.1Hz)
复制代码



在MotorControl Workbench 5.2.0生成的程序底子上添加代码,在main.c中添加
  1. /* 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)中
  1.   /* USER CODE BEGIN 2 */       MC_ProgramSpeedRampMotor1(3000/6,1000);  //1s内加快到3000RPM  MC_StartMotor1();      //启动电机          /* USER CODE END 2 */
复制代码
  1.   /* 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组件接口函数做在线参数修改

  1. 在程序中修改速度PI值修改为原始值的2倍修改为原始值的0.3倍观察参数修改后的速度曲线
复制代码
在MotorControl Workbench 5.2.0生成的程序底子上添加代码,在main.c中添加
添加头文件mc_extended_api.h
  1. /* USER CODE BEGIN Includes */#include "mc_extended_api.h"/* USER CODE END Includes */
复制代码
变量界说
  1. /* USER CODE BEGIN PV *//* Private variables ---------------------------------------------------------*/MCT_Handle_t *pMctHdl;                       //界说的变量static int16_t Speed_Kp,Speed_Ki;/* USER CODE END PV */
复制代码
main函数中添加
  1.   /* 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 */
复制代码
编译下载并查察速度曲线


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



  • 2倍PI的时候
  1.   PID_SetKP(pMctHdl->pPIDSpeed,Speed_Kp*2);  PID_SetKI(pMctHdl->pPIDSpeed,Speed_Ki*2);
复制代码



  • 0.3倍PI的时候
  1.   PID_SetKP(pMctHdl->pPIDSpeed,Speed_Kp*0.3);  PID_SetKI(pMctHdl->pPIDSpeed,Speed_Ki*0.3);
复制代码

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

  1. 速度正转3000rpm速度立即反转-3000rpm产生状态报错,需要程序返回报错信息清除报错信息,返回到IDLE状态然后继承执行反转-3000rpm速度指令
复制代码

这个实验一开始是采用的HALL传感器来测试,但是发现速度能进行正常切换,不会报故障停机,然后换了无传感器模式的之后,就会报速度反馈错误的故障停机,下边是基于无传感器模式的:
在MotorControl Workbench 5.2.0生成的程序(Sensorless)底子上添加代码,在main.c中添加
main函数中添加
  1.   /* 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函数中
  1.   /* USER CODE BEGIN 1 */             State_t sts_motor1;   /* USER CODE END 1 */
复制代码
  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
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )