本帖最后由 stm1024 于 2018-9-7 08:12 编辑
" k* K- j/ A, W+ t8 x5 j
. Z' M3 u @6 g$ p这次测试相当于是培训中的试验4“基于MC SDK5.0 状态的切换 ”
1 G: T: w0 C- v3 w+ \让电机正反转,常规的做法是:
. G$ s3 E9 Q% n( j; x- MC_ProgramSpeedRampMotor1(3000 / 6, 1000);
+ f# Y( {, X5 v9 I% M2 A8 l - MC_StartMotor1();& y( s# v$ `% |8 d
- HAL_Delay(10000);) ], ?- V) v' _, O
- MC_StopMotor1();
' M) I7 ^9 x. G- h: w - HAL_Delay(5000); ( q: H% X+ H, _ D
- ! M0 v w8 m- H4 v+ h
- MC_ProgramSpeedRampMotor1(-3000 / 6, 1000);/ ^$ t2 X/ ]$ N) s( f& \
- MC_StartMotor1();
3 z. U/ T4 ?" X; d: H- T' z - HAL_Delay(10000);
: {6 m- d$ Z1 {8 }0 i - MC_StopMotor1();
4 `% b" S, u& l% {* |2 h - HAL_Delay(5000);
复制代码 这段代码可以保证电机正转10秒后停5秒,然后反转10秒后停5秒,如此反复,而且不会出现故障。
2 C. Z3 n8 j2 Z; R5 m+ T+ p9 e( Y3 v* H* Z# s# r3 l# I( E `1 U
不过试验中的要求是,速度反转3000后立即切换为正转3000,通过前面的介绍可以知道,在速度接近0的时候,会产生speed feedback的故障报警。
/ M8 R3 ^% f# R- k. k( E这也简单:0 u: ]( ^- X2 U8 I# I# [+ N/ ]
- MC_StartMotor1();
/ ?3 Z& R4 y6 Y: U - MC_ProgramSpeedRampMotor1(3000 / 6, 1000);
Z! f; ]6 ^6 X: r" Z) h2 A - HAL_Delay(10000); S$ Q0 Q5 M$ l3 H/ e
- MC_ProgramSpeedRampMotor1(-3000 / 6, 1000);' R9 [0 J" K. ]4 I* t
- HAL_Delay(10000);
复制代码 运行的效果是:
+ A9 X' L; i5 i0 Z3 S: ]/ y
8 b/ L& X# m1 T& e可见在运转过程中是会出现speed feedback错误的。 接下来是如何消除错误。 - MC_StartMotor1();- k0 k# }9 Z' b1 n3 V
-
/ B9 f, ~4 b) R2 L - MC_ProgramSpeedRampMotor1(3000 / 6, 1000);
# ]# z4 O+ r' U - MC_AcknowledgeFaultMotor1();
5 Q% T8 ^! r; y5 D, \ - MC_ProgramSpeedRampMotor1(MC_GetLastRampFinalSpeedMotor1(), 1000);' O2 ~3 [ C2 b* B2 t/ F6 w
- HAL_Delay(10000);
" _6 W0 B* c- } - / B: g: G/ x* v6 |$ i, ~
- MC_ProgramSpeedRampMotor1(-3000 / 6, 1000);& o8 a# @& U% i! |' e" U/ m
- MC_AcknowledgeFaultMotor1();. l3 R! }! j$ D+ g P
- MC_ProgramSpeedRampMotor1(MC_GetLastRampFinalSpeedMotor1(), 1000);5 n; g- j5 k2 I2 e8 f) i/ u- }
- HAL_Delay(10000);
复制代码 这样就可以消除错误,电机也会正反转,不过没有最开始的代码处理的快,毕竟stop motor直接让motor回到了idle状态。测试过程中还发现,如果延时时间太短,例如把两个10000都改为5000,则电机也会一直朝着一个方向转动,估计是留给错误恢复的时间不够?或者是我对SDK的理解不够深入吧' I/ F' V6 X5 e l
|