
本帖最后由 damiaa 于 2018-8-31 15:07 编辑 【STM32电机培训online】+ P-NUCLEO-IHM002 修改PID参数 接上面的例子开始修改PID参数实验:所谓的PID就是看稳定到一个速度是快是慢,稳定的时候会高一些,然后再降下来。 1,要在项目的main.c 中加入头文件 #include "mc_api.h" #include "mc_tasks.h" 2,写个函数 void modimotospeed(void) { MCT_Handle_t* pMctHdl; static int16_t Speed_Kp,Speed_Ki; MC_ProgramSpeedRampMotor1(2000/6,3000); MC_StartMotor1(); HAL_Delay(10000); 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); //主要用到的函数,需要头文件#include "mc_tasks.h" HAL_Delay(5000); 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); HAL_Delay(10000); MC_StopMotor1();// HAL_Delay(10000); MC_ProgramSpeedRampMotor1(1000/6,3000); MC_StartMotor1(); HAL_Delay(10000); 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); HAL_Delay(10000); 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); HAL_Delay(10000); 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); HAL_Delay(10000); MC_StopMotor1();// while(1); } 并在main.c 中调用,main.c 中main函数前声明外部函数extern MCT_Handle_t* GetMCT(uint8_t bMotor);然后编译运行,看是否跑得起来。 ![]() ![]() 3,在MotorControl Workbench 5.0.3 中打开工程。 ![]() 4,观察变化(这里注意,是MDK或IAR等的要观察的工程运行起来了后才能里连接串口观察),按下图1位置,打开监控,按2,连接,3,4部分看变化,可以看到电机的速度,电机的运行参数曲线等。 ![]() ![]() ![]() 5,最直观的方法还是在main.c中调用 下面的函数,然后改动红色部分的Speed_Kp*2,Speed_Ki*2 2为要改动的倍数,可以0.5,1.5等看看波形变化。 void task2(void) { //TASK2?? MCT_Handle_t* pMctHdl; static int16_t Speed_Kp,Speed_Ki; MC_ProgramSpeedRampMotor1(3000/6,3000); MC_StartMotor1(); 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); while(1); } 改为0.5的波形: ![]() 改为1的波形: ![]() 改为2的波形 ![]() 6,继续加油。 |
谢谢分享 |