|
本帖最后由 damiaa 于 2018-8-31 15:07 编辑 【STM32电机培训online】+ P-NUCLEO-IHM002 修改PID参数# u8 K5 @2 h/ @" q$ ` / T) Q8 l! g$ f3 w+ a 接上面的例子开始修改PID参数实验:所谓的PID就是看稳定到一个速度是快是慢,稳定的时候会高一些,然后再降下来。 B0 V# |/ R( C# g % A ]5 L1 `8 v( V$ w8 ^ 1,要在项目的main.c 中加入头文件 #include "mc_api.h" #include "mc_tasks.h"- P9 I) a2 A* ?% E : o! i- g: H f3 [& k1 F/ R 2,写个函数 void modimotospeed(void) { MCT_Handle_t* pMctHdl; static int16_t Speed_Kp,Speed_Ki;* G. }6 S1 |" k5 b. M+ g 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);8 J# e4 y6 E" S3 L0 r' S6 b 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);0 T. X5 `! n$ F0 C# o Speed_Ki = PID_GetKI(pMctHdl->pPIDSpeed);: j, l ?1 B* M' F2 U5 v PID_SetKP(pMctHdl->pPIDSpeed,Speed_Kp*2);- U4 j$ N' y# P! Y. f4 ^ `; \ PID_SetKI(pMctHdl->pPIDSpeed,Speed_Ki*2); HAL_Delay(10000); f W# h* r) k$ |5 j8 R MC_StopMotor1();// HAL_Delay(10000); MC_ProgramSpeedRampMotor1(1000/6,3000); MC_StartMotor1(); HAL_Delay(10000);# t( M$ ]; E, h# O 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);5 l, r+ S8 I& u, p7 D HAL_Delay(10000); Speed_Kp = PID_GetKP(pMctHdl->pPIDSpeed);* X0 V+ y/ p+ V) u- s+ a- o3 f, R2 D! d Speed_Ki = PID_GetKI(pMctHdl->pPIDSpeed);9 w1 d9 N0 p7 c- Y/ o# ]& `: M PID_SetKP(pMctHdl->pPIDSpeed,Speed_Kp/2);. P c. k) T( l PID_SetKI(pMctHdl->pPIDSpeed,Speed_Ki/2); HAL_Delay(10000);& t0 ~& v" e/ | Speed_Kp = PID_GetKP(pMctHdl->pPIDSpeed); Speed_Ki = PID_GetKI(pMctHdl->pPIDSpeed); PID_SetKP(pMctHdl->pPIDSpeed,Speed_Kp/2);) n: E+ Z4 [2 o9 B! D7 J PID_SetKI(pMctHdl->pPIDSpeed,Speed_Ki/2);8 f% C2 S f5 Z/ @+ t ^# | HAL_Delay(10000);$ y5 b/ |# T) n- ] MC_StopMotor1();// while(1); }! w( ~$ r' }' @" F7 ^" Z' E 并在main.c 中调用,main.c 中main函数前声明外部函数extern MCT_Handle_t* GetMCT(uint8_t bMotor);然后编译运行,看是否跑得起来。
, A1 r* B) ?* A# G8 c
3,在MotorControl Workbench 5.0.3 中打开工程。# C8 c" E ~: j; t
4,观察变化(这里注意,是MDK或IAR等的要观察的工程运行起来了后才能里连接串口观察),按下图1位置,打开监控,按2,连接,3,4部分看变化,可以看到电机的速度,电机的运行参数曲线等。5 h3 r: F7 u9 S. E1 Y" D& f7 A1 s
5,最直观的方法还是在main.c中调用 下面的函数,然后改动红色部分的Speed_Kp*2,Speed_Ki*2 2为要改动的倍数,可以0.5,1.5等看看波形变化。6 k5 N4 V1 m7 {; X8 H1 H void task2(void)9 j5 X! ^ f; t O& e; L {' R9 m5 Z: }$ n% k; @8 [ //TASK2?? MCT_Handle_t* pMctHdl;1 D+ A3 j7 k2 A* E static int16_t Speed_Kp,Speed_Ki; MC_ProgramSpeedRampMotor1(3000/6,3000);$ @3 q1 n" U9 B MC_StartMotor1(); pMctHdl = GetMCT(M1);% a) j) ]% H- `1 c% ^) k0 i* k) t1 O& z Speed_Kp = PID_GetKP(pMctHdl->pPIDSpeed);6 J; g1 C1 R) t) L& c& H Speed_Ki = PID_GetKI(pMctHdl->pPIDSpeed);4 N" X+ }3 x% O( ^0 p7 k! f PID_SetKP(pMctHdl->pPIDSpeed,Speed_Kp*2); PID_SetKI(pMctHdl->pPIDSpeed,Speed_Ki*2);) `6 ~2 }" w3 q, Q$ o/ c6 X- ]+ k while(1); } 改为0.5的波形:
改为1的波形:8 F! j1 J/ q$ s3 l
改为2的波形1 s( O) [: h0 z7 \
* M1 y5 M) h, C 6,继续加油。* L# i& ~. S6 \+ v6 b3 Q/ c " m3 P/ g1 _# J ' o) ~# b/ A& A- b8 _- P* Q- m |
| 谢谢分享 |
微信公众号
手机版