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

【经验分享】STM32 2轮PID智能小车第一章驱动电机让小车动起来

[复制链接]
STMCU小助手 发布时间:2022-5-20 00:53
前言4 `3 H* {# t# N& w% F/ B0 p
本篇文章正式带大家学习STM32智能小车。这篇文章先带大家了解一下如何让小车动起来。
. K7 }: |8 V7 f) x& M5 Q
$ l# b! x2 X; L7 p一、LM298N
7 Y3 u" p" l2 s6 r; [1.LM298N模块接线原理图。6 g) \7 j/ G) O$ S" ^& w+ [. c7 f
根据下图可知一个LM298N可以控制两个电机模块。
+ Y* ~: R8 ?4 Q5 S' h3 k4 p12V输入需要接入电源,电源地接GND。单片机IO口接到STM32的GPIO口。
4 a1 ]* o" B5 F' q 4WP]$]B}X78IJY~~LH~]}CO.png
2 X( w9 S* a# J( f, ~
2 \9 U1 U3 Z- [2.LM298N和STM32接线图及LM298N和电机接线图( w# m" n. q0 w' G- C1 c) U
将电机接到LM298N上,LM298N接到STM32上,通过STM32控制控制GPIO引脚的电平高低驱动电机转动。
5 ?' t" t. D7 i# }. n
- b; z% p, f" B  j/ K) p3 f. }* W3 a% { ~~~RFO2CRJYK$GX[P)90D[3.png # ]" z2 E+ x$ O5 I" _$ ~) `* c

