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

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

[复制链接]
子曰好人 发布时间:2018-9-2 19:17
本帖最后由 子曰好人 于 2018-9-5 08:55 编辑
1 C8 G6 y1 O( Q" a' M9 Z6 D  F* m0 @( {! i. F
继续做实验,任务3和旋钮控制转速。
首先来看看任务3的要求:
任务3要求.png
这个可通过代码实现也可以通过上位机实现,已经有坛友做过这样的事情了。通过上位机做就是快速拨弄圆盘,这样系统不能在短时间内反转,造成观测器不能收敛,触发速度反馈错误报警,其实我个人觉得这里也是有过流报警存在的,这就看系统优先响应哪一个报警了。
我这里通过代码来实现task3。
任务3代码:
  1. void task_3(void); g+ U! e. G( n5 M
  2. {
    2 ]. r5 F6 E8 O0 v) R
  3.     MC_ProgramSpeedRampMotor1(-3000/6,1000); //设置-3000rpm的转速,在一秒之内达到
    ( `$ }6 ?% z* C) g* Q5 c
  4.     MC_StartMotor1();       //启动电机$ f" g& E; K& v& C
  5.     HAL_Delay(500);         //运行500ms
    5 Q- `+ w) W) l8 R
  6.     while(RUN != MC_GetSTMStateMotor1()); //等待电机处于运行状态,可有可无
    * J- S# w5 |. p, g- m/ R
  7.     MC_ProgramSpeedRampMotor1(3000/6,1000); //切换到3000rpm转速6 V: x! e, ?- p+ D6 w5 v
  8.     MC_StartMotor1();       //启动电机" y+ r& X% g7 C, B* M
  9.     while(MC_SPEED_FDBK != STM_GetFaultState(&STM[M1])); //等待错误触发
    . W! W) y5 }" ?0 u/ _. A) ~
  10.     HAL_Delay(1000);    //延时一秒,方便可以在上位机上看见错误是否发生
    0 \3 [7 c0 a/ u/ S
  11.     MC_AcknowledgeFaultMotor1();    //清除错误6 K6 s3 L, n1 b3 E
  12.     HAL_Delay(100);     //延时0.1秒
    2 g5 Q5 E1 o+ M" \2 E2 s* \4 w" \
  13.     MC_ProgramSpeedRampMotor1(MC_GetLastRampFinalSpeedMotor1(),1000);   //重新设置上一次速度值* R% ^8 a  y- I8 w8 b1 M3 J
  14.     MC_StartMotor1();   //启动电机6 _+ y# z/ ^) W5 w" A/ e
  15.     HAL_Delay(5000);    //运行5秒
    9 I: S5 n0 i& }- c( f: e9 Z5 e
  16.     MC_StopMotor1();    //停机3 d$ T$ F% a. ^& P/ J
  17.     HAL_GPIO_WritePin(LED11_GPIO_Port,LED11_Pin,GPIO_PIN_RESET); //拉低LED引脚,表示任务结束; V! e& ?6 v9 V6 n4 b. p
  18. }
    . L/ A8 r' V( n! Y
