本帖最后由 damiaa 于 2018-8-31 15:07 编辑 3 V# ^6 d5 u- S. h' c 9 i+ ^, u) h6 m$ `8 z. t 【STM32电机培训online】+ P-NUCLEO-IHM002 修改PID参数 接上面的例子开始修改PID参数实验:所谓的PID就是看稳定到一个速度是快是慢,稳定的时候会高一些,然后再降下来。 7 U7 `% I8 @! I5 m 1,要在项目的main.c 中加入头文件 #include "mc_api.h"- j9 b) G5 C, R+ x& } #include "mc_tasks.h"6 u$ ]3 O; @6 l 2,写个函数 W6 K2 O5 \1 R0 E, _% h% t( Y. n void modimotospeed(void) {) U r4 L, J( c2 f% ^* G" z) w MCT_Handle_t* pMctHdl; static int16_t Speed_Kp,Speed_Ki;" Z( s: a* L$ E MC_ProgramSpeedRampMotor1(2000/6,3000);( R( v: T4 L r7 H M MC_StartMotor1();: J" Z2 i0 ]' h HAL_Delay(10000); pMctHdl = GetMCT(M1);5 ^' ?/ V) `* J% O" |. Q7 b" M 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"" k+ K8 U3 D) r2 t: i- s- O7 X HAL_Delay(5000);+ p+ U4 s( e* g Speed_Kp = PID_GetKP(pMctHdl->pPIDSpeed);0 m$ H! a+ X3 y0 w: I4 Q Speed_Ki = PID_GetKI(pMctHdl->pPIDSpeed); PID_SetKP(pMctHdl->pPIDSpeed,Speed_Kp*2); PID_SetKI(pMctHdl->pPIDSpeed,Speed_Ki*2); HAL_Delay(10000);2 j' d& [. w9 X' A$ `5 X& | MC_StopMotor1();// HAL_Delay(10000); MC_ProgramSpeedRampMotor1(1000/6,3000); MC_StartMotor1(); HAL_Delay(10000);1 B, t9 N' d& v( w5 y 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);% C' ?, T( d3 r0 n5 S PID_SetKI(pMctHdl->pPIDSpeed,Speed_Ki/2); HAL_Delay(10000); Speed_Kp = PID_GetKP(pMctHdl->pPIDSpeed);- X0 B. m6 Y" o# t' \& I 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();//8 s4 b5 K% j+ k& S 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部分看变化,可以看到电机的速度,电机的运行参数曲线等。$ u1 J- \6 b& p* f7 B* |2 ^ 5,最直观的方法还是在main.c中调用 下面的函数,然后改动红色部分的Speed_Kp*2,Speed_Ki*2 2为要改动的倍数,可以0.5,1.5等看看波形变化。 void task2(void) {7 |+ G$ W! w& w) M //TASK2?? s6 g# g2 \7 A+ ]. x MCT_Handle_t* pMctHdl;% Q- B8 X/ K5 {' `6 V static int16_t Speed_Kp,Speed_Ki;: c0 P( e" O N MC_ProgramSpeedRampMotor1(3000/6,3000);( v7 |! \; d. p4 `6 B2 T; l! e MC_StartMotor1(); pMctHdl = GetMCT(M1); Speed_Kp = PID_GetKP(pMctHdl->pPIDSpeed);% a3 u8 b( m; c6 j Speed_Ki = PID_GetKI(pMctHdl->pPIDSpeed); PID_SetKP(pMctHdl->pPIDSpeed,Speed_Kp*2); PID_SetKI(pMctHdl->pPIDSpeed,Speed_Ki*2); while(1);, [0 m* B7 ^ e7 g( a } 改为0.5的波形: 改为1的波形:) \% o6 m! o9 G' u 改为2的波形 6,继续加油。0 X; A9 O2 d7 N 8 W- ?9 }7 u$ {+ S: t# f$ y 0 |7 Y$ z2 s& u5 }8 W4 E% E; v 2 k; w6 K% d b+ A* O2 {0 S7 d : X0 T, E- h. }& ?" V, C7 L |
谢谢分享 |