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

No.5 电机套件实验任务3&旋钮控制转速  

[复制链接]
子曰好人 发布时间:2018-9-2 19:17
本帖最后由 子曰好人 于 2018-9-5 08:55 编辑
3 p6 a! W& P% d* Q. E! ~: S5 q5 s* ^5 h
继续做实验,任务3和旋钮控制转速。
首先来看看任务3的要求:
任务3要求.png
这个可通过代码实现也可以通过上位机实现,已经有坛友做过这样的事情了。通过上位机做就是快速拨弄圆盘,这样系统不能在短时间内反转,造成观测器不能收敛,触发速度反馈错误报警,其实我个人觉得这里也是有过流报警存在的,这就看系统优先响应哪一个报警了。
我这里通过代码来实现task3。
任务3代码:
  1. void task_3(void)
    1 t7 q/ W4 G# a; b
  2. {. p& F5 F; ]5 \/ |3 V! X
  3.     MC_ProgramSpeedRampMotor1(-3000/6,1000); //设置-3000rpm的转速,在一秒之内达到2 T9 y2 I/ w; ^) i2 s: n: Y
  4.     MC_StartMotor1();       //启动电机
    . ]3 Q6 E$ w2 Z: C0 n+ c' u
  5.     HAL_Delay(500);         //运行500ms2 S5 P7 j( }9 g' S9 [8 h
  6.     while(RUN != MC_GetSTMStateMotor1()); //等待电机处于运行状态,可有可无
    , I2 x. }/ t" M( E, e0 \6 i
  7.     MC_ProgramSpeedRampMotor1(3000/6,1000); //切换到3000rpm转速
      S9 ]+ H3 |. L9 J
  8.     MC_StartMotor1();       //启动电机) ^( Q' z: J( q9 q" s$ I
  9.     while(MC_SPEED_FDBK != STM_GetFaultState(&STM[M1])); //等待错误触发
    ; f8 T' F; Y1 o' y6 s; s
  10.     HAL_Delay(1000);    //延时一秒,方便可以在上位机上看见错误是否发生1 x1 a% n& R1 D) Q+ x5 i
  11.     MC_AcknowledgeFaultMotor1();    //清除错误
    3 z4 B: q- k# T$ ~* B- ^3 H# T9 f
  12.     HAL_Delay(100);     //延时0.1秒
    4 T% f, Q0 [3 S# }$ s
  13.     MC_ProgramSpeedRampMotor1(MC_GetLastRampFinalSpeedMotor1(),1000);   //重新设置上一次速度值
    ! H3 p* w( J; @4 c, U* ]" F
  14.     MC_StartMotor1();   //启动电机
    2 `. e" e; u( y8 `: |  e9 G
  15.     HAL_Delay(5000);    //运行5秒3 ^( F$ G& ?% U1 @
  16.     MC_StopMotor1();    //停机) A2 x6 E# f8 [5 L/ u: e; |7 R% A; w
  17.     HAL_GPIO_WritePin(LED11_GPIO_Port,LED11_Pin,GPIO_PIN_RESET); //拉低LED引脚,表示任务结束$ t% F/ l  I3 z4 l( W
  18. }
    2 {! m) G. \* n) ?$ b
