请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
七哥 发布时间:2018-9-9 20:54
本帖最后由 toofree 于 2018-9-14 08:47 编辑 7 B% A9 G, K3 C! A, i

: _7 C4 b' `% d  N5 _/ o% {【STM32电机培训】——3、任务1电机设定速度、定时启动停止7 {+ H8 Z4 a+ b4 Z

4 ]) Y  L; e/ E9 Z- m! ?4 i目标任务:设定速度3000转,启动工作10秒,停止工作5秒;再启动,再停止,速度保持不变,如此往复。
" y  w1 F( r# P

& W) s! d* @0 ?( q0 \" R# i0 J/ Z% q 00.jpg
" i# ^' M* o2 S  j& k8 k1 C1 J/ ^! p3 S# N$ _' m7 t& e

# Y: H& H5 U" n# {在电机参数测试时,得到过电机的参数。
; E; i9 {, z8 X  C【STM32电机培训】——1、实验电机参数测量及极数对解疑8 m9 c7 ^0 B2 E! A4 m1 i9 f3 n
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=617371&fromuid=3072977 Z- ~+ R( E' O: d
(出处: 意法半导体STM32/STM8技术社区)
6 F6 U) P% ^$ b2 Y- ]: Z9 E* }* Z 01.jpg 7 F$ o7 P+ u8 P3 z! H6 L

& L7 d" l4 ~& J' t  t9 i
本贴实验工程基于前一贴工程进行修改。前一贴链接:【STM32电机培训】——2、生成电机样例程序stmcx、ioc、IAR工程. N( z/ n3 W& r% |) l- |3 I
https://www.stmcu.org.cn/module/foru ... 7427&fromuid=307297) d" b' k* e  O! E
(出处: 意法半导体STM32/STM8技术社区); f; _, Y& y2 U0 z1 k" T, M8 ^
( c3 v, |2 i/ b
将电机工程设置中的参数按照,之前测得的参数设置。
" R/ K$ K) \  ^$ K& n% W' v 02.jpg 9 W6 c8 Q6 y" h! z) G1 D# s

3 K, g/ o4 U( Y+ e. _; c# u

8 x1 h* \$ p% U- s, q6 v8 d由于最大电流有变化,因此电机驱动管理中的启动参数也得对应做出改变,否则不能生成新的工程。
- z# C" l3 m2 } 03.jpg ; F! H2 S; K) B8 f

( h* k' c8 q5 F0 M' m1 [! ]& u

+ ^% n. |$ g1 f' _* N本实验,打算顺带闪个灯,从原理图看出,X-NUCLEO-IHM07M1板上的LED灯D11,使用的是PB2,高电平有效点亮。! _9 t7 ^/ t! ^
05.jpg
$ G5 m9 \- e7 i* i0 x
5 T. i1 t5 |: y& [' P, c) [6 t- r
2 T2 G" M5 y8 T& J- t; N
对照NUCLEO-F302R8板原理图,确认是PB2无误。同时在NUCLEO-F302R8板上本身也有一路LED,用的是PB13,高电平有效点亮。
! p  b1 `& U6 K- h% [  r0 B 04.jpg 4 n9 Y+ T( `' Q, ^( i" m/ m

. E3 Q; t4 j8 }8 t

6 m$ ^* P# d# |+ _( L打开电机工程下的,stm32cubemx工程文件“SDK50x-P-NUCLEO-IHM001-BullRunning.ioc”- j+ x+ I2 q0 A' a
06.jpg / T! B  M- ^6 z: w
( `- g7 m, Z5 t
' K0 Q( P/ F5 ]
在IO管脚图中设置,PB2为输出,同时更改别名为“LED_Motor”,程序中使用更直观。
$ C% N1 t* m7 D' k6 q% K- E6 ? 07.jpg 4 G8 s$ J) t( P- {4 `( A! D' k1 X6 o
% W. s7 l$ x! {) }3 T) L  f5 |
$ G( X* }) E, v/ q0 @% q7 Q
检查IO配置,确认LED_motor管脚模式设置正确无误。5 z, J, W0 E3 ?0 o8 q1 t
08.jpg 2 [" K$ }6 E  T4 T; R

6 D2 _  [: A5 h0 V2 y( Y# l# X& _
  D: w3 x0 h% y: W* d; c
重新生成IAR应用工程。成功生成后,打开工程。
$ B+ j( ]+ ]) O; W9 ] 09.jpg 4 K$ r! I5 x! P% Y% ]$ U; P

