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

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

[复制链接]
七哥 发布时间:2018-9-9 20:54
本帖最后由 toofree 于 2018-9-14 08:47 编辑 1 q( l% Q; ^& U; ~- n' z$ u, B+ n) p

) f$ E) z" P5 B【STM32电机培训】——3、任务1电机设定速度、定时启动停止- t0 _7 G0 m% f1 \7 \& l* _2 j/ ?2 I* g

' s! a4 t8 T1 h7 k. V目标任务:设定速度3000转,启动工作10秒,停止工作5秒;再启动,再停止,速度保持不变,如此往复。
# D9 N2 F! ]- N1 @' C' l

8 T% [& x7 @& P8 g 00.jpg 4 b  E$ d: ^$ d/ \. O- q

( M) P2 Q8 E1 o4 z

( r' r( O1 d& c" a在电机参数测试时,得到过电机的参数。
6 d$ ^; I( ^. @0 w  g# O+ {【STM32电机培训】——1、实验电机参数测量及极数对解疑6 @. V- i9 _6 s# {- N$ d3 G/ d
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=617371&fromuid=307297
8 B& a1 V4 M( F(出处: 意法半导体STM32/STM8技术社区)1 k7 O" z; J$ n) c% \2 A4 s
01.jpg $ d* [! r+ S4 S! D( Z7 O. _5 U

, y4 U2 R. Y3 `6 l$ u+ f, ]$ D( }. f
本贴实验工程基于前一贴工程进行修改。前一贴链接:【STM32电机培训】——2、生成电机样例程序stmcx、ioc、IAR工程
: G3 N  c+ ^$ ?, g4 khttps://www.stmcu.org.cn/module/foru ... 7427&fromuid=3072972 o3 s' l& A* h8 \
(出处: 意法半导体STM32/STM8技术社区)* @4 a' ?7 k5 E) N9 m
! N) y8 ^( V: ^1 j
将电机工程设置中的参数按照,之前测得的参数设置。
0 |1 B2 f2 I9 W8 q6 W 02.jpg % N5 X# W) N& u

; O; t1 K& \1 h* E

  r( _# m- u5 C0 q* \. `2 U由于最大电流有变化,因此电机驱动管理中的启动参数也得对应做出改变,否则不能生成新的工程。+ d% W/ k9 a7 h! b9 H% j: f
03.jpg
4 `4 E8 x! I- M% v" P7 G4 G
+ t+ v7 t8 }8 ?$ h6 M
) O; B# c: w. k
本实验,打算顺带闪个灯,从原理图看出,X-NUCLEO-IHM07M1板上的LED灯D11,使用的是PB2,高电平有效点亮。6 H6 c$ Z# |4 z3 I6 U' ~( Q
05.jpg
8 ^4 s9 F7 b- l7 F* s/ ]
  q' [7 G5 P1 E2 H2 E1 D

/ k4 y% t. g0 \$ ^% Z5 R7 m  K6 L对照NUCLEO-F302R8板原理图,确认是PB2无误。同时在NUCLEO-F302R8板上本身也有一路LED,用的是PB13,高电平有效点亮。+ _, K% d, G( g7 L6 R
04.jpg
/ X+ g0 ?8 q% b2 ]% X, q
4 J3 s( r/ d. I7 c) e
/ U7 S0 v; @. ^
打开电机工程下的,stm32cubemx工程文件“SDK50x-P-NUCLEO-IHM001-BullRunning.ioc”7 k9 S. |. S/ M5 P  O4 A
06.jpg
0 |! Y1 X1 h/ O. z1 J! E* Z
6 Z, p& G3 q3 K  m- Z* [" Y( {
$ k5 f# x# w4 c
在IO管脚图中设置,PB2为输出,同时更改别名为“LED_Motor”,程序中使用更直观。& `: o* m. }  @& j3 V
07.jpg ! b: V, S6 C5 S& F4 r# Y3 V4 a
: E( _9 a6 ]' i8 X
7 R9 {: i4 Q4 J9 a7 k- K) c
检查IO配置,确认LED_motor管脚模式设置正确无误。3 j) W$ x3 x1 N6 P
08.jpg
! x, }9 y6 _* m1 G$ Y/ u7 I, k5 p  [/ w

" ]8 m' N3 e8 x4 p, [/ s8 Y  S  S重新生成IAR应用工程。成功生成后,打开工程。* K$ H8 j1 g1 |/ M
09.jpg
4 f( A# `+ ?+ `' r+ L; T
9 N2 v8 j, t1 |4 P2 \

( D, w  x& N* y0 e  H在生成的工程中,main.h中可以找到,LED_motor的相关管脚宏定义。9 I/ i) p2 h+ ~  }( D# J
10.jpg 2 N) |& A+ P- I6 Y, M+ _! S8 h
- F3 f& E& A+ {4 O% y

- G. W7 O2 f! p( S# J3 u% W8 U程序中使用GPIO状态翻转,来闪灯。
  ]* J6 L, z- U6 d9 x& ? 11.jpg
. r- [" \& h, g
; p. U- @& u- h% E# N
% |; a! M# T, m+ t- `
找到设置电机速度参数的函数MC_ProgramSpeedRampMotor1()在mc_api.c中
6 _) A4 A7 `9 l  ~- {) E  r$ V 12.jpg 1 K  d% h0 F" Q- L
3 {' M2 b  Z4 x9 A. F$ t
$ h  f4 X' ^+ n$ f+ q% a
在主函数main.c中包含进“mc_api.h”头文件,一定要放在“/* USER CODE BEGIN Includes */”与“/* USER CODE END Includes */”,否则重新生成工程文件时,将会被冲掉。
" U0 L8 j8 _. y; ]: a4 l 13.jpg
, A1 k% O2 g* U9 A8 M4 S, `, G
# @' x4 d9 k$ X. K
1 {& y+ F8 y# t2 {7 [
定义循环变量“i”。同上,用户添加内容,一定要放在“/* USER CODE BEGIN N */”与/* USER CODE BEGIN N */,之后同理。  z0 z( c  j$ o5 R, j, J
14.jpg
; M  }8 _. X; ~* k. G! s
/ T* @4 L; L4 x) F, \
8 q8 k6 C" }$ X% ^
添加电机转速参数设置函数“MC_ProgramSpeedRampMotor1(3000/6,1000);”。
: j3 |2 |6 @9 D2 `引入switch语句,来进行电机启动、停止控制。这样分时工作,可以使用LED正常闪灯。. z1 e, D0 w, ?/ M: m
15.jpg
7 J8 Y0 }3 U3 B1 F
7 D: l8 J, o, j! c  J/ {! Q
& n% Z* i  r3 C2 |1 x8 V4 P/ U0 q
编译IAR工程,并下载最新代码(Ctrl+D),全速跑程序(F5)。
. b5 \- }! F2 v* l- e! f7 e3 h6 T2 s1 f3 h

; r$ K7 G' o: F  J& Z/ h" x打开“Motor Profiler 5.0.3”软件,通过串口连接电机开发套件,打开“监控”窗口。
, H3 {' W" @% F( F0 u6 \$ R' J 20.jpg   c4 G8 D+ S% C, q

: j0 Q  u& `8 }
6 ?! b. p, T5 s
“监控”窗口下,在打开“Plotter”绘图窗口。可以看到,电机启动一段时间,停止一段时间。但是时间宽度好像有点问题,D11闪烁频率为1Hz。经查看,启动5秒,停止2.5秒。原因是SysTick的的基础时钟为500us。
* Y- K* ~$ _$ f! Z; \7 ?) s# h 16.jpg ( I# g7 W! a& a* }5 Q% t

, J; }2 c3 T) n; F/ A! x: a

7 T+ d) l3 W) M1 L( f修改代码,改为每隔2000个单位,一个节拍。修改后D11闪烁为0.5Hz,符合预期。9 Z6 S* I, R% G, l
17.jpg
& w9 p. o  Y4 `+ B5 v6 X/ C$ ~3 B! y: @1 S

" C. p( N8 i$ K& E! n重新运行程序,查看“Plotter”绘图窗口波形,这次时间正确无误。* F- n3 ]5 C3 u  w+ K9 T
18.jpg
0 i2 y' M3 U) |0 p" O( r6 W1 t5 y& k
! v3 m& N# P6 v7 d5 S' p0 c- ~
! a  ?$ j  D6 p8 q6 |" Y& ~  \4 Y0 c
main.c中修改过的代码,贴入:
, ?, O4 k9 G: \
  1. #include "main.h"4 j7 b4 j. t0 l$ p4 w- \0 M+ w
  2. #include "stm32f3xx_hal.h"+ |$ F' g1 @0 @5 J0 r* {$ m5 s
  3. #include "motorcontrol.h", ]6 m, Z% M; ~3 u) J3 J- f
  4. 3 @: P; z( v4 U  K, b: M3 T4 e# o
  5. /* USER CODE BEGIN Includes */
    , Z+ u) G* U1 t: P# E- t9 V, X# M
  6. 8 _6 E1 [) O: f6 n+ y) o
  7. #include "mc_api.h"
    ; a/ g. p' C4 o, F
  8. ! {' i+ r3 B6 |$ a# m
  9. /* USER CODE END Includes */
    9 e8 i$ M) g8 Q; P& W& O
  10. + ^2 M; {, Y9 W) ~/ d8 R; p) q: b* L: a: t
  11. /* Private variables ---------------------------------------------------------*/6 r! l1 \6 C) K
  12. ADC_HandleTypeDef hadc1;
    + i1 a$ Z' \+ E: R0 Y3 {) }

  13. 4 q6 D  F: p' n7 t+ E
  14. DAC_HandleTypeDef hdac;
    2 C: O: {# l' u" d5 o
  15. 8 E& s0 e- `% ~) D
  16. TIM_HandleTypeDef htim1;+ d; [# R& F) \$ d
  17. 7 Q) n6 W( E, `* R5 B) \( n
  18. UART_HandleTypeDef huart2;) T, N, h! ~2 r+ m
  19. % f+ U* D! s, @0 L# v' k$ l
  20. /* USER CODE BEGIN PV */
    9 s2 W3 E) f7 a. Z" O4 O
  21. /* Private variables ---------------------------------------------------------*/
    , M" N! c. y. \

  22. $ U  S- z& _& L( L% h2 J3 n
  23. /* USER CODE END PV */! _1 [3 Z4 [( h8 _( z/ J

  24. 5 J$ @0 o2 d  ^8 v! n( J4 _# y
  25. /* Private function prototypes -----------------------------------------------*/
    " l; M, Z' x* O* y* ?
  26. void SystemClock_Config(void);
    ' c6 |! ~( P- R5 r
  27. static void MX_GPIO_Init(void);
    0 N+ b! w2 A9 Q' \+ \, G/ q% k
  28. static void MX_ADC1_Init(void);
    % \  G- q$ z$ _# B) u/ }
  29. static void MX_DAC_Init(void);) j5 z2 K( v- c, p3 `
  30. static void MX_TIM1_Init(void);5 z2 o4 q( u/ u' c+ A7 G
  31. static void MX_USART2_UART_Init(void);) C6 @! U" U& b: ~
  32. static void MX_NVIC_Init(void);: ~4 g% @6 R' A3 y
  33. ' {2 x9 L& w, c* z9 P# P4 Y
  34. void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);: E* C' z  H$ S0 |# h  b- d
  35.                                 : f9 i( y1 v/ I* u" i8 d# k0 F9 [

  36. , e1 k" x. Z2 r0 D
  37. /* USER CODE BEGIN PFP */% T2 o0 F! y6 Q& G5 X- R
  38. /* Private function prototypes -----------------------------------------------*/
    ; Z; G  J) J; n7 o# j
  39. , U+ [- V# c( h+ [5 W" R- w- @
  40. /* USER CODE END PFP */- h5 ~* n) L% Y8 v

  41. ) u0 H, [" L1 V+ d) g) F
  42. /* USER CODE BEGIN 0 */
    # {  C2 |3 H4 W2 p: ]! Q) `

  43. ' c0 u! s1 I( F# m, z: ?$ [
  44. /* USER CODE END 0 */
    . J: c5 ?1 j9 X# `! C7 r2 x

  45. 8 u$ \% P5 J5 ?# G/ U1 z
  46. /**
    ! L, U' L0 z# F# `
  47.   * @brief  The application entry point.7 z2 y: c+ R8 t) P/ g! S
  48.   *. s* P1 L( K# w( o
  49.   * @retval None" r  W2 Y" L8 ?: C
  50.   */
    6 Z% b; n6 T) h3 o  p# l* V/ ]+ |
  51. int main(void)
    6 p0 V  m7 z' M9 _9 D: A6 w
  52. {0 [* J- |6 K. B
  53.   /* USER CODE BEGIN 1 */8 {% g( [7 S- m, t* M) o6 X0 z
  54.   int i=0;
    1 D: V- m9 S# S" h
  55.   //int dir_flag = 0;         // 1正转,-1反转,0停止
    # X  b+ j+ p( \- U. |+ `
  56.   //int run_cnt=0
    ! T/ M' `5 v& D, X( }$ i

  57. ! ?/ i2 @& j  f! C& H
  58.   /* USER CODE END 1 */
    - u: R7 D5 g4 N8 |) n
  59. 6 K- N9 M0 Y  J% h
  60.   /* MCU Configuration----------------------------------------------------------*/
    4 b8 i$ \3 v' B9 f2 b# o" [
  61. $ Y( d; W" k$ i
  62.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    * ~" O- g. y& B( @1 n5 L, v
  63.   HAL_Init();. w# V4 N5 F2 o0 F3 K6 L( E
  64. + x- |2 b3 S% W1 a. F. ]
  65.   /* USER CODE BEGIN Init */
    ' F5 [4 N7 v: C* K5 U0 l8 q9 l

  66. ) c8 i4 a( @- S& y1 ^$ b
  67.   /* USER CODE END Init */- K! ?3 @1 V) p) `0 c3 V+ Q
  68. . I7 L& `* l# O7 n* Q, K6 M2 p4 R
  69.   /* Configure the system clock */' m7 H- c: L+ }
  70.   SystemClock_Config();
      J. [, `+ N0 e- k; v6 b% K

  71. 9 F. C- z, {+ P& s9 Y( n
  72.   /* USER CODE BEGIN SysInit */7 ^! b- g- O8 Q% m2 a. g

  73. 7 E& W+ f3 d$ N5 K. W% i. W
  74.   /* USER CODE END SysInit */9 x' G: r3 z% l! ~- ]0 E  D+ A: c

  75. 6 z6 O% @; o* m5 I3 J; b
  76.   /* Initialize all configured peripherals */
    4 K- v+ Q' C; W" F0 M
  77.   MX_GPIO_Init();
    + J3 _: D/ ?: z) f
  78.   MX_ADC1_Init();
    ( M$ p$ q; b: B) U/ p2 k% k+ v
  79.   MX_DAC_Init();
    / e$ d+ @  a) a$ e( _1 a7 K8 t
  80.   MX_TIM1_Init();
    - S! }4 X; Q/ Z+ C
  81.   MX_USART2_UART_Init();1 r3 M  }2 [0 O5 `1 I9 `5 P+ d+ b
  82.   MX_MotorControl_Init();
      ]) h) x; J8 U6 _: H' s

  83.   \; U1 e' b5 A7 V
  84.   /* Initialize interrupts */6 j: }; l5 W1 ~& l
  85.   MX_NVIC_Init();, Z$ L5 g; v2 G/ a, g  Z
  86.   /* USER CODE BEGIN 2 */
    ' k6 l' ^) ^6 @& N' V! V3 ^
  87.   MC_ProgramSpeedRampMotor1(3000/6,1000);
    4 [8 A) \8 z/ S+ Z  w* Z( g/ L
  88.    
    & M, l8 B4 p, }  k9 ]
  89.   /* USER CODE END 2 */. D; ~! ]6 e- z$ A9 z, w9 k
  90. - q( a2 Q1 a$ t- H& _
  91.   /* Infinite loop */
    / x$ u4 t5 S5 D- `9 }
  92.   /* USER CODE BEGIN WHILE */  7 H7 V$ y. k1 g& w* y
  93.   while (1). A  T1 y. _9 x7 E# R% l5 G( s
  94.   {
    $ M" Q" j9 Q& l
  95.   /* USER CODE END WHILE */6 ~$ {* Y1 T( ]! F
  96. , Q; q$ [7 e( _
  97.   /* USER CODE BEGIN 3 */
    2 ~6 J6 y% h) {' d$ G# R  b
  98.     , A7 {- @. ~9 W% L) N
  99.     switch (i)( {# i* S3 z- Q  E; ~- ^* S
  100.     {6 K/ F; r+ [% }( ^/ m+ C
  101.       case 0:: K4 E+ {) g* x% |; [
  102.         MC_StartMotor1();
    , t* ^+ _( s" Z3 z
  103.         break;
    $ O. A' ?% L# Z
  104.       case 10:, {3 ]$ Q; F8 s  ?
  105.         MC_StopMotor1();7 M* \- i0 _* h5 R' X7 m
  106.         break;  R6 L  Q& D! P: U- [
  107.       default:
    ) [; r9 `: i( n' e6 i9 s
  108.         break;! H5 h* R* N6 o  p4 l
  109.     }/ E& l6 m  `4 J4 ]% H2 N% n
  110.    
    ( n$ v( n1 O4 j* k# ?, M
  111.     i++;% H( }1 i0 ?8 A& m
  112.     i %= 15;    & ^/ @5 F* j- t# v2 Q7 Z7 c1 X4 `
  113.     HAL_Delay(2000);    //systick定时基准为500us,所以2000为1秒
    4 y& L& ~: s* l4 f2 \7 _* N8 A) a
  114.    
    * c; w5 Y4 f- r/ `7 u
  115.     HAL_GPIO_TogglePin(LED_Motor_GPIO_Port, LED_Motor_Pin);
      ~6 e1 M- r6 O  s
  116. 5 L, Y; a* z% Z( h6 I+ _
  117.   }
    % ]) `" h, i; v: e2 M
  118.   /* USER CODE END 3 */
    8 l2 J) R; X% x. z: |4 q" o8 s8 w

  119. - k9 B7 x& a+ o0 R3 l( x
  120. }
复制代码
8 n, H3 u& H: D9 w) ]3 j6 @
1 q9 B! \% D- Z
对于电机参数设置、启动、停止操作,还是比较简单的。这主要得力于ST的工程师,把大量繁杂的代码打包,给用户的就是非常明了的控制函数。$ ~( x9 ?# Y- Y0 z; A9 w) [  Q* P
  K. v* K$ H# Y
按照惯例,程序工程附上:
0 `+ A/ J& J' m 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工程文件的软件叫啥名啊
. u8 |- D% [1 |: M
七哥 回答时间:2018-11-14 00:04:19
本帖最后由 toofree 于 2018-11-14 00:05 编辑 * v9 W# E6 L& o
惜缘1 发表于 2018-11-13 23:16
# t0 i5 v0 B# S; P3 v% L自动生成IAR工程文件的软件叫啥名啊

4 _+ f( Y# P  m$ ~" Q6 @  Cstm32cubemx 20181114000527.jpg ; R8 W1 B, e* L2 }$ R& \" G5 G
瞻_ 回答时间:2019-7-2 10:44:46
好资料,非常感谢!
byronsong 回答时间:2019-7-2 10:47:01
) L6 O" @+ `. \+ k$ O
好资料,非常感谢!
byronsong 回答时间:2019-7-2 10:47:17

; E& t1 R: H, s# ~3 M, M好资料,非常感谢!

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版