复制代码
主函数代码:
  1. /* Infinite loop */
    * b5 ?, i4 L1 s. d/ r/ U7 ^
  2.   /* USER CODE BEGIN WHILE */  n# r6 b0 v0 N5 d
  3.   while (1)8 J5 I. T+ U9 q- Z2 E
  4.   {) A( w# e- a- Z$ B% a
  5.       : |4 P, ]+ `% N; B6 M
  6.       if(GPIO_PIN_SET == HAL_GPIO_ReadPin(LED11_GPIO_Port,LED11_Pin))  t0 I! {' X5 ~
  7.       {$ E+ {/ g3 D' ]4 B% c
  8.           task_3();
    8 }( i0 c" S+ `  O
  9.       }! S$ _3 k0 q1 k" \; Q
  10.       else
    : k* d% G/ j9 r
  11.       {
    8 ?5 L8 z  j, e+ g' `8 c2 K6 r
  12.         MC_StopMotor1();4 |  i9 X5 E7 t% [! C
  13.       }      & W  Z/ F8 v; K& K% o
  14.   /* USER CODE END WHILE */
    " i5 B2 O: i4 o$ ~5 I
复制代码
实验现象:
任务三速度变化截图.png
  O* x! ?/ P( C, i
通过速度变化趋势可以看到任务成功实现了,我对比了PPT的预期结果图,有一些差距。当速度设置为3000rpm时,speed reference并没有跟随代码变为3000。另外,我做了延迟清除错误信息,所以在图中可以看到一截零速状态。

6 X# ]1 H: @& e2 c

! C. p' {% ^2 k* O好了,任务3完成。
---------------------------------------------------------
现在分享一个开放性实验,旋钮控制转速,我把这个任务定为任务4吧,用旋钮来控制电机转速我觉得才是真正的一个电机控制系统。
由于SDK中并没有考虑旋钮ADC的初始化,所以如果要使用旋钮电位器首先要通过cubemx对ADC进行初始化,在我的第二篇帖子中已经讲过关于套件的硬件资源,也知道了旋钮电位器连接的是PB1引脚。
用户1.png
创建全局变量:
  1. int32_t Speed_Adc = 0;- G# _, }, _3 s' X: U
  2. int32_t Speed_ref = 0;- u) a$ j1 y) r  g9 h$ h
  3. PWMC_Handle_t * MC_SPEED_REF;: h5 M* [1 i' w
复制代码
任务4代码:
  1. void task_4(void); I9 i$ d9 {% G2 ~; L: v
  2. {* p9 }. d! n" T1 y, u
  3.     Speed_Adc = R3_1_F30X_ExecRegularConv(MC_SPEED_REF,ADC_CHANNEL_12);3 i/ a( K) B, ~* j. }
  4.     Speed_ref = (15500*Speed_Adc)>>16;; n3 l- E7 L" w* P3 q+ ^5 q
  5.     if(Speed_ref > 0)
    % c* h8 D+ ?* w7 \
  6.     {
    + {- m9 G$ R* F3 F/ d
  7.         MC_ProgramSpeedRampMotor1((Speed_ref+1500)/6,1000);9 ?6 V1 I& N. |! [; L4 M
  8.         MC_StartMotor1();
    # i' h' t8 }# B- z
  9.     }- H  Z! R8 X. g
  10.     else$ m4 i: }5 }1 P
  11.     {; s! L5 y1 S$ I; T6 ^7 E
  12.         MC_StopMotor1();6 O  ]3 p% q, W2 c  V# \
  13.     }" [& `$ {4 S- N$ c
  14.     HAL_Delay(100);
    0 U4 \: m" Q9 p( e2 j3 m; t5 M7 \
  15. }
