本帖最后由 踏平幼稚园 于 2017-8-28 11:08 编辑 . W( o3 y: J7 ?; a8 s k* g
8 y7 e- f: i, n$ L8 _+ t
上一贴【电机套件 P-NUCLEO-IHM002】六、直播培训电机调速及转停中,调速API是MCI_ExecSpeedRamp,但是该接口有三个参数:2 H% A% ~: }, N4 B4 E2 g+ g
第一个是电机控制对象;
$ U2 [ H# y- z+ }7 w( @, I# ~; c% K 第二个是目标转速(对应0.1HZ),所以传入参数应为:目标转速 / 60(秒) * 10(倍);
+ ]1 ]6 E+ Q& |0 a) U- u! w/ ` 第三个参数是达到目标转速所需要的时间(即转速变化斜率)
) S' q" o# n- Z+ t Y6 S D+ }( c; v: y% Y5 _: h" S
为了更直观的观测参数3的作用,写了一段代码,再结合ST的PC端工具观测结果
5 Z) Z! A. e V. U3 z$ i5 y# T: U- int6_t speed = 500;
1 @5 m8 j+ e/ O& n+ k - uint16_t dur = 1000;
/ l# ?8 x+ ~5 N P9 _) J - MCI_ExecSpeedRamp(oMCI[M1], speed/6, dur);" O+ x) ]' q9 N3 n- h8 J
- MCI_StartMotor(oMCI[M1]); c$ N7 M! o7 T/ G
- ' u# y, @: y/ A% D9 m! T
- while(1) {
* r1 f! A7 d% V9 G - TB_SetUserTimebaseTime(SYS_TICK_FREQUENCY * 3); //设置延时时间3s
* g( c* U9 ?1 w+ z: O. e! A - while(!TB_UserTimebaseHasElapsed()) {} //等待延时结束
: L* {, Q4 f: I4 \ - speed += 1000;8 I/ _# p; E1 |: V
- if(speed > 5000)4 i4 P( j8 J3 s/ @3 A- P
- {6 J& G7 M/ A" G. K$ y9 y
- speed = 1000;5 Y7 i" I/ S* d+ w( {
- dur += 1000;% y% ?* Z& a) |7 ]3 K3 k; T
- if(dur > 2500)
* f6 J' ]' n, N) J1 n - {
- H4 D; O* ]0 }* O, w1 n - dur = 500;! i0 | [' _. ]/ t7 F0 y# Z) _
- }, J! I: K/ }4 \; |
- }3 `# ^$ [# S# L/ y# g6 @
- MCI_ExecSpeedRamp(oMCI[M1], speed/6, dur);
. \6 j1 X2 c" y2 m - }
复制代码
' n& U5 O; z+ h( o6 h( f- N a.打开速度监控! x# X3 S0 f5 d
6 n" L( d# P h* Z, j b.查看监控数据
- J# r( k+ g8 Y
* a" O& A' S- b* c
3 W# Z4 N! h. m t* F2 W1 l7 Y9 y
% y) h; b& t! |% i. f, u6 O, C 上图中红蓝绿框中分别对应不同延时时间(1000ms,2000ms,3000ms)下对应的速度变化斜率,可以发现延时时间越短斜率越陡,延时时间越长斜率越平缓。因此当我们需要应用场景中需要电机快速达到预定速度是可将延时时间减小甚至设置成0,而需要电机速度稳定平滑过渡的场景则需要根据当前转速和目标转速的差给出适当的延时时间参数。最后需要注意的是降速时如果速度差过大而延时时间又过短时会出现错误:
5 z# Z7 @) _, P9 ?7 n0 e" Q5 A
1 u d$ m* A7 S% X9 R7 E8 F4 J6 y. e; M9 K9 \8 E. ~/ o% ]5 a
" V, S# Z) N* D) j" {* g
|