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

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

[复制链接]
TLLED 发布时间:2018-8-30 21:33
     培训手册里 实验2:基于MC SDK5.0 API速度控制与电机启动停止。1、实验2内容:. Z, e3 y+ }9 y3 `
    1.png
) r9 \) p' T3 x  w" c+ f8 T. l 2.png * f2 y2 C9 V& {: k  j$ ~
# P' d0 \! j  x0 A% m' f% ~
6 y9 F8 R7 z' w5 n# b
2、程序代码,在上篇实现的代码的基础上,修改代码如下:! O# L* i) _- u# S2 s9 Z+ u1 h
main.c程序里面添加内容
( F: K, [# w- K; w) O  Q//-----------------------------
/ `% F) M; ?; e//定义变量- ]  a' m% w8 }" m1 q
/* USER CODE BEGIN PV */1 E7 I, i: U; M% b. f
/* Private variables ---------------------------------------------------------*/) y) L0 P& k2 H1 j
  static uint32_t  delay_cnt=0;                  //延时计数   # f5 b% z$ `+ p
  static uint32_t  delay_cnt1=0;
0 U4 O( \) e# w. u  static uint8_t  delay_start_flag=0x30;     //延时启动标志位
6 \+ y* f, Z) J) m. o# b: }  static uint8_t  delay_5s_flag=0;              //5s时间到标志位
( z# v* b% z# ?8 }, G& U, R  static uint8_t  delay_10s_flag=0;            //10s时间到标志位
: r! W/ ]: B) T0 P& h4 b# w0 d/* USER CODE END PV */
  M' p' k, `' Q2 _/ A- e9 Z
  ]( \3 o! c2 k" z# H//函数定义2 X& t$ q. l/ d$ T( p
/* USER CODE BEGIN 0 */
+ E9 a& O2 r3 W7 k: j//定时器处理' K2 X& [' o2 ~" F
void Delay_Handler(void)
4 }5 J  {6 H7 [9 Z" c6 W" k{4 q2 K2 P% |5 |6 m7 K
  delay_cnt++;
8 K( P# V* `3 e( s! Q; D+ `! D  if(delay_cnt>2000)          //1s计时
& z" s2 Y- r, f3 c# _9 b    {
+ H+ S$ X8 O6 L) Y! v& m4 q; C      delay_cnt=0;
1 P9 I6 A! D& W% h/ w      HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9);   //定义示波器看时引脚. L  g5 V' W8 }7 `$ n2 H0 E& g2 e
      //----------------------------------------8 M. ]' j9 ?  [% E) l
      if(delay_start_flag==0x30)          //启动10s计时
) R0 |$ `, Z$ c) N/ w) M# J  _% B% u9 o2 r      {' v" k" x7 r8 T2 J8 R  V6 c
        delay_cnt1++;2 E5 J5 i6 B6 \- s+ V3 F1 u. ^; F1 j
        if(delay_cnt1>9)          //10S4 ]$ V- {+ A& _5 S; D1 \9 ]& `
        {0 i' L: J3 {2 f( Y
          delay_cnt1=0;, C: T: e: T6 r7 x+ Y( x
          delay_start_flag=0x20;    : W- C  V% \4 D. I
          delay_10s_flag=1;     //10S时间到标志位' H5 E6 \* W' V1 g/ U0 {" x
        } 6 t/ ^& c7 p3 A' N0 N1 _+ W8 U
      }
/ t$ M4 A- q/ _0 F1 z3 H5 k      else if(delay_start_flag==0x20)    //启动5s计时' F2 x& {2 o( }5 [8 Q$ s( w
      {
2 D- i% m7 N0 U1 K4 ?7 ^        delay_cnt1++;
$ n  C9 |8 d4 J/ }# }; E        if(delay_cnt1>4)           //5S
% G, A+ _  Y( _! H6 J& t  n        {( }- E9 N* @& w5 s
          delay_cnt1=0;
6 r+ G+ Q) v8 R, L3 C4 G/ v1 f          delay_start_flag=0x30;  t: S$ W$ I- g0 ?; u4 S1 H
          delay_5s_flag=1;   //5S时间到标志位
; W, H  t! D; t6 q* q  K2 `        }
( I1 ]5 T2 W* v1 T      }  , x. I1 }9 r8 i3 n1 c  w5 b
    }
. z6 s& l, t+ C) h2 n0 F/ U4 k}) _) D& g2 d) F. f1 c* W; C0 h
5 _4 u+ _) h: g# }( Y0 Z. ~5 z. y
int main(void)
9 Y5 H( _6 }6 F, K$ X3 f{9 j0 H& m9 M% s- O! ?. o" z
  /* USER CODE BEGIN 1 */, G$ ?- o/ n0 x  n

# q; ^9 N& S+ `; s* \  T' C$ N6 y) \

% a" G# `& \; D& `  R$ c; j  /* USER CODE END 1 */# r( P$ K. ]+ I: Z0 A+ g
/ j* E4 P8 w/ n  ]

