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

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

[复制链接]
TLLED 发布时间:2018-8-30 21:33
     培训手册里 实验2:基于MC SDK5.0 API速度控制与电机启动停止。1、实验2内容:: z0 J. ~+ Y6 |; o% h. ^
    1.png " _* p! q: m" H( P  [* h1 ^
2.png - R! N$ y3 q; _4 E

; W' c. z2 J. u% Z

# O8 V% ?/ h- Y9 \2、程序代码,在上篇实现的代码的基础上,修改代码如下:
+ t  O( K4 q( i4 _. ~+ I, Smain.c程序里面添加内容
, t, q+ n: \1 j$ I" U//-----------------------------
2 j3 l, b7 N7 a7 j- w5 B//定义变量3 c$ `! y6 X4 O! I- ~# w0 M' N5 u
/* USER CODE BEGIN PV */& O+ F6 |, x, ?1 G
/* Private variables ---------------------------------------------------------*/
: `0 m: V8 I9 r  B8 D  static uint32_t  delay_cnt=0;                  //延时计数   7 F. T1 J. W! I% C" G
  static uint32_t  delay_cnt1=0;
5 d& A( n$ N8 R* c; i/ {5 u  H  static uint8_t  delay_start_flag=0x30;     //延时启动标志位$ ?7 V% Q( B8 ?
  static uint8_t  delay_5s_flag=0;              //5s时间到标志位
8 X" t/ z* Z# x( i7 Z6 j  static uint8_t  delay_10s_flag=0;            //10s时间到标志位
3 V1 g( r0 \/ Q" o) Q/* USER CODE END PV */
! L+ P  w4 y6 S, m7 X3 ~4 i
4 H# o/ S" v- N& Q/ L) X//函数定义
, k, ~( i, W% D6 {6 F/* USER CODE BEGIN 0 */
6 }9 l! A; u* k" t% S0 `( _3 t//定时器处理/ I1 e+ `' j. _- k1 j6 u
void Delay_Handler(void)
9 Q8 D) c# s5 v  O0 R& {* o+ |{
# ]9 w( u& U% W* H# }, U  delay_cnt++;
. ]% _% T: G. H  if(delay_cnt>2000)          //1s计时& K7 A6 c' }, ]/ X" s
    {* K* _* \8 @6 `
      delay_cnt=0;7 G* T# L1 @" M4 c5 z* C0 l* Y$ g
      HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9);   //定义示波器看时引脚1 d, _$ q) @; y0 B. ?2 R/ t, f- r
      //----------------------------------------
* |% h3 f( w/ V; C9 ~- q; V" R      if(delay_start_flag==0x30)          //启动10s计时
+ u$ R* j8 J* E! _      {
/ L2 A- g! E( z( T) u4 B. Q' C        delay_cnt1++;
3 T1 F8 w: J& P6 R6 w. I        if(delay_cnt1>9)          //10S
/ u$ D4 i6 Y* `; {$ l# ^' q% G) v        {( H: v4 t, L; R% V5 i4 P2 e8 L
          delay_cnt1=0;
7 r7 @2 ]# H8 P8 U          delay_start_flag=0x20;    / g' U9 b* y  h* l+ `2 D
          delay_10s_flag=1;     //10S时间到标志位1 \# g* u& z1 A# h% G: y, V  `6 v! x
        } 8 C! b1 f! T. P$ e9 J0 ^5 R" u
      }8 d' M: O4 b. n2 R& ?
      else if(delay_start_flag==0x20)    //启动5s计时( ]2 Q. P5 I% F- F' U! z* e" w$ b
      {
4 W" v  W' e# I7 `( I        delay_cnt1++;
0 u- X& j. J" @) J) }        if(delay_cnt1>4)           //5S
; v+ }9 r/ q2 M/ v* I2 N        {1 M$ J( `0 r3 w
          delay_cnt1=0;! B" |( g2 s' W  H( s
          delay_start_flag=0x30;
; K+ f% w' x- l7 j0 N  `          delay_5s_flag=1;   //5S时间到标志位6 R/ d. h3 z* d( {$ `# P4 F
        }! v! o) h* x6 p* ^: }% ^# Q5 n
      }  
' y, M! R; B1 d- h    }
2 h' B8 T, _: u/ [: c! F5 k}
- Y0 H7 T, x$ E3 g* t7 U. G9 G9 f7 f! @. E/ C6 C/ N% x$ o% J7 U- Z+ y
int main(void)* J# T& {1 O1 L# B& o" O; f8 L. g
{$ s6 E4 z6 f: j& b5 s1 x
  /* USER CODE BEGIN 1 */
3 S; L) c. Q% w0 T8 l6 B  q6 P0 a

  L: I# U# U" X& K5 J4 Y6 M  /* USER CODE END 1 *// o+ c' L3 h6 I3 n" ~

: I5 Q8 h6 j6 A: q+ T
5 T1 V2 J2 e  Q' N- a6 Z& ^
  /* MCU Configuration----------------------------------------------------------*/) Z7 y8 \: Q& D5 G) G! X

