本帖最后由 stm1024 于 2018-9-7 08:12 编辑 3 V, s3 M: m2 n* E
9 k4 m x0 S' A% w5 ^% S( h- Q% U
这次测试相当于是培训中的试验4“基于MC SDK5.0 状态的切换 ”; ?" V8 J* J1 T$ D) _1 ^- F2 @4 p% y
让电机正反转,常规的做法是:7 y7 {* E) b" P d
- MC_ProgramSpeedRampMotor1(3000 / 6, 1000);
) o2 Y% k0 v$ W! t - MC_StartMotor1();
: \' \0 O! a1 F% s% f5 X0 E - HAL_Delay(10000);
, x( A' A8 p m! e! x - MC_StopMotor1();+ w0 j* Y5 t5 u5 b# v) e8 l
- HAL_Delay(5000);
1 a, n5 ? l+ z o9 u4 u" f) m - 2 C- T6 @! }- H: |1 r
- MC_ProgramSpeedRampMotor1(-3000 / 6, 1000);
7 w8 H/ N" n+ X) I+ Q - MC_StartMotor1();
+ l. Z3 \) j, R" v0 I; A - HAL_Delay(10000);/ M; \* }2 s; ~& S: u S" `
- MC_StopMotor1();) z# Y: y. L$ J( w# X
- HAL_Delay(5000);
复制代码 这段代码可以保证电机正转10秒后停5秒,然后反转10秒后停5秒,如此反复,而且不会出现故障。
4 Q5 b' g/ o, `5 G' }9 P- i) M$ U l" T
不过试验中的要求是,速度反转3000后立即切换为正转3000,通过前面的介绍可以知道,在速度接近0的时候,会产生speed feedback的故障报警。) b/ D; X. a5 F# m
这也简单:$ S2 k! O! w) A) ? p/ p
- MC_StartMotor1();
& g' Y/ W. b h5 Y7 t3 K S* {( q - MC_ProgramSpeedRampMotor1(3000 / 6, 1000);
; @0 \$ N5 `- t9 W4 p6 H* j - HAL_Delay(10000);- Y6 M/ ~( a) {
- MC_ProgramSpeedRampMotor1(-3000 / 6, 1000);* Z7 ?( m5 n [& ]
- HAL_Delay(10000);
复制代码 运行的效果是:+ i$ n [8 ]1 X6 p; X! z
* \ c5 i5 ~. z
可见在运转过程中是会出现speed feedback错误的。 接下来是如何消除错误。 - MC_StartMotor1();9 N) O7 H; X" A% f
-
- a0 v" p. t% { f% ]) |* _9 ] - MC_ProgramSpeedRampMotor1(3000 / 6, 1000);
7 @. ]* u' w2 t2 J+ K+ l1 b; f# d - MC_AcknowledgeFaultMotor1();, m; V5 Q& ~- t+ J# V, X. h
- MC_ProgramSpeedRampMotor1(MC_GetLastRampFinalSpeedMotor1(), 1000);" `6 ]" {8 U. ~3 Y! f
- HAL_Delay(10000);
1 Z& J. E1 O0 P, m, j: q -
9 c7 {( b- U7 d/ P - MC_ProgramSpeedRampMotor1(-3000 / 6, 1000);
+ P4 p, j( P1 ? o, B - MC_AcknowledgeFaultMotor1();- B0 L( J0 v6 A/ F. |3 ^
- MC_ProgramSpeedRampMotor1(MC_GetLastRampFinalSpeedMotor1(), 1000);
7 p. ^4 u, ?8 p0 v - HAL_Delay(10000);
复制代码 这样就可以消除错误,电机也会正反转,不过没有最开始的代码处理的快,毕竟stop motor直接让motor回到了idle状态。测试过程中还发现,如果延时时间太短,例如把两个10000都改为5000,则电机也会一直朝着一个方向转动,估计是留给错误恢复的时间不够?或者是我对SDK的理解不够深入吧* g% S+ w0 R" q
|