你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM32电机培训online】+ P-NUCLEO-IHM002 修改PID参数

[复制链接]
damiaa 发布时间:2018-8-30 17:15
本帖最后由 damiaa 于 2018-8-31 15:07 编辑
/ @) G: W& b7 \9 s: u1 H0 d
* Y0 _" d7 x5 k2 {  b【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 中加入头文件
7 I1 M' H, J% i& g" [#include "mc_api.h"
6 b7 p. V. h: v( h# r#include "mc_tasks.h"- P9 I) a2 A* ?% E
: o! i- g: H  f3 [& k1 F/ R
2,写个函数
7 Z5 G; h+ f& Q% V9 Cvoid modimotospeed(void)
3 h4 ~) \" K' I{
# L4 y# h: Z& P; K9 @+ P/ M; F        MCT_Handle_t* pMctHdl;
+ K) ?" u7 z+ x3 ?- D9 H0 D8 Y         static int16_t Speed_Kp,Speed_Ki;* G. }6 S1 |" k5 b. M+ g
        MC_ProgramSpeedRampMotor1(2000/6,3000);
. I4 S0 D& B! T# [) A  MC_StartMotor1();
; u4 F* ?" @; j( r6 I        HAL_Delay(10000);
3 @7 W+ [8 ?: [; p. B2 d        pMctHdl = GetMCT(M1);
: R# c: q9 Y( {  M5 J0 K8 E        Speed_Kp = PID_GetKP(pMctHdl->pPIDSpeed);
+ b- \  |9 q+ }1 J: R% @        Speed_Ki = PID_GetKI(pMctHdl->pPIDSpeed);8 J# e4 y6 E" S3 L0 r' S6 b
        PID_SetKP(pMctHdl->pPIDSpeed,Speed_Kp*2);
. _/ K. x/ c1 e- e: `; l        PID_SetKI(pMctHdl->pPIDSpeed,Speed_Ki*2);    //主要用到的函数,需要头文件
#include "mc_tasks.h"
& D8 f% @3 U6 `# G3 R" v        HAL_Delay(5000);
9 v2 _, Q# Z. b* k4 \- d+ [* J        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);
' ?' O# d" Z9 P8 n" C. v" c        HAL_Delay(10000);  f  W# h* r) k$ |5 j8 R
        MC_StopMotor1();//
( F/ f$ R0 Y* T# v+ x        HAL_Delay(10000);
3 C  }  Z: {9 P        MC_ProgramSpeedRampMotor1(1000/6,3000);
. Y0 k6 R- [) p% D  MC_StartMotor1();
7 q+ _/ Z; R+ I1 h; g' X' ?. s        HAL_Delay(10000);# t( M$ ]; E, h# O
        Speed_Kp = PID_GetKP(pMctHdl->pPIDSpeed);
( Z5 V5 j6 X' L9 u  Q# u        Speed_Ki = PID_GetKI(pMctHdl->pPIDSpeed);
* \+ G. z- H) R1 h3 V# A6 U) v        PID_SetKP(pMctHdl->pPIDSpeed,Speed_Kp/2);
( Y: L! r3 m- ]        PID_SetKI(pMctHdl->pPIDSpeed,Speed_Ki/2);5 l, r+ S8 I& u, p7 D
        HAL_Delay(10000);
; P; b, K4 d' i1 f* \8 }/ k        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);
  i' K# G7 H" P( {, x        HAL_Delay(10000);& t0 ~& v" e/ |
        Speed_Kp = PID_GetKP(pMctHdl->pPIDSpeed);
  I; ~- w0 g2 _; f        Speed_Ki = PID_GetKI(pMctHdl->pPIDSpeed);
. y' S% Z# T. m        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();//
( _% q7 B1 M4 X% ~4 H3 d        while(1);
; S3 p+ o/ v7 G  \}! w( ~$ r' }' @" F7 ^" Z' E

3 V. `* z5 T6 M; i3 C. L并在main.c 中调用,main.c 中main函数前声明外部函数extern MCT_Handle_t* GetMCT(uint8_t bMotor);然后编译运行,看是否跑得起来。 捕获18.PNG / g( `9 \, _  A( ~. C
, A1 r* B) ?* A# G8 c
微信图片_20180827100256.jpg / U3 q& Z8 J2 N7 {! H5 Z
3,在MotorControl Workbench 5.0.3 中打开工程。# C8 c" E  ~: j; t
捕获19.PNG
; J4 w' `, j6 r1 }5 p* h4,观察变化(这里注意,是MDK或IAR等的要观察的工程运行起来了后才能里连接串口观察),按下图1位置,打开监控,按2,连接,3,4部分看变化,可以看到电机的速度,电机的运行参数曲线等。5 h3 r: F7 u9 S. E1 Y" D& f7 A1 s
捕获20.PNG 捕获21.PNG ) N2 g* j7 u+ g4 M! w
捕获22.PNG
' D- ]% e5 }  K$ o5,最直观的方法还是在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??
& }, o  C% B2 C, B, c  MCT_Handle_t* pMctHdl;1 D+ A3 j7 k2 A* E
  static int16_t Speed_Kp,Speed_Ki;
+ C+ }4 t( J) X- L) S        MC_ProgramSpeedRampMotor1(3000/6,3000);$ @3 q1 n" U9 B
  MC_StartMotor1();
% M5 a$ `! [& i5 E        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);
$ q6 _4 u7 q: B' z        PID_SetKI(pMctHdl->pPIDSpeed,Speed_Ki*2);) `6 ~2 }" w3 q, Q$ o/ c6 X- ]+ k
        while(1);
/ [7 k' F4 r* s: d; J) }: U}        
" _0 Q8 y" n) F! K! q3 d1 K+ _改为0.5的波形:
' V  {& }6 z" s3 ]. W3 S 捕获25.PNG ; s3 G" F3 u7 H: T
改为1的波形:8 F! j1 J/ q$ s3 l
捕获23.PNG
$ I3 s' z9 A- }, ?改为2的波形1 s( O) [: h0 z7 \
捕获24.PNG
1 ^  d$ P5 `# `* M1 y5 M) h, C
6,继续加油。* L# i& ~. S6 \+ v6 b3 Q/ c
" m3 P/ g1 _# J

0 o3 ~5 _/ K( A( p' o) ~# b/ A& A- b8 _- P* Q- m

3 Y4 Y- f) s' f( B/ r6 C
4 p: m9 t" f! ]  g
捕获25.PNG
赞 收藏 评论1 发布时间:2018-8-30 17:15

举报

1个回答
zero99 回答时间:2018-8-31 13:15:48
谢谢分享
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版