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

【STM32电机培训】- 基于MC SDK5.0 API速度控制与电机启动停止

[复制链接]
TLLED 发布时间:2018-8-30 21:33
     培训手册里 实验2:基于MC SDK5.0 API速度控制与电机启动停止。1、实验2内容:
& K; U7 Y* i2 A  y2 u( Z: i$ w: U    1.png : i$ C! ?! }9 Z6 l1 o& ?  }
2.png
/ l; m& i/ E; ?+ z. p* p1 V" x" y* e- \2 T; A. i

2 F) O# Z8 u! M: G4 t2、程序代码,在上篇实现的代码的基础上,修改代码如下:
2 J; A. P3 A6 t- O$ Cmain.c程序里面添加内容6 f) O/ N+ K) s0 K. v( y* f
//-----------------------------, E4 X; M* D( w) D) e/ H( R
//定义变量) r# J+ y9 l7 M3 ^! J
/* USER CODE BEGIN PV */$ Y) s( _7 H3 k7 T4 `- r
/* Private variables ---------------------------------------------------------*/+ m$ S* S3 e$ y/ W% T. }' c: L. [
  static uint32_t  delay_cnt=0;                  //延时计数   - U% j  c/ h, d; p6 K3 @. E
  static uint32_t  delay_cnt1=0;0 a, G8 r: H$ ]; o, P/ {& A, t
  static uint8_t  delay_start_flag=0x30;     //延时启动标志位
) `" R- U3 T; x0 u% H* w3 S" l" o  static uint8_t  delay_5s_flag=0;              //5s时间到标志位- L. ^' `1 A: Q7 d  F  g0 S
  static uint8_t  delay_10s_flag=0;            //10s时间到标志位
' t( ~7 E; _7 ?/ ~/ N& Q& o4 q0 I! z/* USER CODE END PV */
% ~1 P% m$ l' k  }3 I8 a! ^
0 C' P% Z- z# i9 v0 [+ B//函数定义
; e+ v) w0 g0 V8 R: s/* USER CODE BEGIN 0 */0 p9 x% N7 I7 Q
//定时器处理. k' V+ P& u6 A" E  t: {1 V
void Delay_Handler(void)
- ~3 k/ o9 v0 ]( K: F5 H& ^{
, Y( a! ~/ H3 D* V/ H  delay_cnt++;
) A8 x( ]0 X* l( ]1 U5 p6 D4 c  if(delay_cnt>2000)          //1s计时% g/ q' F8 i; C0 S2 p/ O, O
    {# J& [2 p  V( p5 t, w& ~1 k
      delay_cnt=0;: L- k7 O9 N$ {9 K  P7 }$ m$ K" W
      HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9);   //定义示波器看时引脚( d1 u2 m  W! n# g
      //----------------------------------------) T- N3 }- F9 h* g2 L1 C+ s
      if(delay_start_flag==0x30)          //启动10s计时
" U! n' ]) q' h4 b& g      {) h7 t& U* i4 k& {# C9 N
        delay_cnt1++;7 R' h7 E( B' o2 M
        if(delay_cnt1>9)          //10S* e) g3 @$ ?$ ^3 s1 i2 t3 i
        {6 @( \' h* f- n; {! J0 V8 x) R
          delay_cnt1=0;
2 l7 C0 v7 \" |( ?          delay_start_flag=0x20;   
0 V8 W* |8 R" W4 Z- U- p, t$ R8 u          delay_10s_flag=1;     //10S时间到标志位
& z3 b. \0 h7 {' U8 f        }
7 V; [) q$ D  j' W      }
& ?0 Y9 A* t, N/ Q      else if(delay_start_flag==0x20)    //启动5s计时9 R: ^( q, I; {; S/ o
      {1 [) n7 a) |* g1 K
        delay_cnt1++;  d' n) }: o' ^
        if(delay_cnt1>4)           //5S2 w) R5 R5 j& I7 c
        {: y0 N5 y& `$ t( a0 B5 ^
          delay_cnt1=0;) ?' M) w7 }  J
          delay_start_flag=0x30;
9 b1 K( H/ B  [: F% f0 L7 i9 X& p          delay_5s_flag=1;   //5S时间到标志位2 P: b% z  B" g, ?* {$ o
        }
6 U! j# v) E5 t& s: U+ B      }  
& ?9 E% ^" [( ~  f    }
0 b* s! a8 P& v, t. H: h}8 D' z* p3 [, A6 a2 b2 x

5 @, d* {7 c- w$ v5 Fint main(void)
4 U/ s; X) s) U/ H{( c- ~) F: }2 q$ X
  /* USER CODE BEGIN 1 */
8 r8 w" j% E) D& R
# z8 |: h" \& ?4 C4 q

2 C8 o6 a7 t/ h7 l/ L; X* N  /* USER CODE END 1 */. q, I4 Y- O' ~' }6 f
* N$ b, ~9 _8 \  q1 ?+ ^2 _

, }  ~! e7 k  s1 T" A+ J  /* MCU Configuration----------------------------------------------------------*/
3 M4 R. B+ H5 |1 d, C9 V6 o8 y( j$ `: g& j$ y9 q1 S
* b  f. O( {& R& r8 {
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. *// w, u( A$ p' D6 ^4 e
  HAL_Init();
# T2 t& |1 r7 H6 Q2 m) \# @( n( l  M/ K/ g' y
2 j& J! `- P  I" u0 t; f+ [3 J
  /* USER CODE BEGIN Init */1 `7 {9 }" ~  P: f
! ]+ B# g1 k( }5 y# j# C
! n+ e1 F! R8 V  _% m
  /* USER CODE END Init */
3 o! k; r4 i" ^* W1 y/ i; S& @  ^) l5 c" w( ^' U  Z
; @& z* ~, M; h  A/ ]0 O4 I
  /* Configure the system clock */# c/ a6 H& X2 P' D+ E7 P2 V0 ^; o
  SystemClock_Config();0 x; ]: b' w! f8 s: u

/ }8 c! e' R1 M

: [4 g* ^9 D( Y6 _; D% e  /* USER CODE BEGIN SysInit */
5 A  @( S: J& h7 H: c8 I4 q% s' I: _9 E$ g( E3 J  @9 j
8 [( I! q$ W- L. ^* H
  /* USER CODE END SysInit */. ?1 q0 `" B- J' v( L

8 \2 U2 s" {7 I+ a; N2 y& l

+ f" t5 G7 g7 H; R( u; Q  /* Initialize all configured peripherals */) s; e" O. r2 U" U; C% T6 F
  MX_GPIO_Init();8 U4 t4 w* ^# @
  MX_ADC1_Init();1 j' Z2 z. Z% ^" k
  MX_DAC_Init();- ^; `+ I, ]2 j3 ?+ n- U9 I
  MX_TIM1_Init();4 J+ Q8 G( z1 \7 _) Z2 X, C
  MX_USART2_UART_Init();
! q% z6 @1 L! J4 p$ R& r" i% ]  MX_MotorControl_Init();
$ A' S6 ?2 k8 K6 x
  d3 J& e5 S8 S. M4 N

/ G  z- B. r  h* \; \1 T% \  /* Initialize interrupts */
* L7 G4 l- n$ d2 h! S' B  MX_NVIC_Init();2 }4 E) `+ I8 D+ O! H% x0 F
  /* USER CODE BEGIN 2 */
+ W6 Y7 q5 Z% }/ L! o& `* N MC_StartMotor1();      //启动电机
7 \  o, E/ ?+ I9 t4 Q  MC_ProgramSpeedRampMotor1(3000/6,1000);    //1s内加速到3000RPM6 g, d8 q! w+ Y5 Y; c! s
8 ?) w/ c" o' c3 h  [
& {( E3 ^+ M/ O; P/ {" z
  /* USER CODE END 2 */
7 W/ D+ l( U1 m( N* ^
9 e/ Y8 G0 K0 l# s8 i  s

( R0 [) M: [8 x9 v+ }7 Y* M  /* Infinite loop */" x; F, b" c- A+ G% v7 ~# u
  /* USER CODE BEGIN WHILE */
, J4 |  S2 `" \0 ]7 [$ @  I  while (1)
3 y  V/ U9 E) f3 n& ~9 ^& J  {) J" J3 g4 ?: k% X+ u* p& D

5 n* x! e3 ]. ~, `, M/ Q

8 ?/ i$ H- R* D# F  /* USER CODE END WHILE */  S1 W4 K3 b- u9 v5 V

6 A6 S1 j+ M; Z. \
4 F; t1 A' N: q$ E+ N! f$ Z* A
  /* USER CODE BEGIN 3 */
# I1 O5 \2 O( s# _2 g    if(delay_10s_flag==1)     //10S
1 c/ _1 E+ j9 I9 r4 V) \1 |    {; `& T$ y6 V& f  M
      MC_StopMotor1();         //停止电机运行; z% k; K# d- R9 I* b# E/ A
      delay_10s_flag=0;- _% p! N, F6 k# N: N: a9 z
    }
: G0 C( ^; W- A8 m* d; a    if(delay_5s_flag==1)     //5S5 h  h; j  u4 M. H
    {
" w$ Z) i& n8 ]9 t$ q      MC_StartMotor1();$ U: e7 }7 K9 I) F4 c1 |
      delay_5s_flag=0;' E% C$ D( l8 Q/ Y3 f  q
    }' j# q1 q" E" j! d

9 J3 @' Q! _8 G. u3 G! l0 Y1 v# y

' u: ^( M+ A* s  }
# {0 \6 }% U) G5 d! i( U  /* USER CODE END 3 */& p( `9 V" R( \1 z" X
7 D3 z& ~7 Z) H
# w+ w: H+ ?! C9 N2 n/ i7 R: G
}
' {; |. B& c; F7 X9 c2 D
! z2 D( ]2 m, E6 H
9 t1 y6 o" o5 U* A* u& m

5 _5 Y- _; S6 N5 s; l, }7 @7 [/* USER CODE END 0 */
# a" Q! i+ A) C$ X0 _2 d
* q3 W1 ]: A2 v/ o$ ~7 y
( M3 Y1 U* m0 E
' h5 O. ~$ \/ G- k* V* Q

3 K6 w8 |+ H: w- ~" q
5 Z6 W9 F( K; e2 z9 M
stm32f30x_mc_it.c 程序里面添加内容:
9 Y) [, {9 o1 i4 w6 S% @) Y8 ?在滴答定时中断程序里面调用定义的函数8 ]" q1 {  w% n
void SysTick_Handler(void)  W! r3 z% o: x
{$ o4 H- P8 `6 a. Q
#ifdef MC_HAL_IS_USED
* S: n* W1 O5 G' H, gstatic uint8_t SystickDividerCounter = SYSTICK_DIVIDER;
% Q* I: s- W6 M" ]  /* USER CODE BEGIN SysTick_IRQn 0 */9 ?( l' g, f) o; r, F) c2 F

& Q$ w8 O6 ~* Y' p
/ [* P7 b' Z2 o4 O; q
  /* USER CODE END SysTick_IRQn 0 */" u  B& q7 _2 x3 H. A5 D; u
  if (SystickDividerCounter == SYSTICK_DIVIDER)# @. S! {" Y) V% z4 I0 l  J) j
  {
7 G$ Y6 G& W" B. v0 W, `    HAL_IncTick();% [( l# V) J/ w
    HAL_SYSTICK_IRQHandler();$ @7 }; A5 k0 n3 f; c
    SystickDividerCounter = 0;
9 N" d: T7 K7 ?9 U; h: G! M4 ?  }* H( F6 k- w- K; A
  SystickDividerCounter ++;  + R: W& }8 }" ?& h! c
#endif /* MC_HAL_IS_USED */+ s: Q$ r$ X' L9 _$ s4 r
3 d% W9 S7 d3 d8 k7 S; j  M

" s! Q; P% U7 S, ]6 {) u  /* USER CODE BEGIN SysTick_IRQn 1 *// Q' o6 Z8 S9 b  W3 ^" `- c$ y
  /* USER CODE END SysTick_IRQn 1 */
; o0 C2 K' c6 T+ l  l$ m# C! _    MC_RunMotorControlTasks();
. ~0 A. I7 Y, w  /* USER CODE BEGIN SysTick_IRQn 2 */
+ S* e5 ]1 N8 r% T    Delay_Handler();1 m& Q$ ~8 p7 V! M8 D& R; }
  /* USER CODE END SysTick_IRQn 2 */2 x* \$ t% m. a3 p" M  J
}: S6 f8 m% E2 g+ Y! [! `$ ]# \6 X

" z, |( d8 o* d, f9 U( q* t7 p0 ]: P1 z# _. }- l: w
. y% ]; z5 @5 h4 E5 A* n+ Q  A5 S
3、测试波形:$ f% V, u/ z; @6 z0 z. o3 I
在程序定义PC9为输出,观察滴答定时器的定时时间,滴答定时器的时间周期为0.5us ,程序处理后变成1s定时周期:
" Z4 j2 `. x2 @+ ]0 v 3.jpg
1 X' w1 R$ B% M% H! A
' W" D% E7 b7 d4 o5 a' ^) M

& i9 p( ^0 I# K监控电机运行的图片:
1 E& @, {* I6 I 4.png
2 X- o1 d* ]+ T/ D  C4 p5 V5 `' Y1 t6 Q 5.png 3 A( N. E) X/ P1 q

; i$ o: [$ i. D1 y% V% y$ W
( T" |8 }! B' X. r: b3 u
% K; T0 B8 k4 C$ e! i
3 i! H) U+ k- U5 \
7 z$ n. l# `5 n8 q3 K; x# h. _
, d7 l& C9 D- Z; q/ i

' |9 X0 ]$ Z' @8 Q$ S' X9 \
( {0 Z9 A3 U# }1 B- J$ x
; F" x7 g' ]! a- O+ c
* v& F7 x' ]8 _( ^& ]

# ?# u3 h* s3 W; Q( [- J2 ?. [

2 n) b: d8 w0 s: r& P  V/ o
0 W# T; o5 M" a6 T9 [6 V3 p( V
$ M9 W) L% C$ S. L5 f  b% \9 G5 ~
     % j& B' T- S& F: {+ N
4 t9 `/ f. e3 D5 ^7 }# \4 ?# r
赞 收藏 1 评论4 发布时间:2018-8-30 21:33

举报

4个回答
子曰好人 回答时间:2018-8-30 22:44:19
延时程序值得参考,不阻塞其他任务进行,不错的想法,点个赞
zhdzhd 回答时间:2018-8-30 23:00:45
向大神学习,思路不错。
TLLED 回答时间:2018-8-31 08:32:30
zhdzhd-174422 发表于 2018-8-30 23:00) O' g# o( L; u9 N' O
向大神学习,思路不错。
6 v! A# w& a! E; t
共同学习
wolfgang 回答时间:2018-8-31 16:00:08
按照此想法,还有其他方法观察嘀嗒计时器的方法~~
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版