2 }" k; c& B: U% A# Z: b9 G
8 v$ r0 n4 Y+ D* ]
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
, P" ]) Y' m: k; }  HAL_Init();
5 s5 V" h) S: O# H; ?' l+ Z5 l) @% ^9 r; l2 `- w
. U  i6 C9 f, U: I
  /* USER CODE BEGIN Init */0 |8 m$ u- F2 X  }( v5 R  G% z

# s3 ?4 Y8 ~+ b$ C4 n- D: _

0 Z2 Z7 Q! a! @( w  /* USER CODE END Init */
0 g0 Z7 j- s, M9 C5 _' J) Y. @1 e7 U$ ~& r$ S. _/ ^6 y
# I  H: O4 _+ [6 f; {1 h
  /* Configure the system clock */% A( ?( j9 o( p7 }8 X1 ]
  SystemClock_Config();7 B/ ?: `& {6 q
# q; L  m2 x* _( t7 h
! G: q! z4 Z& O' B
  /* USER CODE BEGIN SysInit */
+ K0 Y( j1 V" e1 j- q
) J$ M3 r- M$ d' p
- ?0 ^; O9 V: S3 }, U# F
  /* USER CODE END SysInit */
! v2 n( `. g6 F9 Y, C
0 o+ }1 v. S0 \* B$ _

% ]$ b1 H9 V) ~+ J3 }, C2 K  /* Initialize all configured peripherals */) O8 H) F8 x% R& P. M% z
  MX_GPIO_Init();
  {2 y+ O' C/ l! v/ ?  MX_ADC1_Init();0 j# S7 H* o' V0 m9 K/ Z) ~
  MX_DAC_Init();
6 r5 ^; B5 @* ]( H; F9 `6 k+ j, E% {  MX_TIM1_Init();" k4 o9 y% s2 y, S
  MX_USART2_UART_Init();  x% H5 P) v; _
  MX_MotorControl_Init();$ i, w4 Q8 i- G/ _* A( I" u
( V0 T( d, C: {$ S8 _6 f
8 }! I: I4 `. W& b( D$ K( z. k
  /* Initialize interrupts */
$ ]& v- T. ?1 v( `' J/ Y, s  MX_NVIC_Init();
( u& t3 V- c! A( ]- a2 t  /* USER CODE BEGIN 2 */  d& C/ z  I& J
MC_StartMotor1();      //启动电机
- L# R* n& h+ N2 [; W9 j/ R0 E  MC_ProgramSpeedRampMotor1(3000/6,1000);    //1s内加速到3000RPM0 y8 S1 f! ^4 P! X- e

/ I( H: A9 Z% [
/ _( [2 l8 a& I$ J
  /* USER CODE END 2 */% H/ D( O/ `( p9 ?5 L. ?; C. J
9 q, y$ x" R) J
9 X/ C2 S+ e* `# n/ q( \; y
  /* Infinite loop */
9 H: @, S$ B' T1 C3 d  /* USER CODE BEGIN WHILE */4 M5 B! u. W2 W% k' K5 @3 |- o
  while (1): y! |" e+ I" ^* s6 E4 J3 d
  {
7 d1 L' L$ F. ?* Q4 D. E+ ~7 f: U; L1 j$ [
4 N: }. @. w6 q1 ]- r
  /* USER CODE END WHILE */
2 G  Q; ]  u- x* |% Q1 Z$ j- W" X2 k

: d. G# l. @' f, u9 N  /* USER CODE BEGIN 3 */
* s" M3 t* w- U; U. d8 j    if(delay_10s_flag==1)     //10S
7 u; _1 |5 s: F- `1 `( e    {6 B* S4 l- Q& S2 E6 F
      MC_StopMotor1();         //停止电机运行2 x3 P; L$ J" M1 D9 d: T, d# A5 s
      delay_10s_flag=0;
2 V* X( B9 u) W1 O5 A    }) S' H) T. c2 ?* E
    if(delay_5s_flag==1)     //5S6 d/ e2 ^( N0 t: g/ h0 ?& a
    {! V. c% }8 }. b; _
      MC_StartMotor1();# `) o9 k  i9 Y, h' r; m' r. {
      delay_5s_flag=0;3 Q, D3 o+ G- `3 Y9 y5 S
    }
  H' a7 V7 V2 m4 j# E5 a: Y2 T6 A& T, E$ V, x9 n5 z
/ m9 ~) C/ E9 P5 g0 D; ~
  }
; x! z$ q8 o: q9 |  /* USER CODE END 3 */  a$ j+ i1 ~$ [5 k) f% _! p- x
- r! ]# @! T& l2 V& M# x
3 |4 L# n6 P9 D$ l/ H
}, m& G+ y. ^; ]) t5 D6 T

7 V$ i6 ]) G. |, }( b4 r# i9 M( K& P" F+ f$ `8 U

* p2 X% i" y7 U* s2 E. j  K. A/* USER CODE END 0 */
4 U8 [! m! t5 y+ B/ A3 {' X/ Z" {1 r+ L  e2 X

! _7 _1 {: |3 [: p$ h/ \
9 J, s, _3 \4 I
9 x  @: N& f& d7 }" J2 l# G7 v4 g+ F
" F8 M. o# o% t1 C& \7 |3 I8 H
stm32f30x_mc_it.c 程序里面添加内容:
  y; S4 E/ {& {3 K8 }在滴答定时中断程序里面调用定义的函数5 u) G" {1 G' g0 [. K
void SysTick_Handler(void)
  G) \* y* K- ~) }3 z{( z/ X. a" z1 n6 S
#ifdef MC_HAL_IS_USED0 G3 ]( l$ E( B" S( A+ C+ _3 T. }5 {1 C0 Z
static uint8_t SystickDividerCounter = SYSTICK_DIVIDER;9 @- R* Z7 V" y6 X5 i
  /* USER CODE BEGIN SysTick_IRQn 0 */7 e/ a9 E& B/ Q: @
. T5 J) C! H0 b( y, O

2 K: Y3 b  U( U* \  /* USER CODE END SysTick_IRQn 0 */
3 J4 @4 y0 p- ~  if (SystickDividerCounter == SYSTICK_DIVIDER)
+ e4 q. A; E; c" F6 \$ e. n( e! j  {  {" w! n9 s3 \& A% _% E
    HAL_IncTick();
2 q& a# R5 M' z. t2 y! o    HAL_SYSTICK_IRQHandler();: H" j5 z1 Z1 }; s6 a7 q, f9 P
    SystickDividerCounter = 0;3 r9 e) X" |3 {6 t% }! g8 e: H
  }
9 R6 b: x+ P7 r8 P/ ]  SystickDividerCounter ++;  
, ]/ e. b  B5 v) J' |3 j* `2 [; A#endif /* MC_HAL_IS_USED */! p& j. D& c8 q6 E8 D, F
/ t& }; N7 B" [( C! G5 c

* ^- e0 {) V# _6 f+ V  /* USER CODE BEGIN SysTick_IRQn 1 */
9 L+ z' V& a$ _  l$ m  /* USER CODE END SysTick_IRQn 1 */7 I/ J; D( p" ^, [+ O& a0 h
    MC_RunMotorControlTasks();2 v% D! W" v: Z
  /* USER CODE BEGIN SysTick_IRQn 2 */+ c! L2 Y+ g( q) a5 a8 T/ R) B
    Delay_Handler();