复制代码
主函数代码:
  1. /* Infinite loop */
    5 Z9 D3 P# e6 `5 K4 Q% j" }
  2.   /* USER CODE BEGIN WHILE */( v% s5 Y" ?& ]
  3.   while (1)  K. ^! O/ V1 e1 B) e
  4.   {
    $ Z' b& i& Q* r+ R
  5.       
    ! N" ?; j% G1 h$ S  `( E
  6.       if(GPIO_PIN_SET == HAL_GPIO_ReadPin(LED11_GPIO_Port,LED11_Pin))
    : ~8 J5 m0 f2 l, A- G8 L
  7.       {+ F$ I* _3 Y" v8 ^# K
  8.           task_3();
    & `! Q. ?; v3 e; x
  9.       }
    / @- P3 _( y) N) K9 w) A$ t
  10.       else
    0 \3 a8 V0 O7 P3 S1 J% F
  11.       {; h1 Y! l9 a6 ~* |
  12.         MC_StopMotor1();* F7 o6 v4 \, @4 ^! {7 z
  13.       }      
    * M  y% O2 `! D: E
  14.   /* USER CODE END WHILE */
    & W$ D" S! \( Y' w3 b% Q" j( x% r( F
复制代码
实验现象:
任务三速度变化截图.png
& M- _- G0 w' |+ H: c; y% \
通过速度变化趋势可以看到任务成功实现了,我对比了PPT的预期结果图,有一些差距。当速度设置为3000rpm时,speed reference并没有跟随代码变为3000。另外,我做了延迟清除错误信息,所以在图中可以看到一截零速状态。
) ^% N* D3 H8 M8 `. C6 W
; Y; K7 T( R! r( L
好了,任务3完成。
---------------------------------------------------------
现在分享一个开放性实验,旋钮控制转速,我把这个任务定为任务4吧,用旋钮来控制电机转速我觉得才是真正的一个电机控制系统。
由于SDK中并没有考虑旋钮ADC的初始化,所以如果要使用旋钮电位器首先要通过cubemx对ADC进行初始化,在我的第二篇帖子中已经讲过关于套件的硬件资源,也知道了旋钮电位器连接的是PB1引脚。
用户1.png
创建全局变量:
  1. int32_t Speed_Adc = 0;
    ' T& R" _. R  a
  2. int32_t Speed_ref = 0;+ `  t  p# i5 }4 J( {: h5 f
  3. PWMC_Handle_t * MC_SPEED_REF;
    * l. H! t( K7 P
复制代码
任务4代码:
  1. void task_4(void)+ N) j; W: b' N' R
  2. {6 [1 }* g: \1 n8 p! Z3 l
  3.     Speed_Adc = R3_1_F30X_ExecRegularConv(MC_SPEED_REF,ADC_CHANNEL_12);
    ; r- R6 ^' u3 n/ z
  4.     Speed_ref = (15500*Speed_Adc)>>16;/ g4 ], n7 i; }. {: I
  5.     if(Speed_ref > 0)9 P3 B7 T6 \& o, O9 r& ]
  6.     {5 \) F6 H6 f4 E5 x- X- O1 @) C
  7.         MC_ProgramSpeedRampMotor1((Speed_ref+1500)/6,1000);
    3 ?# r1 z% W4 P
  8.         MC_StartMotor1();
    2 ]( G2 G* n, k' e- ~; j/ ~
  9.     }
    ( q8 i5 _! w8 D/ j: j) s4 B
  10.     else
    + D, A, Z: u7 M. H5 u
  11.     {2 r: ]' \2 G* X
  12.         MC_StopMotor1();/ H5 v" g7 G* S: m8 z' G; P/ v
  13.     }
    ! b; q; m+ G0 W3 b; q0 @
  14.     HAL_Delay(100);
    . u$ v( F) W, Y% s9 \  O! P
  15. }
