本帖最后由 damiaa 于 2018-8-31 15:07 编辑 【STM32电机培训online】+ P-NUCLEO-IHM002 修改PID参数 接上面的例子开始修改PID参数实验:所谓的PID就是看稳定到一个速度是快是慢,稳定的时候会高一些,然后再降下来。: h6 g8 |& q3 r4 z$ N! t1 ` ; T) k3 q- ]- _) `# k1 Q' b& @1 ~ 1,要在项目的main.c 中加入头文件. J! G2 w! F, n$ u0 b #include "mc_api.h"9 z8 @7 k- A2 m- E #include "mc_tasks.h"* ]* q7 J5 {/ }& z, ?7 s 2,写个函数 void modimotospeed(void)$ P( X; _* t) r2 T8 m. k* Q {8 K" f! V! D6 Z y MCT_Handle_t* pMctHdl;5 F1 E/ S! D! v static int16_t Speed_Kp,Speed_Ki; MC_ProgramSpeedRampMotor1(2000/6,3000);5 e# `. K: m1 L2 H* S MC_StartMotor1(); HAL_Delay(10000); pMctHdl = GetMCT(M1);. b2 `5 Y O( d0 ?& U Speed_Kp = PID_GetKP(pMctHdl->pPIDSpeed); Speed_Ki = PID_GetKI(pMctHdl->pPIDSpeed);. K: j6 R; x: Z+ @) X- l PID_SetKP(pMctHdl->pPIDSpeed,Speed_Kp*2);/ ~. B0 N) z" z/ x PID_SetKI(pMctHdl->pPIDSpeed,Speed_Ki*2); //主要用到的函数,需要头文件#include "mc_tasks.h" HAL_Delay(5000);: `% k. K4 ~/ ?8 G- i, L2 Z Speed_Kp = PID_GetKP(pMctHdl->pPIDSpeed);0 D+ E4 v7 N- _* {+ ?# ^- C0 |: v Speed_Ki = PID_GetKI(pMctHdl->pPIDSpeed);9 U, q& I! Q* a# I PID_SetKP(pMctHdl->pPIDSpeed,Speed_Kp*2); PID_SetKI(pMctHdl->pPIDSpeed,Speed_Ki*2);0 k2 v- v6 u/ k% h# ^$ @ HAL_Delay(10000);) I5 B2 L% n* D. g MC_StopMotor1();//8 E; b/ |% r, ?# D5 l HAL_Delay(10000);" K2 ]5 j/ x3 P8 k0 G MC_ProgramSpeedRampMotor1(1000/6,3000); MC_StartMotor1();) P$ P" K: K4 ^+ [/ [+ q HAL_Delay(10000);5 t0 H$ {; C8 ]1 W 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);' w( d! Y W6 I I, J3 ~9 _/ l2 q: C HAL_Delay(10000); Speed_Kp = PID_GetKP(pMctHdl->pPIDSpeed); Speed_Ki = PID_GetKI(pMctHdl->pPIDSpeed);/ c6 k+ ]4 l3 i* g PID_SetKP(pMctHdl->pPIDSpeed,Speed_Kp/2);" p& \0 k" ?/ B; ~; q$ P: N# W1 x8 b PID_SetKI(pMctHdl->pPIDSpeed,Speed_Ki/2);$ N' |: V1 j; ]6 Y2 c9 d3 j$ E9 j HAL_Delay(10000);) v" y4 i# q0 }6 J! m$ ^8 F- \+ H3 C Speed_Kp = PID_GetKP(pMctHdl->pPIDSpeed);( y6 J. P+ U- g& E' b9 r2 w, H Speed_Ki = PID_GetKI(pMctHdl->pPIDSpeed); PID_SetKP(pMctHdl->pPIDSpeed,Speed_Kp/2);$ i* h0 m( M5 l PID_SetKI(pMctHdl->pPIDSpeed,Speed_Ki/2); HAL_Delay(10000);6 D' L/ S0 N7 O7 l1 @# L MC_StopMotor1();//1 g% {- ?& W" i while(1);* g% k1 g5 h" G0 G }/ F3 k1 L) k8 s* d a ! j6 F# A( F' T, l 并在main.c 中调用,main.c 中main函数前声明外部函数extern MCT_Handle_t* GetMCT(uint8_t bMotor);然后编译运行,看是否跑得起来。 4 U: W! b! W- L 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等看看波形变化。8 s* ~+ f% p( ?- d+ i1 L J* ] void task2(void) { //TASK2??' X# Z) m. B- i' X6 m5 J MCT_Handle_t* pMctHdl; static int16_t Speed_Kp,Speed_Ki; MC_ProgramSpeedRampMotor1(3000/6,3000); MC_StartMotor1();/ f5 D* n7 P! ` pMctHdl = GetMCT(M1);* f: T+ s/ F7 N1 F! @ Speed_Kp = PID_GetKP(pMctHdl->pPIDSpeed); Speed_Ki = PID_GetKI(pMctHdl->pPIDSpeed);: j6 ^& r+ P, F: Y; e' `/ y6 W PID_SetKP(pMctHdl->pPIDSpeed,Speed_Kp*2);7 Z+ j$ `( {8 `2 r; r( A0 n, k. n PID_SetKI(pMctHdl->pPIDSpeed,Speed_Ki*2);1 T! `3 i9 R% F3 y2 V while(1);' v1 l2 F! P f% V; z } # `+ S) a( ?( D% T- h1 u/ e 改为0.5的波形: 改为1的波形:+ j2 }0 {6 X+ K& @/ I 改为2的波形4 m2 L. ~( ]# `2 r" n# q/ C 6,继续加油。 5 J2 ]! m% p* Z, P& g- h W( @3 g5 v0 _0 a% _; \& m 7 P& Y0 C6 j# q 6 c9 I* D; u: o* \- g0 S& s + S6 i3 M( e$ o1 H |
谢谢分享 |