' _" m& p! @% p+ y+ p( g7 _  /* MCU Configuration----------------------------------------------------------*/6 M% }8 z. |$ H9 e

& h" ]) N3 t. S% V: D+ S( _% Q9 ]

) Y% t, ^  d$ N# j% _  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
% r" T" `6 T6 U5 ^/ X! X  HAL_Init();
% W2 \( k6 i3 h7 _; `
) [0 T$ m& z4 o; _% V! Z: L7 m- Q
1 ^1 P0 i4 l( z/ K: ]) u
  /* USER CODE BEGIN Init */  T+ p( n2 ^3 Y! j; X! F

. S$ p2 ~9 i  i3 T5 t- u; Q. G2 U
/ o& J$ G1 s7 r) {
  /* USER CODE END Init */) I4 \* G5 f# I+ M7 V

% b' P' i5 l/ u# E5 Q
' V& l( o& x  T$ |
  /* Configure the system clock */
& q, k7 @* b7 ^3 O  SystemClock_Config();  B* j( T9 O7 w, N

4 V& I" g' R4 W5 @) S/ j

' n+ o! z1 u, I  /* USER CODE BEGIN SysInit */
) ]- I9 p: r/ p0 J! \: v1 R8 H& S8 s! p& n, B/ R- X3 l, e
5 T( ~9 w* [: F0 ]
  /* USER CODE END SysInit */
* N2 \8 I" M& H' N
# b4 X# _# Z! O. d  c
# Q1 @9 ~+ O% Q% d" [
  /* Initialize all configured peripherals */# j9 O9 m/ }( y% e8 j' ^
  MX_GPIO_Init();0 c) N. Y; |7 @, \1 b6 `( Q/ u3 \8 c
  MX_ADC1_Init();
3 h0 W9 P& ?" w) e7 F: _  MX_DAC_Init();) E6 L" x2 v5 M/ y
  MX_TIM1_Init();
0 Z; Y( [. r( J/ |2 ~  MX_USART2_UART_Init();0 s  U, b/ h: D( ?& C" z4 H# }
  MX_MotorControl_Init();* W+ Y+ H3 S- S) @0 e
1 S$ S; S0 ~2 ]( ~. Z
7 L+ z, R" K! X- @/ i
  /* Initialize interrupts */1 T! A' V3 @8 x- w  \
  MX_NVIC_Init();
. k; I* e: T( m! v  /* USER CODE BEGIN 2 */
% B! }& @! v4 n% v' a* W# `2 H  ? MC_StartMotor1();      //启动电机) e3 A& ]; c2 p
  MC_ProgramSpeedRampMotor1(3000/6,1000);    //1s内加速到3000RPM$ `) T7 b/ L9 D8 V6 v) b% ]1 c" o
) \" ?$ U! B: c/ g4 }

# p5 n* F" m  u3 [# Z  /* USER CODE END 2 */
; M% t: j% Y0 n4 ]/ s  X7 O5 a, |: k& J

8 h5 y. z. V( s# {  /* Infinite loop */4 r3 Q( @7 g8 F: @) f' c
  /* USER CODE BEGIN WHILE */
' G" w  Z; Z# m. R, c  while (1)
* \& H* k* T7 ~% k+ `' ]+ Q  {1 c# l' _; G; B

0 X7 h* \7 d( P2 s' ^' w8 \

! o3 S4 e$ d( w5 U4 T  /* USER CODE END WHILE */
2 Z2 f) ?/ b% @# t3 p+ C  ~1 c9 u' W, |$ s
* ^( C' T& z, @$ C
  /* USER CODE BEGIN 3 */& E# M5 ~! P$ _% U" ~0 i
    if(delay_10s_flag==1)     //10S* E* f* M/ A! {
    {
' ]1 I. ~/ K8 |3 e" t6 ^      MC_StopMotor1();         //停止电机运行
6 C. i1 h8 j- p) H( i) E+ m      delay_10s_flag=0;
+ J1 r  l/ Q9 J    }
* H7 k& i# m; w& W    if(delay_5s_flag==1)     //5S
8 t! o" [! S) A    {3 `1 _' Z1 S* w0 H
      MC_StartMotor1();) ?0 i$ n6 v' t+ b
      delay_5s_flag=0;
% l' e+ S9 M! R+ t: E% Y( I    }7 ?1 M0 N  {& M; R
& K9 q( D2 N5 d( H' h
+ F' ?7 H0 _- E7 R
  }
0 Y* I( ^9 u1 O  /* USER CODE END 3 */1 r/ o" A( I/ i
+ ^9 L) F5 m! s. }