复制代码
主函数代码:0 s( g! Z" P: A: {& i4 u! Y
  1. /* Initialize interrupts */" u5 m. ]- q  f( \. B
  2.   MX_NVIC_Init();1 u1 ~( n# S" _+ B1 O
  3.   /* USER CODE BEGIN 2 */
    6 c! A' u: B. Z$ c
  4.   MC_SPEED_REF = &PWM_Handle_M1._Super;
    $ }$ ^& c0 R* R# b/ {2 f: C
  5.   /* USER CODE END 2 */. @* {6 j( _; {/ B5 n- b3 j$ O0 n

  6. 6 d1 h2 d4 @5 I
  7.   /* Infinite loop */
    1 l7 B* H$ N6 k0 Y9 v8 A
  8.   /* USER CODE BEGIN WHILE */
    / v( q. P7 V- T- M  m" x* J
  9.   while (1)
    1 C: O  k& n3 e( A
  10.   {
    5 O& b9 ^! ?, ]. c0 y3 l
  11. ' f4 q# f6 P  }; q8 |
  12.       if(GPIO_PIN_SET == HAL_GPIO_ReadPin(LED11_GPIO_Port,LED11_Pin))
    $ t4 G* P1 q7 l5 P
  13.       {( ], K/ ^0 x" V' ?
  14.           task_4();
    . S/ |0 R8 D; v+ P1 o' i
  15.       }$ i" S- V3 I9 Z9 @. E6 S7 t4 n
  16.       else/ `; P. F0 u, u
  17.       {( R: ~1 w+ \$ J3 V* K1 e
  18.           MC_ProgramSpeedRampMotor1(0,0);8 d4 D$ [# Y) A* e7 v9 b9 |
  19.           MC_StopMotor1();' `8 @) S- z8 T7 m
  20.       }
      T+ I5 w0 K) F7 @5 v! k; b
  21.   /* USER CODE END WHILE */
    - W) [' m- x/ _" c2 w( I! a
  22. , N' w. z' q' W& e. G
  23.   /* USER CODE BEGIN 3 */; m0 b' X. H/ p% N
  24. ; c8 S* O- J( C% x8 b: X+ X
  25.   }
    # R* M' Z" G- O# N% u) p+ F
  26.   /* USER CODE END 3 */
    8 E8 w( ?, E6 o/ f( v. M0 U
复制代码
在这里稍微解释一下代码:
Speed_Adc是存储ADC采样值的变量,Speed_ref变量通过ADC采样值转化为速度设定值,MC_SPEED_REF是一个指针变量,用于获取ADC初始化设置,R3_1_F30X_ExecRegularConv这个函数在r3_1_f30x_pwm_curr_fdbk,c这个文件中,用于处理规则ADC采样。速度换算这里可以没什么说的。速度设定的时候加1500偏移是有原因的,当设定速度过低的时候电机系统根本不能正常启动,这是我尝试设置的时候所能达到的最低启动速度。

9 B5 N% `! G9 e$ u( U. L
实验现象:
旋钮调速转速跟踪波形.png
从实验结果看来,这份代码默认速度PID能很好的跟踪给定转速。
我发现一个问题,代码里面在电机运行结束之后有些变量好像没有清零,这个问题留到后面在研究吧。
  Q0 w6 Y& k0 T3 o8 D6 \* O1 M
本帖两个任务分享就到这里,欢迎大家留言讨论。
3 D1 s$ S% Z3 {0 s
5 `1 W: m4 j% V6 y) J

0 G. }! G# h. m( e
& L* G# _4 l% }  V$ h2 ~" k1 B  Q
; }5 v$ M8 x* S$ \( ]( E% B: L! c2 w
1 收藏 2 评论118 发布时间:2018-9-2 19:17

举报

118个回答
子曰好人 回答时间:2020-4-15 09:28:07
ysx584085668 发表于 2020-4-14 23:23
+ r: O1 @6 [/ z; E8 t, C太感谢了,我发邮件给你看吧
0 ^2 }7 r! ~! @2 G/ }
看了你发的邮件,新版本的MCSDK生成的代码没有留ADC规则转换的函数接口,可能需要你自己去写了,我把我这边生成的文件发你一份参考吧1 k0 j- N1 I. g$ b
r3_1_f30x_pwm_curr_fdbk.zip (16.66 KB, 下载次数: 10)
passby328 回答时间:2018-11-6 11:04:29
子曰好人 发表于 2018-11-6 09:35
/ x8 a  }, z! {6 Z! [, H7 LSDK5.1.3生成的代码里面没有regular_conversion_manager.c这个文件,5.2.0新增了。获取ADC值的代码是几乎 ...

) K3 u( I8 j" V6 i! L+ d- w1.我之前参考您的函数,如果一直不断在执行转换,会影响电机库的控制时序导致无法开机,后来改为500ms一次,就没有问题。后来检查regular_conversion_manager.c中的内容,发现用户ADC的转换应该是电机库的状态机在调度的,如果连续不断转换或者没有走相应的接口估计会有问题。, X( M; P+ B8 W  @" q! w2 V( \, F
2.电机Workbench里面有设置OCP参数,看了原理图应该是通过体验板上面的L6230的内置比较器以及SMT32片内的ADC实现的,但是实际中的程序并没有提供类似的功能。后来查看了代码,OCP保护是通过L6230产生的FO信号进行处理的,不知道我说的是否有偏差,还请指教。
zhdzhd 回答时间:2018-9-2 22:27:32
代码规整,有功底,佩服!  p8 p, R! }% |9 u" q
大佬也会有纰漏啊0 e) N7 p, k2 c6 h. p9 O
$ N& c. S9 o$ }2 Q4 M- B/ F; h
/* Infinite loop */
  w  ~# ^# o% l  I+ o; V& H. {  /* USER CODE BEGIN WHILE *// I5 t- a' L5 D
  while (1)+ K0 T8 R+ K+ ?* }- `
  {! n1 z7 h& N/ \) w  u* H
      
$ |/ p0 e0 i. g8 L0 A      if(GPIO_PIN_SET == HAL_GPIO_ReadPin(LED11_GPIO_Port,LED11_Pin))/ O$ h/ W2 N5 q$ B  j0 ?
      {0 V. V7 x0 W  B; t
          task_5(); ------>task_3();
* t3 Q( E/ [% U      }, ~3 E- w6 `; V
      else1 }- f  Q" R7 f; K: [* k! m2 o
      {6 W" m0 E; {2 Z" t* j
        MC_StopMotor1();
! m! X- a( |; a) j8 b6 Z      }      
4 l5 G" n" }2 j/ }2 x  /* USER CODE END WHILE */
子曰好人 回答时间:2018-9-2 22:36:27
zhdzhd-174422 发表于 2018-9-2 22:27  u! o0 W8 Y/ c; M) g! ^
代码规整,有功底,佩服!0 z1 E2 o' p! |+ O* t
大佬也会有纰漏啊

) Z+ S1 V. o+ H- ?* `不好意思,感谢指正
STM1024 回答时间:2018-9-3 10:24:43
哈哈,和你观点一样,很多故障报警,都是报的speed feedback,我在测试的时候,连堵转都试过,原本以为是电流过大报警,但没想到居然还是speed feedback故障
子曰好人 回答时间:2018-9-3 10:45:56
stm1024 发表于 2018-9-3 10:24
* X+ F5 J9 N8 z' M5 V7 l" P% e哈哈,和你观点一样,很多故障报警,都是报的speed feedback,我在测试的时候,连堵转都试过,原本以为是电 ...
5 ~7 x1 s9 \( u; J7 |
去研究一下电机库生成的故障触发机制代码,也许就能明白了,搞清楚是怎么回事之后就能自定义故障报警了
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()?9 V, ?6 B& U$ |, m) N
子曰好人 回答时间:2018-9-4 22:54:20
LT-386596 发表于 2018-9-4 18:38
) g1 J3 \5 c. }3 g9 nSpeed_Adc = R3_1_F30X_ExecRegularConv(MC_SPEED_REF,ADC_CHANNEL_12); 5.2.0 找不到  R3_1_F30X_ExecRegu ...

, ?. u; b% }" _+ F# T  z9 z在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
& O* i3 c# Q( _4 L  u) wVR连接的脚感觉像是PB1,从电路图上来看.

6 p$ S, ]. t  }2 I# h手误写错了,已更正
花落莫相离 回答时间: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
+ N6 \0 w" S% [' M1 q楼主,我不太懂Speed_ref = (15500*Speed_Adc)>>16;这段程序中15500的作用时什么?

/ x, g% m2 I1 \. j. K6 M15500是电机能达到的最大转速,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- O4 i: X* r' F0 {* r0 y3 c: \
大神,不知道你有没有注意到有一个小细节,这个USB必须要插在主控板上整个程序好像才能运行,然后不插USB的 ...
  Z3 b, k4 j" m" m0 r; Y
没遇到过,我的一直是正常的呀,没有USB连接也能正常运行
晴空 回答时间:2018-10-29 15:53:32
学习了  哈哈
花落莫相离 回答时间:2018-10-31 13:51:43
子曰好人 发表于 2018-10-26 09:165 {& h" Z6 |* `" k# d
15500是电机能达到的最大转速,Speed_Adc的最大值是4096,ADC采样值和速度参考值的换算方式为:(Spped_re ...

6 p, y4 l- @$ A- ~多谢楼主解释了。

所属标签

相似分享

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