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

【STM32电机培训】——3、任务1电机设定速度、定时启动停止

[复制链接]
七哥 发布时间:2018-9-9 20:54
本帖最后由 toofree 于 2018-9-14 08:47 编辑
( y5 u# S. j& Z" O: D) K! j3 m& a  V0 i
【STM32电机培训】——3、任务1电机设定速度、定时启动停止9 I" s* k. r8 j+ F. C% }: y9 t4 j6 k
9 r* w* H  z$ B& Y
目标任务:设定速度3000转,启动工作10秒,停止工作5秒;再启动,再停止,速度保持不变,如此往复。
2 C$ _4 V8 K; n; o0 ^( k& K1 _4 P
: {  t2 p9 U/ Y, j8 L. P
00.jpg
# D0 _1 E& V* B$ ^- X4 D
& |' {! \7 H3 J+ ~9 _
  a( }8 `2 b5 _: i+ U
在电机参数测试时,得到过电机的参数。
3 n& L% {9 k3 j- [3 j# e【STM32电机培训】——1、实验电机参数测量及极数对解疑3 G. J' U, U' C+ E' Y# s$ L7 S  r
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=617371&fromuid=307297
# z! K0 [  ^  ^(出处: 意法半导体STM32/STM8技术社区)
; @  @8 t" S% ^4 w9 ?% | 01.jpg
5 [0 I2 v, o4 [0 X
' t4 `0 V9 l7 X6 f) Y& i
本贴实验工程基于前一贴工程进行修改。前一贴链接:【STM32电机培训】——2、生成电机样例程序stmcx、ioc、IAR工程& `5 l" O" b6 R* ?  }3 [
https://www.stmcu.org.cn/module/foru ... 7427&fromuid=3072979 k! a4 g; L7 R; A& s( U& {
(出处: 意法半导体STM32/STM8技术社区)2 |; U% v" l3 M
/ R' [4 l. A" x+ M/ E3 M( L
将电机工程设置中的参数按照,之前测得的参数设置。
* C4 O1 s: V% P" r, N3 o6 B 02.jpg / y" W, G4 L2 d7 y3 [7 `
& A+ i6 E2 \1 {# L7 E' [

+ M7 s* X+ |# U: z由于最大电流有变化,因此电机驱动管理中的启动参数也得对应做出改变,否则不能生成新的工程。2 E4 \2 j0 P' A. t- {
03.jpg * z& ^1 x/ V& L

% ?. B4 `  ]2 _& Z; k, Y

2 q9 k6 I6 o1 G6 d5 w本实验,打算顺带闪个灯,从原理图看出,X-NUCLEO-IHM07M1板上的LED灯D11,使用的是PB2,高电平有效点亮。
0 d' b# G# M7 z 05.jpg 6 V; @( F  C, C: y4 |" L! `
2 h( Z) ^- g$ m

' U1 J' X: S- U; F- i* T" q$ `对照NUCLEO-F302R8板原理图,确认是PB2无误。同时在NUCLEO-F302R8板上本身也有一路LED,用的是PB13,高电平有效点亮。
6 i/ [& q' s' l 04.jpg ! S5 l. G3 A6 P4 ^
) g: E- E$ _, x2 D" [8 Q

, \& [; C- e3 L& Y: d3 R打开电机工程下的,stm32cubemx工程文件“SDK50x-P-NUCLEO-IHM001-BullRunning.ioc”) I4 X8 y1 K9 x+ V/ Y8 s
06.jpg   V/ i1 M0 o1 W+ Q+ x2 r/ h
7 B' }& P. d. a! w  c: E' W" X/ ~

+ m) ?( X2 z0 b( j. K在IO管脚图中设置,PB2为输出,同时更改别名为“LED_Motor”,程序中使用更直观。
7 M4 d9 |: g! ~; l 07.jpg / Q: {& t8 E5 z7 h  w

. A% f2 J/ J- g& `1 P) m" h
6 [1 B; M1 P# W/ T5 t' |
检查IO配置,确认LED_motor管脚模式设置正确无误。, X2 I0 p4 k! g+ K9 N; R8 ~+ E
08.jpg ! W% V, H+ v/ m7 g1 S3 R. [

7 I  S4 L! X9 g6 F$ K1 i+ Y
2 z% h3 x; R' t( B* n
重新生成IAR应用工程。成功生成后,打开工程。) I6 w7 o, n3 ]  y9 O
09.jpg 5 Z2 R) T# S. p' H" S+ H9 ]1 [- ~

; }' P9 L* n: C) ]. ]5 r
9 S6 f! K: l8 _6 y8 o, H, Z
在生成的工程中,main.h中可以找到,LED_motor的相关管脚宏定义。6 G( I) ]3 k' V
10.jpg 1 Z7 a. I" O/ e/ n$ |% K

- }6 V4 S" v0 d- A; a: H

( a1 z$ t+ ^1 h程序中使用GPIO状态翻转,来闪灯。# z: q! {( \7 Z: @/ G$ l
11.jpg + {$ Y) s" K( K* J7 n4 k  r

; m7 @) \; G# |& p, \) y
5 K3 x# K& ^: M+ z. N
找到设置电机速度参数的函数MC_ProgramSpeedRampMotor1()在mc_api.c中6 e* v5 _( o% Z; D8 D* e0 J
12.jpg
1 g! p( y5 }5 w1 ]- i; }6 N
# m) b0 x3 u5 c+ {) C
& b5 E% m. |5 w7 G% r6 l2 \' J
在主函数main.c中包含进“mc_api.h”头文件,一定要放在“/* USER CODE BEGIN Includes */”与“/* USER CODE END Includes */”,否则重新生成工程文件时,将会被冲掉。9 v1 v: s5 v* X8 r! o. X. `; h
13.jpg 0 ]5 T% w# E! q! h( @

4 P, W2 Z/ U8 T* z1 ]
  z' t# h1 v( ?
定义循环变量“i”。同上,用户添加内容,一定要放在“/* USER CODE BEGIN N */”与/* USER CODE BEGIN N */,之后同理。# h% x8 e# A# x1 W$ u0 \- b
14.jpg # `% m+ O  W- K& U- P$ H6 R
" Z0 g4 o# |# J' [

/ D3 c8 K; G# \2 @( q2 i& z& P添加电机转速参数设置函数“MC_ProgramSpeedRampMotor1(3000/6,1000);”。
/ A+ h$ f$ l  o$ k引入switch语句,来进行电机启动、停止控制。这样分时工作,可以使用LED正常闪灯。
7 T/ O* x: A1 Z3 V 15.jpg
( l/ m$ P* k1 g( F; Z8 U) m5 t7 I9 }, |  l- ]) R

% i/ Y+ p7 ~" c3 J编译IAR工程,并下载最新代码(Ctrl+D),全速跑程序(F5)。1 p  z; i& p  y. q5 ~- _, t3 N4 Y+ \

/ L7 W; h) w7 C
4 j. C1 |4 v8 B$ z$ {
打开“Motor Profiler 5.0.3”软件,通过串口连接电机开发套件,打开“监控”窗口。
% Q# h1 x' o! o* |! @4 s6 b. d2 f$ q 20.jpg # y+ V! v: |" Q' D9 U) U
0 S$ o( Z3 w2 g3 Q9 a2 s% A/ {

# N5 ?/ z. w: P( E% a在“监控”窗口下,在打开“Plotter”绘图窗口。可以看到,电机启动一段时间,停止一段时间。但是时间宽度好像有点问题,D11闪烁频率为1Hz。经查看,启动5秒,停止2.5秒。原因是SysTick的的基础时钟为500us。1 o4 l8 s0 W3 q) j/ b. d9 o
16.jpg ! I7 @. V$ `4 p8 [. Q  V) X9 C
$ Y2 C: W' N" k6 M) S3 [
9 H0 v' u6 T- L9 K, _5 t- b3 [! x
修改代码,改为每隔2000个单位,一个节拍。修改后D11闪烁为0.5Hz,符合预期。
! f# E" n- h! ?$ m  D 17.jpg / }3 z! r6 y) n) K4 Q3 T

3 ?$ |- T7 u" j( S+ ?

1 k0 v" P: q& x5 K9 k5 O5 T重新运行程序,查看“Plotter”绘图窗口波形,这次时间正确无误。8 b% e8 E9 x/ G4 g# I. {
18.jpg " a" C, z1 k; [( e' C6 _

# h! m6 J5 g& |; B' N& g5 ~
" h# j! M3 ~8 U
main.c中修改过的代码,贴入:
1 D  j- L2 C' G" z0 I2 o+ C
  1. #include "main.h"% V0 F9 T" A3 U
  2. #include "stm32f3xx_hal.h"
    7 g) J0 S+ P  j3 ?$ {$ z: ^8 u, P  D
  3. #include "motorcontrol.h"
    & h! k: m1 ^- T% J

  4. . n6 W4 \& ~% M' K" g
  5. /* USER CODE BEGIN Includes */9 P2 f, q$ `. N: C3 a3 I* L1 K

  6. % ]  ~$ i' p3 n" |( Y
  7. #include "mc_api.h"
    ( M9 H6 Q3 ^; x0 z: A$ N0 C
  8. ) @( T' J3 Q8 r+ ^# ]& p; M  E( Z6 p
  9. /* USER CODE END Includes */1 {; ]  B3 t- e5 y

  10. 7 r) H% A, I2 v2 Z, ?! Y+ S
  11. /* Private variables ---------------------------------------------------------*/+ I- L8 r& D4 d0 L# @
  12. ADC_HandleTypeDef hadc1;' `2 ^5 m4 r# O
  13. " X8 k/ R+ h+ A( {: ]: D. a
  14. DAC_HandleTypeDef hdac;
    7 l3 @8 s% y4 m+ B6 h; i9 {

  15. % o1 j6 v" X4 J$ L9 a% e
  16. TIM_HandleTypeDef htim1;& ^7 ], E/ t4 P$ y6 @, m

  17. . u5 v/ P  o: T6 N2 f0 m
  18. UART_HandleTypeDef huart2;8 U& a# K9 L, {6 p+ `+ X. z
  19. * \6 G# G9 {7 {0 j
  20. /* USER CODE BEGIN PV */
    " R/ o; M* }, \! o! @; U5 n
  21. /* Private variables ---------------------------------------------------------*/
    4 l) F; v: Y6 W8 q

  22. 5 }1 G8 K: @4 \
  23. /* USER CODE END PV */3 w+ o0 x: B! O" b) N- ]( Q1 ^

  24. ' M: G, [$ f0 o3 y" d! k/ P
  25. /* Private function prototypes -----------------------------------------------*/( e% p4 E) H5 L/ I* U) P7 }3 c
  26. void SystemClock_Config(void);2 K. p* m5 o) @& M6 K- V7 N' {
  27. static void MX_GPIO_Init(void);
    8 C3 I% r8 ~- D! B: c
  28. static void MX_ADC1_Init(void);+ o# c8 a- v# c4 h5 K
  29. static void MX_DAC_Init(void);
    / V. v/ r9 h# e
  30. static void MX_TIM1_Init(void);1 ]. z0 c5 J2 F: h
  31. static void MX_USART2_UART_Init(void);
    # C3 U, z9 b1 ^( ]1 i- I, ?' ]- B. n: e* }
  32. static void MX_NVIC_Init(void);5 \# I# Q0 ]; b4 g; m+ ]% s# I) _

  33.   }% M' }2 H0 W" ~; W9 I4 d, w( \
  34. void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);* T. E$ O8 q) P
  35.                                 ' I: C+ Y% Z# ^: x1 \4 x6 u
  36. ' ]- z9 J6 u' S" i3 s& Y! r* t3 T, `
  37. /* USER CODE BEGIN PFP */
    ! W8 `% `) s* ^0 U
  38. /* Private function prototypes -----------------------------------------------*/, [) X/ @: G2 ^6 s6 L4 D
  39. 6 O: l( T' R$ N0 h( t7 Q
  40. /* USER CODE END PFP */
      Q( t# G' R% Q& v1 H. Z
  41.   L7 d0 V: W7 h! d5 L& K
  42. /* USER CODE BEGIN 0 */3 C8 A4 U, s0 d3 B

  43. 4 H1 c! ?8 s( s8 K6 \" y
  44. /* USER CODE END 0 */
    5 X$ d2 g1 k& q& G# t# T7 s
  45. * X) @$ K' k. F5 V6 t+ B
  46. /**- }/ Q8 Y$ M3 ^/ a2 {
  47.   * @brief  The application entry point.! [4 l- U* i* q. [
  48.   *" P3 }, @/ d) E4 [5 U; O
  49.   * @retval None7 X; J8 }- w- \8 G5 F+ u1 T( @. O$ J
  50.   */
    1 e, n1 ^8 L4 L+ B
  51. int main(void)
    8 x5 @9 {- N" L3 U9 g2 x' I
  52. {
    7 z; V! ~4 ~3 C8 S0 j
  53.   /* USER CODE BEGIN 1 */
      ~: {# h# O% ]2 Y4 X% P
  54.   int i=0;& v) x( i: ~! @% ?: n" T; V
  55.   //int dir_flag = 0;         // 1正转,-1反转,0停止
    3 [' m9 p8 @; ~, J1 G
  56.   //int run_cnt=0
    # Z) b( k$ P; j6 D3 k

  57. , Y- g0 {+ [. n. Z  t! d" B' `2 m
  58.   /* USER CODE END 1 */. z4 l5 j  y" k7 U" a3 {

  59. 6 D) `& T6 w- S# s  y  [  H
  60.   /* MCU Configuration----------------------------------------------------------*/$ k- O& d0 `. ~& \" L( r% B

  61. % U+ w' ~- G0 _; s0 `2 I
  62.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */1 I$ I6 z8 o2 a6 ~! a, ^
  63.   HAL_Init();
    9 j; `) k2 E( A* P
  64. , k  Y* u! ^$ s7 ?8 `
  65.   /* USER CODE BEGIN Init */3 S! w3 q3 I5 n! ^* I7 R2 s! [0 C. @
  66. " F' Q: F5 m: k* v
  67.   /* USER CODE END Init */
    / y% p8 @3 c( C! S, @$ ]
  68. - `7 f3 J8 a% L- g$ I1 M
  69.   /* Configure the system clock */
    2 Y2 _4 ^9 y2 G* \6 s. Y
  70.   SystemClock_Config();
    $ I8 M* K1 C* s; [% J5 o

  71. : J# p2 u  D& c; k
  72.   /* USER CODE BEGIN SysInit */
    8 _$ L# A+ |+ L

  73. . u' C: O; I. Z) D# G
  74.   /* USER CODE END SysInit */
    % T+ z9 c7 I% V5 f8 Z
  75. " j6 R' }  y; v! X$ g9 z( _
  76.   /* Initialize all configured peripherals */" `" o5 c3 _2 X4 t& z- N- v9 {
  77.   MX_GPIO_Init();
    ! a+ O0 _7 y8 F; l$ g. C
  78.   MX_ADC1_Init();! j: |5 H1 v0 s0 t9 g, V6 ^0 e7 W
  79.   MX_DAC_Init();+ d0 s6 j$ x+ Y+ o7 f
  80.   MX_TIM1_Init();
    ' F( [# R% e8 }6 H5 F- y# H
  81.   MX_USART2_UART_Init();7 ^  ~8 P/ f+ D, r+ S
  82.   MX_MotorControl_Init();! ]* N8 e6 W2 G8 y

  83. . r9 ~! s1 S+ G7 s8 w8 p
  84.   /* Initialize interrupts */2 y0 Y* D' I# I* d, O
  85.   MX_NVIC_Init();  C* u- m' U0 ^* P( D! \
  86.   /* USER CODE BEGIN 2 */0 \9 z4 R- ]9 {; A* a
  87.   MC_ProgramSpeedRampMotor1(3000/6,1000);
    1 w  v2 T# n" ^
  88.    
    / ~4 d" G8 G7 m) ?4 s9 \
  89.   /* USER CODE END 2 */
    # s0 V4 g2 V& W$ ?  Y
  90. 0 H( H6 `4 u! r; Q# f
  91.   /* Infinite loop */
    ; N' J) o/ o7 u* g& u8 H, n
  92.   /* USER CODE BEGIN WHILE */  
    * S( e* {& @2 u$ q" g; P& R
  93.   while (1)
    . P) z4 M6 Z  v3 s$ z3 w7 a/ X5 t' z
  94.   {
    3 d. R4 B: i0 }% L+ N( ~
  95.   /* USER CODE END WHILE */7 J0 Z) |9 o3 c& `9 O2 @
  96. 1 @3 b) T5 l  }) |, L. t! L
  97.   /* USER CODE BEGIN 3 */
    5 ?/ U" Q- P7 L7 Q/ L
  98.    
      I! G* P: @* h+ P# H0 I
  99.     switch (i)  t; Q$ ~' `/ H' Y
  100.     {
    0 Z4 p2 m2 r9 k; d0 H+ c, ^9 y, j
  101.       case 0:7 M- N( F( a2 N
  102.         MC_StartMotor1();
    + Q7 b& V3 T- j4 S6 `$ d% Z
  103.         break;
    " v5 X: C0 f. q$ c* E6 Q, S1 Q2 _) w
  104.       case 10:
    ( h& a8 ~- M' T) |4 N) J' P
  105.         MC_StopMotor1();8 J/ M" u, N" q0 y& l2 j  Q
  106.         break;9 g0 E' {) j3 d  s# ?1 d
  107.       default:: q, I& F, {( X6 |: ^: U5 W
  108.         break;" i7 r: C1 {5 q  y3 x
  109.     }$ X- I6 g* l, |1 x5 c5 R4 c
  110.    
    8 p7 i" }3 Y  `/ k9 k
  111.     i++;
      T! |/ s4 q, \& J: w; s/ j
  112.     i %= 15;   
    " t! w+ M) l& E2 @. m+ Q' e3 O
  113.     HAL_Delay(2000);    //systick定时基准为500us,所以2000为1秒) {. A: p! Y  g
  114.    
    3 Q2 M* e1 ]( |+ k
  115.     HAL_GPIO_TogglePin(LED_Motor_GPIO_Port, LED_Motor_Pin);9 M. \( K0 {) i% `4 o% [
  116. " p* I' a* _! b5 v9 F
  117.   }
    % M  N( c9 M6 G2 i
  118.   /* USER CODE END 3 */. F7 Z7 D4 E$ q* H! x

  119. . ~& O4 u. w3 a- k
  120. }
复制代码
1 ~5 i9 Z! L+ w% M6 t# q' F& z2 S# s

3 e" I+ i" Y* w7 ^9 ?/ O  b对于电机参数设置、启动、停止操作,还是比较简单的。这主要得力于ST的工程师,把大量繁杂的代码打包,给用户的就是非常明了的控制函数。8 m7 y+ m( O7 ?

  m4 d2 ?* U6 i/ O/ S; J8 k按照惯例,程序工程附上:
+ R$ d5 `3 P5 d8 i P-NUCLEO-IHM001_StartStop.rar (8.98 MB, 下载次数: 67)
赞 收藏 2 评论7 发布时间:2018-9-9 20:54

举报

7个回答
liujunfy527 回答时间:2018-11-2 17:29:22
谢谢分享
liujunfy527 回答时间:2018-11-2 17:29:43
谢谢分享
惜缘1 回答时间:2018-11-13 23:16:53
自动生成IAR工程文件的软件叫啥名啊
2 |8 ]5 L% J) O" m5 x( w' R2 u  u
七哥 回答时间:2018-11-14 00:04:19
本帖最后由 toofree 于 2018-11-14 00:05 编辑
5 `) W1 K5 p* q8 N
惜缘1 发表于 2018-11-13 23:16: d+ d. C4 f; H7 l
自动生成IAR工程文件的软件叫啥名啊
* _1 w& G& z% F1 ~$ ?, N3 o
stm32cubemx 20181114000527.jpg
) D! b; C' n; ^! A) n
瞻_ 回答时间:2019-7-2 10:44:46
好资料,非常感谢!
byronsong 回答时间:2019-7-2 10:47:01
: w9 d+ Q4 @5 [) ?# j  G
好资料,非常感谢!
byronsong 回答时间:2019-7-2 10:47:17
: _! Z/ i- m3 r
好资料,非常感谢!
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版