- t* M- G1 m/ k+ H}
7 X( K4 m5 g9 B- ^" y* M. N- ?/ W1 F  o2 E# K. d
4 L9 p8 @1 k8 g8 |* q4 f
1 f6 ]/ c$ C8 y$ d( v
/* USER CODE END 0 */+ P, Y" }' X8 X( z# H2 K

5 C- d; A" {2 p# e3 P( d3 L0 I3 C4 p9 w$ H

5 @9 j1 U, X2 v, ^& n4 U
1 B4 G+ w- H5 A4 ], {/ h

+ }' h, M+ d/ ]stm32f30x_mc_it.c 程序里面添加内容:
& V6 J# Q) g- o  d. c: _在滴答定时中断程序里面调用定义的函数6 V* D, |" |, M" v% ~
void SysTick_Handler(void)7 T! k8 A# d9 ^( L4 N; H: L5 K
{/ q7 M) p" T1 E6 D' R3 G  x
#ifdef MC_HAL_IS_USED
# \  }* O- W- ?  `  H" I9 d7 Rstatic uint8_t SystickDividerCounter = SYSTICK_DIVIDER;
8 E4 V$ ^3 T8 N8 T/ Z' ]" N0 B  /* USER CODE BEGIN SysTick_IRQn 0 */# Q* y, j9 n/ M  J, m
6 x, }9 \* m3 l2 E$ S- e% q
8 r$ U  I! i: L6 Q' n
  /* USER CODE END SysTick_IRQn 0 */
6 g( m" o- L5 h# ]4 F& B* {  if (SystickDividerCounter == SYSTICK_DIVIDER)" t- f, s( B! U! a
  {
6 q% e6 A. v; Z: U1 j    HAL_IncTick();3 I% ~+ B8 Y) n( J" u! k5 s
    HAL_SYSTICK_IRQHandler();
8 ]; _1 W; ^8 ~+ Y    SystickDividerCounter = 0;
' u6 }+ m* F7 s  D, {, k  }+ R$ p' t8 }! b+ c$ x
  SystickDividerCounter ++;  
9 v) _9 c9 r5 T) \8 v#endif /* MC_HAL_IS_USED */$ k8 Z. h: U- F3 y! \9 i' O! q$ U, I" X; h
2 o6 j% H% W5 l
* G5 l" H* o  l# a2 Z! m" |
  /* USER CODE BEGIN SysTick_IRQn 1 */
. I: g" v4 g/ o2 O1 _, v  /* USER CODE END SysTick_IRQn 1 */
8 m* \# s; t+ K. [3 z    MC_RunMotorControlTasks();& T& o& g! @( i; ~1 k
  /* USER CODE BEGIN SysTick_IRQn 2 */) f- V) M% L) k
    Delay_Handler();
+ P! Q& w7 F6 L* \8 r3 ?1 ]- K) I  /* USER CODE END SysTick_IRQn 2 */
1 F3 w7 k) d. n" S+ a  |}9 S3 W# i& A/ O6 @: j; R4 |& s
# [$ @: e8 B2 b

# x; \6 T# V- N+ n. k% h  i

# x! T1 o! K2 O: U4 r) Q' _! H3、测试波形:+ Y! J. U& {! |; f8 y; @- ?
在程序定义PC9为输出,观察滴答定时器的定时时间,滴答定时器的时间周期为0.5us ,程序处理后变成1s定时周期:
1 O; C: {2 p8 T( v: |5 f0 G6 P 3.jpg
8 P1 v9 V' Q1 E" l2 q. E  S( U  p$ l7 P
; k7 @$ |6 s9 U# M
监控电机运行的图片:
+ B) H" o8 P3 O/ A8 N 4.png " p; \, ]& M$ I
5.png , F* v# X7 Y0 Y2 u1 b0 T

; ~; q% F3 t* D1 o5 q1 z# f

. ?6 t% T& I6 \2 }3 j1 q" v! Y- o

# n4 X2 N. V% T0 L! S" o* V8 J# F9 J
) o# a. v7 P4 s2 B# p6 {

' A  }9 q/ e5 L( a5 Q; A) J, y/ j! P$ d4 D
& f3 h: ~' ?! M* Q: L1 X1 V
" Q5 {1 [) k* s9 L' B. n) l$ {

+ E1 F0 c" A: V9 C' U+ E( }7 C( s( M0 `1 T& i, K' `0 M1 I! d

9 t; R' f: `, u4 \, l! P5 \3 h* T) o, r) O

" M6 [; h" S" ~$ I+ ?0 I7 ]6 W     : o5 N9 o7 S4 h  g9 T  K

: x9 [: q9 a) Q+ G% ?5 z* v" Z
赞 收藏 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( n' u  L* v7 n6 `- Y) U. ^
向大神学习,思路不错。
& x, d( u2 W+ @% j+ P
共同学习
wolfgang 回答时间:2018-8-31 16:00:08
按照此想法,还有其他方法观察嘀嗒计时器的方法~~
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版