2 V* m) M2 B4 i) M4 Y9 P  /* USER CODE END SysTick_IRQn 2 */3 q0 f+ W6 A3 k; D7 ~9 `
}: v$ x/ Y  {$ ~! h% A
4 k5 Y0 |7 `0 N7 h8 @0 k0 R
% _! _' A$ j  Q) v- A1 b9 c( y
/ L1 G- T6 M, T, h8 X1 C2 ~. S
3、测试波形:- s% Y. @* C0 j8 f
在程序定义PC9为输出,观察滴答定时器的定时时间,滴答定时器的时间周期为0.5us ,程序处理后变成1s定时周期:
9 i- p+ L' h6 D& O 3.jpg
9 w' \! J5 a3 i/ e+ u* i
7 L5 f1 }8 q. W- h

# m9 z; v' s+ V- }% p监控电机运行的图片:
7 r% Z' B9 O; E7 w: u! A; { 4.png + x. X* {( z' l- s) z8 W% y1 f
5.png 2 r; w- Q) H5 ]/ |& O. W

5 T7 b1 t# W4 Z  e. n) j8 i$ a
/ t9 h1 ~; n  g- L7 w3 o+ R+ ^3 G

$ s  h" l1 p3 S) e3 V
' U: U1 }! R* c) R

0 B) u  |9 D: S4 i( V7 m) i$ g
; O$ K8 T+ j5 y: U2 j0 k

/ Y% M, f1 z3 q- C! U- i  t5 `
+ s. @" C. A2 z5 {: S: \. z  C

" U) m% W  E6 D: q
6 M3 u7 M- \# ~0 @$ v0 F6 A

) T5 ?/ [# Z2 i* c8 I. Q8 e% \
6 Y' S5 b6 c/ s0 ?9 ^* x; t

2 k( w9 K( h4 Y- q: o8 A" L

" \5 K0 O  A* c3 p6 v% T- m     
% e0 _) w1 _5 n7 u$ Y: k/ D
* L; {8 {( T1 g6 ^% Z! Q; V
收藏 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% w+ z4 D% p2 k6 ^/ C# D! r向大神学习,思路不错。
4 `+ G8 x2 j9 E$ A
共同学习
wolfgang 回答时间:2018-8-31 16:00:08
按照此想法,还有其他方法观察嘀嗒计时器的方法~~

所属标签

相似分享

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