复制代码
主函数代码:1 V+ I. b! c- F8 [1 B: V& H* [# z
  1. /* Initialize interrupts *// x+ ~, a3 {3 Z! z9 A+ J$ I3 n4 ]
  2.   MX_NVIC_Init();
    % Q) L' Z4 [: {# e
  3.   /* USER CODE BEGIN 2 */
    / n5 D, L: w1 }# g4 |% b3 x
  4.   MC_SPEED_REF = &PWM_Handle_M1._Super;( H3 ]1 F: o- x, Y8 h4 u1 Y7 s
  5.   /* USER CODE END 2 */0 x; {9 F, A8 i2 s( t

  6. 7 d: S/ `# S. |3 d0 e
  7.   /* Infinite loop */
    . M7 h, B/ H0 a  g! R, k7 G6 G
  8.   /* USER CODE BEGIN WHILE */4 Q9 q, ^, L6 c) A" R
  9.   while (1)
    & R- A- |' r- E# C% `; [8 ?
  10.   {
    ) j7 ~1 ~8 {9 B1 R# ^
  11. . u, j( G( Y4 l
  12.       if(GPIO_PIN_SET == HAL_GPIO_ReadPin(LED11_GPIO_Port,LED11_Pin))+ G: T0 J) ~' p5 d; d
  13.       {$ d; M# E- e) ?3 e# b5 `8 ^
  14.           task_4();
    2 `. L: O) B0 h# _
  15.       }) d, x( d  c9 }' o
  16.       else
    & y) @$ e; [2 d% p- t
  17.       {6 v! `9 [- b: A8 s
  18.           MC_ProgramSpeedRampMotor1(0,0);
    6 y8 Q4 g: G1 P9 ~' }" ~9 r4 V
  19.           MC_StopMotor1();+ q* M; W7 Y6 i- Q0 F$ T
  20.       }3 l- R4 F- m* Y2 K
  21.   /* USER CODE END WHILE */
      j8 n9 D2 q# }' l6 N/ y

  22. - q4 z7 t! a1 P; N! y
  23.   /* USER CODE BEGIN 3 */
    ( I+ F1 K' `( m' N
  24. $ \$ w+ m% e6 d+ r, B* e
  25.   }8 H* _; @" M# R% b9 w6 G* q+ w  U
  26.   /* USER CODE END 3 */; z, j, M: }8 L; A2 \: K, V4 [
复制代码
在这里稍微解释一下代码:
Speed_Adc是存储ADC采样值的变量,Speed_ref变量通过ADC采样值转化为速度设定值,MC_SPEED_REF是一个指针变量,用于获取ADC初始化设置,R3_1_F30X_ExecRegularConv这个函数在r3_1_f30x_pwm_curr_fdbk,c这个文件中,用于处理规则ADC采样。速度换算这里可以没什么说的。速度设定的时候加1500偏移是有原因的,当设定速度过低的时候电机系统根本不能正常启动,这是我尝试设置的时候所能达到的最低启动速度。
6 V$ ^: ]# b# N% T
实验现象:
旋钮调速转速跟踪波形.png
从实验结果看来,这份代码默认速度PID能很好的跟踪给定转速。
我发现一个问题,代码里面在电机运行结束之后有些变量好像没有清零,这个问题留到后面在研究吧。

( p) M8 G' L, N& P* T7 ]2 M$ n
本帖两个任务分享就到这里,欢迎大家留言讨论。- y  ]7 L# i' \; n/ E- w9 T0 |

( B0 j5 L) a; n% ~0 J/ [/ P+ x+ U
( c9 Y' B0 I& `
/ u3 l$ a3 W5 I. h; p. j5 }3 w. C& p, X% C" O
1 收藏 2 评论118 发布时间:2018-9-2 19:17

举报

118个回答
子曰好人 回答时间:2020-4-15 09:28:07
ysx584085668 发表于 2020-4-14 23:237 _2 Y/ W% O5 Y* W
太感谢了,我发邮件给你看吧

( R/ I) g- N  |看了你发的邮件,新版本的MCSDK生成的代码没有留ADC规则转换的函数接口,可能需要你自己去写了,我把我这边生成的文件发你一份参考吧
- f: w8 \: g$ E4 \/ P7 q r3_1_f30x_pwm_curr_fdbk.zip (16.66 KB, 下载次数: 10)
passby328 回答时间:2018-11-6 11:04:29
子曰好人 发表于 2018-11-6 09:350 T. r8 m9 S. ~4 b: @7 ]& N8 D
SDK5.1.3生成的代码里面没有regular_conversion_manager.c这个文件,5.2.0新增了。获取ADC值的代码是几乎 ...
$ S5 a# F: c2 l! J
1.我之前参考您的函数,如果一直不断在执行转换,会影响电机库的控制时序导致无法开机,后来改为500ms一次,就没有问题。后来检查regular_conversion_manager.c中的内容,发现用户ADC的转换应该是电机库的状态机在调度的,如果连续不断转换或者没有走相应的接口估计会有问题。
' |( m9 P  F" b, Z5 _! n& B/ d2.电机Workbench里面有设置OCP参数,看了原理图应该是通过体验板上面的L6230的内置比较器以及SMT32片内的ADC实现的,但是实际中的程序并没有提供类似的功能。后来查看了代码,OCP保护是通过L6230产生的FO信号进行处理的,不知道我说的是否有偏差,还请指教。
zhdzhd 回答时间:2018-9-2 22:27:32
代码规整,有功底,佩服!
6 ]0 S- h8 C! L" v, N6 T$ l大佬也会有纰漏啊
  }2 W- u" s/ ]5 K* ~
9 O! O1 b5 v* }" P4 i, V+ o/* Infinite loop */
2 z! a5 G+ m; M" d; r, H$ x  /* USER CODE BEGIN WHILE */6 l/ U; ^  O% L% J
  while (1)
" w: W- J. i" F4 |8 [. q5 R  {! e( l+ R5 w8 d3 R: j
      
9 V. c5 c9 p' ], ~( F7 X" g, h; U      if(GPIO_PIN_SET == HAL_GPIO_ReadPin(LED11_GPIO_Port,LED11_Pin))
8 A. u, N1 ^$ ^% y! i" i9 Z" Z- o, M      {6 h! B( s. C! p6 l, X# [
          task_5(); ------>task_3();
# X+ c% X! R% B) u, y      }, H7 }0 w; b0 d# A! W
      else* d7 l5 a! Z9 t
      {
! O. Z# n1 s. ^  o        MC_StopMotor1();
/ ?' x) l) i5 z; Z% e      }      8 B' _! t! K& g9 t- ?* u; }
  /* USER CODE END WHILE */
子曰好人 回答时间:2018-9-2 22:36:27
zhdzhd-174422 发表于 2018-9-2 22:27
4 B, r& }2 W- D5 D; R( Q$ U代码规整,有功底,佩服!
9 X/ t: m0 R: x* w- h4 }! h大佬也会有纰漏啊
$ u% y9 P, i+ n/ I( D7 n$ l( ]' M7 K
不好意思,感谢指正
STM1024 回答时间:2018-9-3 10:24:43
哈哈,和你观点一样,很多故障报警,都是报的speed feedback,我在测试的时候,连堵转都试过,原本以为是电流过大报警,但没想到居然还是speed feedback故障
子曰好人 回答时间:2018-9-3 10:45:56
stm1024 发表于 2018-9-3 10:249 T' i2 o5 z  d5 d- m
哈哈,和你观点一样,很多故障报警,都是报的speed feedback,我在测试的时候,连堵转都试过,原本以为是电 ...
8 d$ a) d5 `/ ^1 o  p3 J
去研究一下电机库生成的故障触发机制代码,也许就能明白了,搞清楚是怎么回事之后就能自定义故障报警了
LT-386596 回答时间:2018-9-4 18:38:17
Speed_Adc = R3_1_F30X_ExecRegularConv(MC_SPEED_REF,ADC_CHANNEL_12); 5.2.0 找不到  R3_1_F30X_ExecRegularConv()?+ e8 r4 [2 z: Q9 q
子曰好人 回答时间:2018-9-4 22:54:20
LT-386596 发表于 2018-9-4 18:38
( k4 w+ }6 n6 G8 U2 rSpeed_Adc = R3_1_F30X_ExecRegularConv(MC_SPEED_REF,ADC_CHANNEL_12); 5.2.0 找不到  R3_1_F30X_ExecRegu ...

; s- L" b  p$ t. O在r3_1_f30x_pwm_curr_fdbk.c这个文件里面,要调用这个函数需要包含头文件r3_1_f30x_pwm_curr_fdbk.h
zhdzhd 回答时间:2018-9-4 23:27:57
VR连接的脚感觉像是PB1,从电路图上来看.
子曰好人 回答时间:2018-9-5 08:56:32
zhdzhd-174422 发表于 2018-9-4 23:27
" D' Z0 T  O" c) i# O; [1 LVR连接的脚感觉像是PB1,从电路图上来看.

& w* q6 O$ [) Z3 Y$ I9 O9 P" F手误写错了,已更正
花落莫相离 回答时间:2018-10-25 19:58:06
楼主,我不太懂Speed_ref = (15500*Speed_Adc)>>16;这段程序中15500的作用时什么?
花落莫相离 回答时间:2018-10-25 20:59:33
大神,不知道你有没有注意到有一个小细节,这个USB必须要插在主控板上整个程序好像才能运行,然后不插USB的时候只按开关启动电机,电机启动不起来,不知道大神出现过这情况吗?
子曰好人 回答时间:2018-10-26 09:16:20
花落莫相离 发表于 2018-10-25 19:58- `1 p0 C: p, i6 I
楼主,我不太懂Speed_ref = (15500*Speed_Adc)>>16;这段程序中15500的作用时什么?
# ~* z2 c5 z5 v. f0 r* Q7 w
15500是电机能达到的最大转速,Speed_Adc的最大值是4096,ADC采样值和速度参考值的换算方式为:(Spped_ref-0)/(Speed_Adc-0)=15500/4096=15500>>16;
子曰好人 回答时间:2018-10-26 20:20:40
花落莫相离 发表于 2018-10-25 20:59
  K2 V9 R2 ~* E4 }. a大神,不知道你有没有注意到有一个小细节,这个USB必须要插在主控板上整个程序好像才能运行,然后不插USB的 ...
" G4 L8 r% ~* J" Y5 |/ Q
没遇到过,我的一直是正常的呀,没有USB连接也能正常运行
晴空 回答时间:2018-10-29 15:53:32
学习了  哈哈
花落莫相离 回答时间:2018-10-31 13:51:43
子曰好人 发表于 2018-10-26 09:16
! O) H- h/ R. U, l! O( @* [15500是电机能达到的最大转速,Speed_Adc的最大值是4096,ADC采样值和速度参考值的换算方式为:(Spped_re ...

8 a" m/ N! b8 S多谢楼主解释了。

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版