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

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

[复制链接]
七哥 发布时间:2018-9-9 20:54
本帖最后由 toofree 于 2018-9-14 08:47 编辑 3 X6 @! [4 J" y" e4 b
7 Q1 W8 b7 D/ H9 {3 E5 G
【STM32电机培训】——3、任务1电机设定速度、定时启动停止
0 P$ \' P" j4 P/ n* K
& E: f4 D- E# O) S' c
目标任务:设定速度3000转,启动工作10秒,停止工作5秒;再启动,再停止,速度保持不变,如此往复。
3 x; f" y! p# r" h% v

' j+ N# ^0 L* S0 r/ T 00.jpg % c5 P5 l/ x# t3 M! ~3 {
6 v! E' d0 _( s* C
& {, J3 J. Q0 }& L/ j' ~9 J& ?5 b% s
在电机参数测试时,得到过电机的参数。
" g1 c" e$ U: O3 y- f. ]3 J1 [" y【STM32电机培训】——1、实验电机参数测量及极数对解疑
. s; ^' _! G( u. L3 |https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=617371&fromuid=307297
( q1 ^5 r2 ^2 T" O) N(出处: 意法半导体STM32/STM8技术社区)
5 x0 M& D  \7 W1 a* Z+ z5 r 01.jpg : l4 _! U2 [) P! Z3 M) z+ n8 V: q

; \9 v; q2 U3 U9 a4 s) M; k
本贴实验工程基于前一贴工程进行修改。前一贴链接:【STM32电机培训】——2、生成电机样例程序stmcx、ioc、IAR工程& S* w% X5 v5 B6 s% ^( `6 w) F
https://www.stmcu.org.cn/module/foru ... 7427&fromuid=307297
$ \) A; {: \9 `7 f7 U6 h(出处: 意法半导体STM32/STM8技术社区)
& ?$ N, U. p) x% ?. R2 |0 R3 J. [, i) U2 e4 e
将电机工程设置中的参数按照,之前测得的参数设置。5 n6 a9 a( j) s% y2 L
02.jpg 0 t0 Z  ~+ h0 `  V; N) D3 r

8 w7 r1 E/ C, B9 Q/ m; Z5 n* d- F
- j3 Y: z2 r7 V/ G8 K
由于最大电流有变化,因此电机驱动管理中的启动参数也得对应做出改变,否则不能生成新的工程。
' e" r5 Y7 Y, G0 U/ o! Q 03.jpg
' c4 h; {3 ~- r$ W) @9 H8 G$ ^
) j0 _( I2 Q2 W0 _
0 k, y" f6 x, I$ b% \; p
本实验,打算顺带闪个灯,从原理图看出,X-NUCLEO-IHM07M1板上的LED灯D11,使用的是PB2,高电平有效点亮。3 ]$ h/ z  E4 O" }+ }! b$ Q, h
05.jpg # V# ~% W1 r; r, r- O
' F; T9 g/ H0 ?' M5 @( |* h( [  f# x
+ N4 [, {* H! X( n. g; Y3 i
对照NUCLEO-F302R8板原理图,确认是PB2无误。同时在NUCLEO-F302R8板上本身也有一路LED,用的是PB13,高电平有效点亮。$ ~0 |4 `+ \4 D1 t. h9 j8 J
04.jpg
1 m  Y5 N" T# P1 O+ Y* C( {* X6 A7 k6 |1 x& ?  j
, W" q% J# H) G9 _. E) a( T
打开电机工程下的,stm32cubemx工程文件“SDK50x-P-NUCLEO-IHM001-BullRunning.ioc”
# s+ ~' D+ }0 w& {/ O 06.jpg
0 o9 {  e8 q/ ?0 L; Q$ E) l' C9 G* z! `
: l* u% J+ n# o- ]2 X8 T  m' i
在IO管脚图中设置,PB2为输出,同时更改别名为“LED_Motor”,程序中使用更直观。
* `7 o" M- K8 @+ {# S" y 07.jpg 5 M* G& H; w; C/ ?. ~6 G9 R/ P

1 j) U% C' b0 i" T

8 r$ b0 @: n9 z$ b/ G; W# k) b0 ~& q检查IO配置,确认LED_motor管脚模式设置正确无误。
/ |4 R$ [  C+ i( W 08.jpg
' t( ]! g9 r: S; w) p$ W! i9 Y3 ~) m- Q, u$ U
2 {; ~, m$ K  m4 c) K
重新生成IAR应用工程。成功生成后,打开工程。
0 @  A% R7 _$ \) ?. m! x 09.jpg
; @; G" u7 r! b7 r6 T0 y2 @; a
3 D+ h$ P$ F/ d

1 v7 J9 m- f& e4 e6 f( m( U, D+ _在生成的工程中,main.h中可以找到,LED_motor的相关管脚宏定义。/ F8 }" Z) u) Z) J
10.jpg
9 w1 g  ~6 q. q! l" i& P& y) e$ k. e5 S4 U, I0 u& Z

0 s! M7 e5 t. S- S1 I8 c* x- k- @程序中使用GPIO状态翻转,来闪灯。$ k! M% L. z% \  t* `0 `. b
11.jpg
+ s4 V4 F' K, L" T. u! F/ k7 z5 ], [9 F/ |0 e. ?' d! D

* w( _) C! X' {, j, F0 r4 n找到设置电机速度参数的函数MC_ProgramSpeedRampMotor1()在mc_api.c中
+ G/ `# Q) g$ d. O 12.jpg
5 ^; r7 y( D6 L  f: Y- ~3 l6 t# Q
' E& N8 g5 u7 Q) \
/ `1 S& Q3 m" y. V. N
在主函数main.c中包含进“mc_api.h”头文件,一定要放在“/* USER CODE BEGIN Includes */”与“/* USER CODE END Includes */”,否则重新生成工程文件时,将会被冲掉。
. P" ?2 |( Q" I% ^ 13.jpg
! u! o- f9 y! `3 l% B0 e" y4 @3 a# D# K: R
' i% Q9 F. \# E5 |
定义循环变量“i”。同上,用户添加内容,一定要放在“/* USER CODE BEGIN N */”与/* USER CODE BEGIN N */,之后同理。
9 U7 i. e3 b; ]0 W8 K  E; P+ ~ 14.jpg 4 V+ [% u$ k' U
" C3 C  \& u; J" F

2 f, e( ~9 a4 q2 }/ [! Y) P添加电机转速参数设置函数“MC_ProgramSpeedRampMotor1(3000/6,1000);”。5 Y1 P2 X- j7 w; S4 d0 m+ O
引入switch语句,来进行电机启动、停止控制。这样分时工作,可以使用LED正常闪灯。' y8 f2 Y, F9 l% _- @6 @
15.jpg 1 s$ N: p+ l# Q% `* @2 ~

  T# g+ ]6 |. @- C
% r- ~' {+ ]$ q- r: h8 J. Q
编译IAR工程,并下载最新代码(Ctrl+D),全速跑程序(F5)。
' s/ k, A# E- l' R. G7 z6 Y
' ?3 o: ~" x( I+ W1 t! ~( X8 q
7 [7 d. f) A8 R+ n: F. Z
打开“Motor Profiler 5.0.3”软件,通过串口连接电机开发套件,打开“监控”窗口。+ Q! O9 A) z8 L/ C& C
20.jpg , X4 o" B! f. O. W! |
9 X/ d+ y# x3 w) @2 S+ F) L' n5 [

! u( g! C* C0 x- w. w“监控”窗口下,在打开“Plotter”绘图窗口。可以看到,电机启动一段时间,停止一段时间。但是时间宽度好像有点问题,D11闪烁频率为1Hz。经查看,启动5秒,停止2.5秒。原因是SysTick的的基础时钟为500us。# u- c& i# L. @; s
16.jpg
  A% @- c( ^. m! E/ s' i& c
" ~  p  N+ H' z5 ?
1 i) T, \& ?; g; a# m1 r, s" c
修改代码,改为每隔2000个单位,一个节拍。修改后D11闪烁为0.5Hz,符合预期。: v6 {$ H" U1 L6 R0 F6 C$ c
17.jpg
+ n' C7 Y" T+ T+ x3 f$ ^+ D+ [
8 F+ c/ X% A0 c$ G* F3 r
8 j2 {0 U+ s5 y" B
重新运行程序,查看“Plotter”绘图窗口波形,这次时间正确无误。# c; e8 R2 l% d9 D0 c+ d; m1 b( |
18.jpg
- }$ O& l" o) I3 P" R$ Q1 @$ F# b( s! y4 o
6 E1 G3 ^6 q: O! X
main.c中修改过的代码,贴入:/ s: ]2 _+ _& [/ m5 \2 }) }3 t
  1. #include "main.h"
    4 M( R5 a# G- G0 w: G, i2 |4 I1 L
  2. #include "stm32f3xx_hal.h"
    , Y9 Y  A* x6 p3 _, y
  3. #include "motorcontrol.h"
    + X# [1 B/ Z  G6 V2 M
  4. : B$ J. H& k! N5 P2 |# X) d
  5. /* USER CODE BEGIN Includes */5 U* I/ u# {8 Q3 Q$ [$ u

  6. 2 y7 `4 K0 t. R0 B, X' A
  7. #include "mc_api.h"
    6 o5 z  h; Z+ @+ `7 S

  8. $ J  r- [5 T1 k) U  a8 R
  9. /* USER CODE END Includes */; S* \2 x- l0 q. |0 @$ }
  10. 0 t# k! ~' p- ?) b
  11. /* Private variables ---------------------------------------------------------*/
    ; w+ e; V% _3 O& w8 E/ i& W
  12. ADC_HandleTypeDef hadc1;
    * p+ V1 w; l! E; ^3 U3 w1 B

  13. 9 L( ]8 b0 E9 ^7 y, Q
  14. DAC_HandleTypeDef hdac;
    8 s0 I, w5 T7 O4 b) ~! N% G! h$ [
  15.   m) F; K' z: \6 }/ g
  16. TIM_HandleTypeDef htim1;6 |) _! y: n/ D$ c1 ]; A  K

  17. ! X: T5 m# H- `
  18. UART_HandleTypeDef huart2;) T7 ]( v" C. y/ t6 h6 _

  19. . p# i# r& u/ ]  r6 [: {6 E' I- g/ O
  20. /* USER CODE BEGIN PV */% C# U  [# `. I6 K, m: o6 i
  21. /* Private variables ---------------------------------------------------------*/
    5 R+ M9 L% Q3 V) @7 b, k; z
  22. 4 J* v% n( H7 c+ G
  23. /* USER CODE END PV */+ R1 z  D9 h" |6 G$ L  u* _/ G
  24. " a: ~7 I8 f+ Y. V& B
  25. /* Private function prototypes -----------------------------------------------*/
    : ~$ w3 I! }. [9 p/ `' W
  26. void SystemClock_Config(void);
    . e  H2 i2 F* ~/ I! t
  27. static void MX_GPIO_Init(void);
    * m# c+ [, [# Y: x* g9 E
  28. static void MX_ADC1_Init(void);
    * k$ |2 n/ v8 ]& u- M. ?
  29. static void MX_DAC_Init(void);- ~, J- e/ i3 D" G
  30. static void MX_TIM1_Init(void);* L1 G/ R+ V4 p+ d, l2 i1 f2 N
  31. static void MX_USART2_UART_Init(void);
    ( ~4 n- \$ K/ t7 t; ]! M
  32. static void MX_NVIC_Init(void);
    1 D  u4 M' a- y- M

  33. # {' p$ D. ?/ X2 p3 I1 x
  34. void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);* @6 T) e7 q2 ^/ Y4 ]$ Y# ^
  35.                                 
    ' E& U! e$ F% C* B$ J

  36. ! b1 q& y7 t2 @1 z
  37. /* USER CODE BEGIN PFP */7 f& g+ ~( g- b7 d
  38. /* Private function prototypes -----------------------------------------------*/- ^3 g. u# i/ y' Q8 L; t% }5 x" Z

  39. - W9 N$ l. C$ p
  40. /* USER CODE END PFP */
    4 ?" e; `. u% A4 t" M/ O
  41. & z" \7 e. v5 A' m! y
  42. /* USER CODE BEGIN 0 */
    ! H* B2 R; g* ^1 t! _2 a
  43. 5 x/ ]/ h% h. [% s
  44. /* USER CODE END 0 */
    4 H' D* d9 z- `+ ~! n4 b" s. d
  45. & S5 ?1 s6 G# x4 ]! j, G# U
  46. /**
    + `5 d: ?. Z8 Y" o( K$ a
  47.   * @brief  The application entry point.1 D# n( W  s0 J- d
  48.   ** D5 F" c8 f' ?: A" n
  49.   * @retval None2 k, Y  ]0 O) U8 W
  50.   */" x6 w1 ]& V' n( d# ]
  51. int main(void)
    1 ^% B; R+ {3 d7 |4 s" N
  52. {
    % }) ~9 o$ h; ~  v5 ?' d! D
  53.   /* USER CODE BEGIN 1 */
    9 ^/ w) |7 f8 b0 Y9 ?  U8 ^1 W
  54.   int i=0;/ t  a; n. p$ E9 ~6 ~
  55.   //int dir_flag = 0;         // 1正转,-1反转,0停止- }8 E3 n- \9 |3 k$ a$ l+ J
  56.   //int run_cnt=0
    . `2 d& _: o* K, v! o$ g
  57. 2 W9 k2 T7 G5 K) t
  58.   /* USER CODE END 1 */7 Y- s' I' n0 d# C, [

  59. 5 G2 Q' l# S- S- |
  60.   /* MCU Configuration----------------------------------------------------------*/
    0 n. `3 P, p9 _3 b
  61. 0 }5 p, y7 y  P5 h  S( _
  62.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    5 ~3 g- @6 n! r5 o9 j/ i, g
  63.   HAL_Init();7 @7 p4 ^% P3 z* e* v
  64. ( w; q: v& l% v2 t: k  X
  65.   /* USER CODE BEGIN Init */
    5 P$ c1 B- h  q9 ^+ e8 i

  66. 2 L: X8 N; _0 U+ J
  67.   /* USER CODE END Init */% N8 i( }- N! b5 `. _4 E+ C

  68. 7 E! e6 F3 Y7 P
  69.   /* Configure the system clock */2 g: h& t; h. B2 U! T7 Q
  70.   SystemClock_Config();
    8 [0 [" |: \- s

  71. 2 h& |* o+ \+ B- o
  72.   /* USER CODE BEGIN SysInit */2 ^6 G4 C; {: Q$ N! F* a
  73. ' o) {5 v5 u9 h
  74.   /* USER CODE END SysInit */
    4 v# f' I" B- u
  75. 6 i* j4 o, }: Q6 r7 {
  76.   /* Initialize all configured peripherals */) O; J% b1 _+ ?6 B$ o
  77.   MX_GPIO_Init();
    " }" d5 c" k0 e$ e* R
  78.   MX_ADC1_Init();
    # I$ F4 c) C0 O" P
  79.   MX_DAC_Init();
    8 _4 P4 Q/ g5 n
  80.   MX_TIM1_Init();
    . n/ a7 Y$ k" m( v+ M
  81.   MX_USART2_UART_Init();
    $ {" T) A" H3 M$ |0 x
  82.   MX_MotorControl_Init();% i) s+ t, {& a" |5 I9 K

  83. 9 E8 ^& R2 a$ D# [2 }5 E; y. Q" W
  84.   /* Initialize interrupts */
    8 q3 I3 R! y8 [( T4 [$ s
  85.   MX_NVIC_Init();' N0 {% I# M$ f% Q3 @# H* c$ C$ o
  86.   /* USER CODE BEGIN 2 */# o0 {- J  C* z/ t; c9 W" r
  87.   MC_ProgramSpeedRampMotor1(3000/6,1000);/ ~* M) ?. ?% k+ K
  88.    : q; @( W5 G+ L2 b2 ^
  89.   /* USER CODE END 2 */
    5 O) T% {3 q2 i$ G0 x

  90. ; ]( R8 s( M) P/ S; P1 g4 X
  91.   /* Infinite loop */6 W% N+ ^, a" y5 ]
  92.   /* USER CODE BEGIN WHILE */  3 ^+ N& n9 S' B3 ~
  93.   while (1)% Z# g, C8 G+ H6 R+ g6 r
  94.   {( B; Y  ~# c+ a6 }$ [
  95.   /* USER CODE END WHILE */+ a. ~4 i: A2 [5 d7 @
  96. * [9 |- v; H% t* k
  97.   /* USER CODE BEGIN 3 */( ~4 d, e$ q6 Y* }' |9 q( S
  98.    
    / g! e  e9 }' E" n. o0 e1 r
  99.     switch (i)
    : v) x# j( d; `; B# g1 }, {. @
  100.     {
    # M* ~+ Z7 R$ B9 y% }. X) d/ O  ^, T
  101.       case 0:0 a( K  v( o, ]% @4 V
  102.         MC_StartMotor1();
    5 B  G- `2 y) t
  103.         break;
    $ [5 b. V# i* d& U. m- W) R; |
  104.       case 10:1 h# I' g0 w2 ?3 F
  105.         MC_StopMotor1();/ ?8 u' T+ m5 n& g
  106.         break;7 ]3 o  s0 h8 t$ C' j% I9 ?$ q& A
  107.       default:
    5 Q6 B) J& h) G& g- E
  108.         break;
    ) ^9 `0 L# g! W! M1 a
  109.     }
    ! ~$ ]$ m* t1 X7 |2 R
  110.    
    " k5 @/ ^2 h# q% N* o
  111.     i++;
    5 |& L9 F0 c: i. y0 X( H
  112.     i %= 15;   
    / P8 o- u) z, G! c
  113.     HAL_Delay(2000);    //systick定时基准为500us,所以2000为1秒
    # x' b# l" a( U
  114.    
    & @3 |4 \9 a+ X6 Q- n. w/ A2 s: @
  115.     HAL_GPIO_TogglePin(LED_Motor_GPIO_Port, LED_Motor_Pin);
    3 ?/ k8 E1 n( O; i! V
  116. & S' f/ @! c9 O( _
  117.   }
    # [- C; i8 L" S; a% U" C% P$ f
  118.   /* USER CODE END 3 */
    - T" B& p9 J2 s' I
  119. 3 l7 h. t7 ^$ o5 a. n, p0 D
  120. }
复制代码

+ g/ }" U7 p3 z0 I5 S' m5 e4 y
3 ]# i6 A3 Y% w4 C, Y7 B/ X对于电机参数设置、启动、停止操作,还是比较简单的。这主要得力于ST的工程师,把大量繁杂的代码打包,给用户的就是非常明了的控制函数。) A# b  [* T  ]1 h5 G' p* `1 E
0 I( |. O( [$ ?8 P& s
按照惯例,程序工程附上:
: P4 e- F, w$ O' K 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工程文件的软件叫啥名啊
) D; h6 W5 t& i
七哥 回答时间:2018-11-14 00:04:19
本帖最后由 toofree 于 2018-11-14 00:05 编辑 " N3 J' R8 c7 x- q9 n- b
惜缘1 发表于 2018-11-13 23:16
$ v: m& b1 g1 p0 z3 U* d9 z9 l* I( D自动生成IAR工程文件的软件叫啥名啊
% i4 n' C" F9 w
stm32cubemx 20181114000527.jpg
- N& o+ v+ Y7 T! }! l8 F
瞻_ 回答时间:2019-7-2 10:44:46
好资料,非常感谢!
byronsong 回答时间:2019-7-2 10:47:01
5 R2 e' r6 t5 a1 r$ q! T2 @
好资料,非常感谢!
byronsong 回答时间:2019-7-2 10:47:17

" L; `4 |' @# P好资料,非常感谢!

所属标签

相似分享

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