. M. T1 ~" b8 _  n' e4 e二、驱动电机模块3 g& M6 H0 H+ g
//硬件连接说明:- M: Q8 i6 m/ y4 A
//PB0----PWMA 右电机PWM. S/ I; \: F7 H' B+ A$ S# e
//PB12----AIN2 控制右电机正反6 y% Z! j2 \$ E$ ~6 D+ f
//PB13----AIN1 控制右电机正反" J. ]8 d3 a( d$ m& A
//PB14----BIN1 控制左电机正反
" |. w& b1 l9 |& r. M) R6 x//PB15----BIN2 控制左电机正反
# P( Y! p& o4 O: ^) m; n$ C//PB1----PWMB 左电机PWM
1 i/ B3 D: p8 @3 @/ U) y2 QLM298N上面的ENA,ENB控制小车PWM调速,IN1,IN2,IN3,IN4控制电机的正转和反转。
: ]8 \; u6 s" a
4 b$ d/ K* w. W/ Y7 S2 r5 Z7 \% ?电机的正转、反转、停转
* `; G( S0 U0 K3 r1 e1 \' q1.首先实现电机的停转是最简单的只要将电机的两个GPIO口都设置为相同的电平。
$ Q- y- Q' o3 E* D代码:( r7 N! ^1 r3 V
停转" g4 s7 e. y, n! F, D

+ R/ B) K( A- W+ B$ F3 M
  1.   HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_RESET);  ! s# ?- U, y1 i5 A$ {
  2.   HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_RESET);
复制代码
2 C* Q% n0 a" s4 y0 A& y$ S; O
2.电机正转和反转将两个GPIO口设置为不同电平即可
* [) P* A1 i5 R: }; D7 O6 u* l正转- L) I6 e8 s- i
  1.   HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_SET);  
    & Z# r4 k9 A+ K. F
  2.   HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_RESET);
复制代码

2 s( o' h; @! ^1 ~反转
  1.   HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_RESET);  6 k# v$ Z6 J* G( n: M& v- U
  2.   HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_SET);
复制代码

; |9 V2 H) B1 Y! @二、cubeMX配置
( r6 z9 h. W$ F5 p8 m( s, `( r: q让小车动起来只需配置如下引脚。
0 R! g( C, n, ^
& |  G$ k/ N9 r J)[PW7QDBL_P_PMM$(VXL_6.png & Y8 r+ K$ q7 Z# Z8 y! s9 l7 I5 `; l
% L$ n' Q$ P5 X* P
三、程序代码编写
2 E& ]* x, _( Z1 h' g, E4 h6 s/ ]Moto.c$ E' P; l) ^, U( T
: m, l3 c& ]# F7 l0 d
  1. #include "Moto.h". ~% L' `) x5 _8 d+ q
  2. , Q  R- X9 ?8 D+ _2 M# T7 Q+ t
  3. //小车模式定义
    0 m  Y; E, {1 T8 c" Z5 q9 C- N
  4. #define GO 0; z3 {5 w8 l& y  L
  5. #define Back 1
    : v( E, k  f5 M! l; k' G
  6. #define Stop 2
    ! Q# L2 a1 \2 n* r' P- @3 G6 w/ n. R
  7. ( p8 [& ]3 F: d! ~% \
  8. /** E9 n' o! v: x& Z7 E5 E
  9. 函数功能:小车电机初始化( K/ S8 J, C1 w
  10. */
    , Y" [1 W4 i& X  A9 L$ y4 y% N
  11. void Moto_Iint(void)
    9 a8 R, G5 `8 n) T3 l5 Q6 |1 B
  12. {
    ; @  f) V; X2 e2 r9 l: t5 a
  13.     car_move(Stop);; \9 e# P; k* M  Z0 _' `) j$ X4 _
  14. }( b% p- ]( c$ t6 i+ {5 J. B

  15. & P4 z) l1 V9 D- e+ |
  16. /*+ V* I- L: J% f9 |
  17. 函数功能:左电机模式设置, c9 H/ p# ~$ b& h, S1 W
  18. Mode:模式选择 GO:前进 Back:后退 Stop:停止
    % G8 O% Q6 |  R* U  U& T
  19. */& v, m- ^! G# R7 a* F
  20. void Left_mode(char Mode)
    * r# D) W" x( g7 @$ A2 k; `4 ]4 M5 o
  21. {
    4 j7 v  g* D( V! M4 n, O3 {/ f8 `
  22.   switch(Mode)
    ; y0 L4 g+ p4 V& Y+ n1 K$ P
  23.   {
    & j" e$ q3 h6 ]7 M6 B- D& g2 F
  24.     case GO:
    6 L# X/ A+ f) }) B; @
  25.     {4 [5 _2 Z! h) z! P. B* d; F
  26.         BIN1_RESET();9 j- c; N6 M8 B* U9 n
  27.         BIN2_SET();
    7 c* e9 V  d* G6 ^7 f+ O2 C
  28.     }3 O% y9 u  l) F) J% n+ m' P/ D
  29.     break;
    6 o" J( e9 w* w6 [: n( a8 G: b- {
  30.     case Back:
      L/ |3 e/ P# ~/ G% I
  31.     {% p. B' q$ S/ S
  32.         BIN2_RESET();; i) Y! B& f4 d
  33.         BIN1_SET();        
    $ I' i! p* p) f9 U+ {3 f
  34.     }
    6 x9 c4 k6 b" N. f9 Z3 O2 B* V
  35.     break;! ]% R7 u* y. M: Z! i
  36.     case Stop:+ D7 H& m/ Y, `% ?) l2 Y+ J
  37.     {, [5 @% Z6 m/ k0 R, M
  38.         BIN1_RESET();; y0 w/ \6 l0 S4 H9 u; D/ @" [/ p
  39.         BIN2_RESET();
    0 G8 @1 [! ]- B% s
  40.     }
    ) y$ O: \6 u4 }9 r. B7 m$ _
  41.     break;
    6 D/ j) o# Z1 y4 @; e) n
  42.   }; n- M, S: n+ y8 @
  43. }
    8 c6 z( E2 l9 @9 I6 m" \, ?6 ~7 s4 n" ?

  44. ) l4 b7 U& L! |, p
  45. /*5 k2 W% }2 V, ^5 m1 \
  46. 函数功能:右电机模式设置
    * l9 d! P$ }. k: p
  47. Mode:模式选择 GO:前进 Back:后退 Stop:停止% ]& \3 s  F3 N% C+ D- L, k
  48. */! w) x' [- i( q+ H; T
  49. void Rright_mode(char Mode)2 x+ L+ N/ w0 f, Q
  50. {
    ; n3 H$ q* `" n! a) I' j* L: n
  51.   switch(Mode)- T* q: H; V. M9 M8 ]+ P% x* u
  52.   {: n7 v9 R7 Q7 u+ w6 a' S
  53.     case GO:4 r4 s1 o+ d0 o# b5 y0 O' _
  54.     {
    2 A, W( \; U! N: C
  55.         AIN1_RESET();) n: n9 L: y% g* e. b8 D; J! }
  56.         AIN2_SET();        
    ' @- `. c! T; B" |
  57.     }) Z$ `$ {+ c; w  h' s9 E
  58.     break;+ O* _/ [0 M- c
  59.     case Back:+ a  ^, L3 ]5 C" y
  60.     {" x! i- F! Q0 R8 E* s5 b% i7 O
  61.         AIN1_RESET();
    9 }: U! w/ i. Z
  62.         AIN2_SET();        6 {. ^0 A' o$ j
  63.     }
    + r+ S! ~8 n3 H* j
  64.     break;
    ' [; `5 B3 \/ C- g
  65.     case Stop:5 `! u: b4 b4 a
  66.     {
    % l7 e. {1 g  X* e
  67.         AIN1_RESET();
    : t3 s* S6 h) \, |4 p0 W* Z" F
  68.         AIN2_RESET();
    9 C& t7 ~9 U# B6 Z
  69.     }7 |1 k' M6 w0 q4 `
  70.     break;
    + @' W/ H1 ^7 R! z# F. [: A
  71.   }' }6 w5 x3 i* w, ~  S
  72. }! S  i6 l! c7 ~8 d+ t
  73.   Z2 ^  |6 J/ d* T. z4 d" M1 f7 m: F
  74. /*$ c' T. G7 {0 E8 O/ t$ J* L2 Q
  75. 函数功能:小车移动
    $ Y$ v2 d( }% d$ p7 r# U! O9 t
  76. Mode:模式选择 GO:前进 Back:后退 Stop:停止
    . [  f% `/ u1 C* m2 e2 ~
  77. */
    $ L5 U* x! h. N% \$ v8 {9 T
  78. void car_move(char Mode)" n7 h! _; j0 E& {
  79. {4 B4 w# v, q5 t  C4 j
  80.   switch(Mode)6 Z. i+ E8 E: p; |* }, v) @& x
  81.   {  c& c3 Z4 n% V$ ?) t* J6 Q
  82.     case GO:$ ~  U' H, b4 s8 A- f
  83.     {7 f, d' k, h/ o7 J6 Y; q) W$ w
  84.         Left_mode(GO);
    " o# n* V+ h5 E& j
  85.         Rright_mode(GO);, t9 G' p: q, h4 y% e) f% t
  86.     }, I% z& ?# ~9 N! `3 l7 [
  87.     break;% p9 t2 z* j1 K: c, a* H" o, T6 R
  88.     case Back:
    # y, C4 q$ E. v2 v. U  s; D4 m
  89.     {
    & H3 T7 w" g( Y- q' \
  90.         Left_mode(Back);
    4 L% W! B& q+ p- }
  91.         Rright_mode(Back);        
    5 r' i( w. H9 H
  92.     }
    + J. ]. l3 K8 H; O# |, ?: l
  93.     break;
    8 S' C$ u+ H2 N
  94.     case Stop:
    % D! s, H0 s6 m( p
  95.     {
    # Y& d+ [6 }4 L
  96.         Left_mode(Stop);1 h9 u  J/ |- }1 P$ `/ z
  97.         Rright_mode(Stop);        , d% Z, U+ U9 [3 H( r
  98.     }7 R5 l3 U! |, T1 a: y7 V: X- p
  99.     break;8 w& B' }* n7 w& T# t9 P
  100.   }( L+ S/ W! u/ y* {8 t/ C& {
  101. }
复制代码

3 ]8 E, J( o; JMoto.h: R( x! t! E& h% u' V
0 I) c$ ^9 J- I4 e3 J/ m' a
  1. #ifndef _MOTO_H_: s" |; P4 X$ M8 _; }9 w7 c, L
  2. #define _MOTO_H_
    2 ]# _5 ~: r& j8 v! [# }

  3. ! \) s* b( h# l4 s9 A  @, l& |
  4. * Q5 U9 n- J; s  o) X- m& ?- T
  5. #include "main.h"
    ( @; c9 j1 p0 M" N8 h
  6. 8 v( E5 \+ e: a: T2 z' E% d/ ^" m
  7. #define u8 unsigned char
    4 B" R8 k( {! S. U5 y
  8. #define u16 unsigned short
    0 g$ W2 f5 @5 ]: n
  9. #define u32 unsigned int
    / C0 R" G+ |7 @0 ]. J
  10. # u6 r. n. R( \. K$ z
  11. //电机IO定义- g# J) i3 ?( Q

  12. * \9 c, P7 b" a: }
  13. //右电机
    ) b0 m* n% ~! t- G1 T
  14. #define AIN1_RESET() HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_RESET)$ T+ l3 {' u% \) \, Y4 O
  15. #define AIN1_SET() HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_SET)+ x: p- S/ u0 M5 K: P3 e
  16. 3 T9 N2 u6 ~4 {( r4 @" o# F/ F
  17. #define AIN2_RESET() HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_RESET)
    , _( J2 r1 J" L1 @
  18. #define AIN2_SET() HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_SET)8 |5 V; Q: \2 {! T7 S1 z  _. O
  19. ; T0 T" |, O  ]
  20. //左电机
      e! _1 y4 q0 ]9 D
  21. #define BIN1_RESET() HAL_GPIO_WritePin(BIN1_GPIO_Port,BIN1_Pin,GPIO_PIN_RESET)
    8 z- j* \' w! l6 v  n: J6 F4 }
  22. #define BIN1_SET() HAL_GPIO_WritePin(BIN1_GPIO_Port,BIN1_Pin,GPIO_PIN_SET)  Q+ F( k6 p  P, {( F

  23. & Y7 A0 n! \& I, @2 X4 H
  24. #define BIN2_RESET() HAL_GPIO_WritePin(BIN2_GPIO_Port,BIN2_Pin,GPIO_PIN_RESET)! G8 M- M) ]4 x8 M" y
  25. #define BIN2_SET() HAL_GPIO_WritePin(BIN2_GPIO_Port,BIN2_Pin,GPIO_PIN_SET)  Z* Z) p5 @+ p+ H
  26. ! X6 U9 E1 x' L8 |
  27.   `/ ]# `: v6 t; \$ K

  28. % R, Y; i. b& Q9 [, D4 j7 A5 V
  29. void Moto_Iint(void);" v1 L: u% w7 w9 @! e
  30. void car_move(char Mode);
      ~5 m# y2 e$ H% x( X: z' m
  31. void Left_mode(char Mode);
    2 [6 r, {0 R- g8 Y" S
  32. void Rright_mode(char Mode);
    8 Z3 o2 c0 H+ S9 P0 u/ p5 G
  33. 8 K# k9 d# C. S9 C" g" n4 R

  34. 5 d- U! ~- G) @8 |3 ?
  35. #endif4 ]* s2 J1 \3 c) o( s% J4 f
复制代码
+ y. p/ ^' v6 x, r' a& Y8 U
总结5 [: m, w$ c9 V! G; m! A
本篇文章就介绍到这里,大家有什么问题可以留言或者私信。; S) X- E* J) f- M; _
& z: N+ `! k6 `! ~
: y4 V  b- O7 w' c* X& ^# ~9 t
( t+ R. O3 z: M" E

; L" [& K% L, [$ J5 G/ O2 j1 x& K- ]+ g  H( h6 G2 Q2 y" U
赞 收藏 评论0 发布时间:2022-5-20 00:53

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版