5 ^) {8 Q* Z- v: g0 {& c; p. G

- h4 i0 Z" C9 d6 A- Y: ?& p在生成的工程中,main.h中可以找到,LED_motor的相关管脚宏定义。
2 a- ~. D# O1 z7 S0 {" C 10.jpg
% I9 x$ ~# C) h$ Y; q% n0 y1 u( \+ c5 ~, Z
* G6 I* i! H$ F1 A3 F0 T4 E& ?
程序中使用GPIO状态翻转,来闪灯。
% Y1 `: e5 j& Q2 _( N7 x 11.jpg 2 _- W% u+ k; j1 p( Q

2 u- l7 \. n7 X( e" q: b, F! R( R

; n/ L1 R. Q) o- x; G找到设置电机速度参数的函数MC_ProgramSpeedRampMotor1()在mc_api.c中6 K$ ]( y3 R$ `3 N& s& O
12.jpg . R( I0 i! c5 v4 [/ ?

5 o8 V$ s; @2 G7 k( P" e/ B  N
* Y0 T+ L% h+ c8 b
在主函数main.c中包含进“mc_api.h”头文件,一定要放在“/* USER CODE BEGIN Includes */”与“/* USER CODE END Includes */”,否则重新生成工程文件时,将会被冲掉。
# w( z) x, X7 |0 ]# C. H2 Z* u- S5 A 13.jpg 5 {6 i- m" V, }& K+ X, F
) F: F& Y* K$ u/ R6 J
0 @, v/ l: z  c
定义循环变量“i”。同上,用户添加内容,一定要放在“/* USER CODE BEGIN N */”与/* USER CODE BEGIN N */,之后同理。$ b' j- A& t0 n4 l+ m
14.jpg * B" x. T/ G# N2 H7 x" _( Q  W" t: J
9 C  g0 M+ c! W4 R' a7 v
! `7 g2 T1 f- j4 K; j* p% f
添加电机转速参数设置函数“MC_ProgramSpeedRampMotor1(3000/6,1000);”。+ S+ m* I5 g1 _- ?5 G. h
引入switch语句,来进行电机启动、停止控制。这样分时工作,可以使用LED正常闪灯。$ c% y7 x# f; x% P* Y5 U, l: V
15.jpg
' j  t; ?& e% i5 `5 ^" _6 g5 f% m8 B6 ~$ m3 f1 r8 _

( u3 z: v; J: W4 _$ x编译IAR工程,并下载最新代码(Ctrl+D),全速跑程序(F5)。
0 F  q, {9 ~0 i0 g( s% k
. G/ W. _& V/ e1 `8 h* Q# B
. P% n8 m# f4 N9 t$ V
打开“Motor Profiler 5.0.3”软件,通过串口连接电机开发套件,打开“监控”窗口。- E9 m- k1 }1 x
20.jpg
- e/ P. F2 @# [; {! I
: K! i  @7 p9 P4 S% I9 s, I
& q- N* Y+ b( x/ Z
“监控”窗口下,在打开“Plotter”绘图窗口。可以看到,电机启动一段时间,停止一段时间。但是时间宽度好像有点问题,D11闪烁频率为1Hz。经查看,启动5秒,停止2.5秒。原因是SysTick的的基础时钟为500us。4 ]) H5 T0 G% |* L
16.jpg
! z' H8 Q( O+ |0 [. A) I: e$ w! d% |4 r% e" d# m: v

5 h' {! K5 A/ Q! p  ]修改代码,改为每隔2000个单位,一个节拍。修改后D11闪烁为0.5Hz,符合预期。
4 A7 e1 I8 D0 L6 l7 K# s" ]" T 17.jpg " m% v* n, k: @# ?' B
2 i2 R" S3 W$ m9 [% E
1 V( ~$ U; l0 J3 {+ R) o: {0 k  S$ T
重新运行程序,查看“Plotter”绘图窗口波形,这次时间正确无误。  D. @' i# e$ n9 d. r% s
18.jpg 3 Y' e7 r# x4 l# l5 A" @. T( `. ?% G
# D/ `8 M- I" h9 u/ P9 w" M! g% I+ Y" K0 F

  ], m3 M4 ^9 {9 gmain.c中修改过的代码,贴入:2 b# l! J, q+ \3 p, j
  1. #include "main.h"
    % J) a) ~  e7 l8 M
  2. #include "stm32f3xx_hal.h"5 I  u2 i3 r( H$ ]$ \
  3. #include "motorcontrol.h"
    4 c+ @: @5 A( a/ i# a- _  N
  4. / A: G! O8 J7 X& e" M3 m( q' l
  5. /* USER CODE BEGIN Includes */
    ( v- b+ i$ z& ]- H+ O2 }

  6. 3 A2 c, |4 |8 w& e( h# U) H' Z
  7. #include "mc_api.h"4 u6 A! j5 O3 i
  8. - J5 a5 g7 k% B$ w- Q  c3 f5 c
  9. /* USER CODE END Includes */7 ?5 t3 Y2 ?. z# A, T* b4 Z

  10. ' k9 x: f" g& M% W. z/ g2 D
  11. /* Private variables ---------------------------------------------------------*/4 q9 r7 N- h* a0 U8 s% [7 o% ~
  12. ADC_HandleTypeDef hadc1;
    / B$ f% ]9 N- h  w; |4 D0 g
  13. % C, Z4 m2 Q% N
  14. DAC_HandleTypeDef hdac;' R3 s) F- g( |$ O

  15. 2 `: L* A' S# P. C
  16. TIM_HandleTypeDef htim1;2 B: P2 H) y  h% }. G; g# u! W. L

  17. & c; A$ t  t. h/ L2 X$ C
  18. UART_HandleTypeDef huart2;# V! [# P% U! |* U- a% r
  19. - k, \6 W$ M! I: S% z7 t" @
  20. /* USER CODE BEGIN PV */7 c$ R& [" m) u
  21. /* Private variables ---------------------------------------------------------*/
    6 S: N6 v' O+ V/ X" D8 i
  22. 3 f$ T  s, B1 l: {1 Z# k7 o0 g
  23. /* USER CODE END PV */
    1 Y/ |& Y9 G$ F* m9 y" \- H6 @

  24. ) W" v8 s& U1 u0 J
  25. /* Private function prototypes -----------------------------------------------*/
    ( s  L* |: p3 f: ~" i9 t: J2 @
  26. void SystemClock_Config(void);
    3 I" ?1 H6 |8 B+ _; d4 A$ ]
  27. static void MX_GPIO_Init(void);* e( Y$ m7 |  p% n1 u
  28. static void MX_ADC1_Init(void);2 r8 o* P6 L- t, x6 ~% g
  29. static void MX_DAC_Init(void);
    3 O! J" V9 u3 ?% t/ r/ S+ f1 D
  30. static void MX_TIM1_Init(void);
    1 P2 S2 w! e6 z  J7 l) T
  31. static void MX_USART2_UART_Init(void);; n: N/ a% R1 p5 x' p6 O* M& y4 `1 s' S
  32. static void MX_NVIC_Init(void);
    , s. n" B9 r( H% m4 p$ w8 F- b/ L

  33. ' d3 a$ R' v4 Z2 t, Q
  34. void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);" u* M# H5 o& @5 _0 G0 O( B& L
  35.                                 1 S1 O+ h; V5 o2 a: \
  36. 9 y& y* V8 a" L0 g- z
  37. /* USER CODE BEGIN PFP */
    8 J% J7 _/ z1 q2 b
  38. /* Private function prototypes -----------------------------------------------*/$ X# X( p6 B- w" p' m

  39. - N3 n/ ?% ~3 I! B3 e# q/ }1 R. u
  40. /* USER CODE END PFP */5 R' ~) [2 J$ _4 C9 _  k0 Q# m

  41. : v9 \2 ~1 c- ]3 j& Q  R* l% `  S
  42. /* USER CODE BEGIN 0 */+ e4 f; o/ j. E' x5 B

  43. - i9 Y# R- a4 `' e" z6 z7 Y( F( |
  44. /* USER CODE END 0 */3 q0 f5 V$ a$ t2 M. Y6 S  }, g
  45.   r) F7 [4 x, Q% c: Z
  46. /**
    ( T8 o( S) V) W3 D
  47.   * @brief  The application entry point.
    & d% U2 ^8 ~, K( c
  48.   *+ ?- E. r% I, P# G+ w! L' Z" o
  49.   * @retval None. z* W/ z; U+ |0 T4 w: o' e7 {
  50.   */3 b0 n' F+ Z- S
  51. int main(void)
    # E  d& q' I# j) w3 _
  52. {
    ) L; |$ E& R9 T5 o
  53.   /* USER CODE BEGIN 1 */
    / Q- s( t3 D. u1 B3 Z
  54.   int i=0;
    ; E: J) p! t/ j4 {& t# U# _- O2 S' }
  55.   //int dir_flag = 0;         // 1正转,-1反转,0停止
    % X" I. _! X3 I
  56.   //int run_cnt=0
    3 z; h& ?, \1 c2 h) I4 p& u

  57. 3 G' p$ y6 A3 N% B1 {  `" h8 G
  58.   /* USER CODE END 1 */
    8 j/ b; @" V$ X- j+ ~

  59. # b( @6 e& K# I! ~3 L
  60.   /* MCU Configuration----------------------------------------------------------*/
    7 n$ n! U! {3 Y/ g$ S3 Q; S" G: z0 K
  61. 8 ^* B7 _) v& t  M+ f0 Q' J$ C6 p
  62.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    " A  h2 f9 X- D) c
  63.   HAL_Init();
    + X! f" }8 a% {

  64.   u8 {8 x) u2 X6 `) @
  65.   /* USER CODE BEGIN Init */
    + ]* o) c% b% A6 j5 a" j

  66. : [9 s# P1 j2 [- y; T
  67.   /* USER CODE END Init */
    . B9 N' G& {4 N0 k& `
  68. + K3 ~1 |2 b' P; T7 Y
  69.   /* Configure the system clock */6 Q7 D' G5 h/ w+ W1 c
  70.   SystemClock_Config();
    & y' \) Y, o& F& f

  71. . B5 w' |3 k$ ?
  72.   /* USER CODE BEGIN SysInit */7 ^! q, s, ~9 w4 E4 _: Y6 Y1 Z

  73. ' n8 W- d9 a- D
  74.   /* USER CODE END SysInit *// J5 G9 U. d; `1 h

  75. 3 @9 D) ]# _) J
  76.   /* Initialize all configured peripherals */
    - E% M/ A2 H% Q: w
  77.   MX_GPIO_Init();6 c$ W+ m4 c& K" \
  78.   MX_ADC1_Init();; ]$ h) s. ]) T! P7 h1 j
  79.   MX_DAC_Init();
    , g" `4 k0 v8 T( m( v0 H. Y. A
  80.   MX_TIM1_Init();. f9 B# V9 Y( _1 z' t: W
  81.   MX_USART2_UART_Init();5 Z0 B! S4 C1 \
  82.   MX_MotorControl_Init();% J% q; `5 |3 Q; S
  83. 2 A& k3 \+ {5 h$ \! Z0 A7 r* Z
  84.   /* Initialize interrupts */
    $ K$ R1 D  w; b) l; N6 k6 \
  85.   MX_NVIC_Init();! `# G. O& U9 B6 e6 K
  86.   /* USER CODE BEGIN 2 */
    ) P' k' W3 [, A
  87.   MC_ProgramSpeedRampMotor1(3000/6,1000);; Z" s2 W' N8 O: [4 F+ O
  88.    5 l6 X3 z! [* e/ P% B2 y+ e
  89.   /* USER CODE END 2 */
    " W$ l/ ?5 G4 g3 L, n

  90. $ E$ \* G% _7 `6 r, M9 j: v$ u" H
  91.   /* Infinite loop */8 C% |$ ]6 H/ P9 r0 ]% V. @! B. B/ W
  92.   /* USER CODE BEGIN WHILE */  5 J6 ^; K! s8 B; G- V/ c8 S4 ]9 y
  93.   while (1)0 h  N! I  G% d# V0 V: U  l
  94.   {- J" L( J- ^" p6 t) _( b, @7 q, }
  95.   /* USER CODE END WHILE */* x5 b+ M4 ^- L/ o  o1 W4 `+ H5 L

  96. 4 f2 q- q% n. ]8 s7 [
  97.   /* USER CODE BEGIN 3 */( q, H  F7 K; I3 W: f' p
  98.     # F  S0 r  e% S. d6 l; E
  99.     switch (i)
    $ U  N, g# A" m  W. P# d8 h
  100.     {$ y1 \& @% o2 z1 l! E  ], A
  101.       case 0:1 G, d! H7 N( `6 |) ]. T  }6 r' s
  102.         MC_StartMotor1();2 s( F; i  V# T" m/ A7 v) e
  103.         break;- t6 N! L. d7 O; }! q
  104.       case 10:
    ! U8 o" ]) f5 I+ g. u0 c3 B
  105.         MC_StopMotor1();2 E- x! ~, m  f- x  [) ]8 b! H
  106.         break;
    ; G1 _9 J( g+ B$ k4 Z  ^+ X0 n
  107.       default:& B+ q6 @- z# A  [6 Y1 v
  108.         break;
    - K3 p2 q& T5 O! d3 {
  109.     }4 ?2 ~, d0 J( N6 H( e. z
  110.     ( N4 b2 \7 l) T- {  F& z
  111.     i++;
    % y1 X. {9 M" s) t
  112.     i %= 15;   
      G3 z$ O, k( Z* q3 g" q
  113.     HAL_Delay(2000);    //systick定时基准为500us,所以2000为1秒
    3 K/ I! }8 [4 b) l$ u
  114.     + R$ ?7 ?4 n# u7 `* ?
  115.     HAL_GPIO_TogglePin(LED_Motor_GPIO_Port, LED_Motor_Pin);) u& _* [' z1 ^0 K1 E( f! _
  116. # c- x* N9 ^' [6 x
  117.   }* o; q, V  M2 |' |  N  Y
  118.   /* USER CODE END 3 */
    6 E* [  B( z% J; P2 p
  119. 9 a( |( V5 p+ R; L5 V1 K
  120. }
复制代码

3 c, C3 [) l( J, g4 }1 O" W- ^- M4 Q% ^# H; f) F
对于电机参数设置、启动、停止操作,还是比较简单的。这主要得力于ST的工程师,把大量繁杂的代码打包,给用户的就是非常明了的控制函数。
1 `; j# Q8 }& V, E
% I! u% W" q- _. F% h% H按照惯例,程序工程附上:
0 @6 `3 s: c, w) o4 A6 R/ | P-NUCLEO-IHM001_StartStop.rar (8.98 MB, 下载次数: 65)
收藏 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工程文件的软件叫啥名啊3 M" I4 M. b8 ^1 z, u. B
七哥 回答时间:2018-11-14 00:04:19
本帖最后由 toofree 于 2018-11-14 00:05 编辑 : ^1 }2 r2 n" F7 e0 Y
惜缘1 发表于 2018-11-13 23:16/ f0 B1 L1 d7 B2 h; X2 g3 @* W
自动生成IAR工程文件的软件叫啥名啊
7 T, n& U& ~7 K  Y* y3 r
stm32cubemx 20181114000527.jpg & b2 z  m# ^/ T. d6 _* H
瞻_ 回答时间:2019-7-2 10:44:46
好资料,非常感谢!
byronsong 回答时间:2019-7-2 10:47:01

0 S! ^, U0 A# W* K好资料,非常感谢!
byronsong 回答时间:2019-7-2 10:47:17
+ \. _3 i) ?, H* }; o( V
好资料,非常感谢!

所属标签

相似分享

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