前言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
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% {
# ]" 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- HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_RESET); ! s# ?- U, y1 i5 A$ {
- 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
- HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_SET);
& Z# r4 k9 A+ K. F - HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_RESET);
复制代码
2 s( o' h; @! ^1 ~反转- HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_RESET); 6 k# v$ Z6 J* G( n: M& v- U
- 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
& 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
- #include "Moto.h". ~% L' `) x5 _8 d+ q
- , Q R- X9 ?8 D+ _2 M# T7 Q+ t
- //小车模式定义
0 m Y; E, {1 T8 c" Z5 q9 C- N - #define GO 0; z3 {5 w8 l& y L
- #define Back 1
: v( E, k f5 M! l; k' G - #define Stop 2
! Q# L2 a1 \2 n* r' P- @3 G6 w/ n. R - ( p8 [& ]3 F: d! ~% \
- /** E9 n' o! v: x& Z7 E5 E
- 函数功能:小车电机初始化( K/ S8 J, C1 w
- */
, Y" [1 W4 i& X A9 L$ y4 y% N - void Moto_Iint(void)
9 a8 R, G5 `8 n) T3 l5 Q6 |1 B - {
; @ f) V; X2 e2 r9 l: t5 a - car_move(Stop);; \9 e# P; k* M Z0 _' `) j$ X4 _
- }( b% p- ]( c$ t6 i+ {5 J. B
& P4 z) l1 V9 D- e+ |- /*+ V* I- L: J% f9 |
- 函数功能:左电机模式设置, c9 H/ p# ~$ b& h, S1 W
- Mode:模式选择 GO:前进 Back:后退 Stop:停止
% G8 O% Q6 | R* U U& T - */& v, m- ^! G# R7 a* F
- void Left_mode(char Mode)
* r# D) W" x( g7 @$ A2 k; `4 ]4 M5 o - {
4 j7 v g* D( V! M4 n, O3 {/ f8 ` - switch(Mode)
; y0 L4 g+ p4 V& Y+ n1 K$ P - {
& j" e$ q3 h6 ]7 M6 B- D& g2 F - case GO:
6 L# X/ A+ f) }) B; @ - {4 [5 _2 Z! h) z! P. B* d; F
- BIN1_RESET();9 j- c; N6 M8 B* U9 n
- BIN2_SET();
7 c* e9 V d* G6 ^7 f+ O2 C - }3 O% y9 u l) F) J% n+ m' P/ D
- break;
6 o" J( e9 w* w6 [: n( a8 G: b- { - case Back:
L/ |3 e/ P# ~/ G% I - {% p. B' q$ S/ S
- BIN2_RESET();; i) Y! B& f4 d
- BIN1_SET();
$ I' i! p* p) f9 U+ {3 f - }
6 x9 c4 k6 b" N. f9 Z3 O2 B* V - break;! ]% R7 u* y. M: Z! i
- case Stop:+ D7 H& m/ Y, `% ?) l2 Y+ J
- {, [5 @% Z6 m/ k0 R, M
- BIN1_RESET();; y0 w/ \6 l0 S4 H9 u; D/ @" [/ p
- BIN2_RESET();
0 G8 @1 [! ]- B% s - }
) y$ O: \6 u4 }9 r. B7 m$ _ - break;
6 D/ j) o# Z1 y4 @; e) n - }; n- M, S: n+ y8 @
- }
8 c6 z( E2 l9 @9 I6 m" \, ?6 ~7 s4 n" ?
) l4 b7 U& L! |, p- /*5 k2 W% }2 V, ^5 m1 \
- 函数功能:右电机模式设置
* l9 d! P$ }. k: p - Mode:模式选择 GO:前进 Back:后退 Stop:停止% ]& \3 s F3 N% C+ D- L, k
- */! w) x' [- i( q+ H; T
- void Rright_mode(char Mode)2 x+ L+ N/ w0 f, Q
- {
; n3 H$ q* `" n! a) I' j* L: n - switch(Mode)- T* q: H; V. M9 M8 ]+ P% x* u
- {: n7 v9 R7 Q7 u+ w6 a' S
- case GO:4 r4 s1 o+ d0 o# b5 y0 O' _
- {
2 A, W( \; U! N: C - AIN1_RESET();) n: n9 L: y% g* e. b8 D; J! }
- AIN2_SET();
' @- `. c! T; B" | - }) Z$ `$ {+ c; w h' s9 E
- break;+ O* _/ [0 M- c
- case Back:+ a ^, L3 ]5 C" y
- {" x! i- F! Q0 R8 E* s5 b% i7 O
- AIN1_RESET();
9 }: U! w/ i. Z - AIN2_SET(); 6 {. ^0 A' o$ j
- }
+ r+ S! ~8 n3 H* j - break;
' [; `5 B3 \/ C- g - case Stop:5 `! u: b4 b4 a
- {
% l7 e. {1 g X* e - AIN1_RESET();
: t3 s* S6 h) \, |4 p0 W* Z" F - AIN2_RESET();
9 C& t7 ~9 U# B6 Z - }7 |1 k' M6 w0 q4 `
- break;
+ @' W/ H1 ^7 R! z# F. [: A - }' }6 w5 x3 i* w, ~ S
- }! S i6 l! c7 ~8 d+ t
- Z2 ^ |6 J/ d* T. z4 d" M1 f7 m: F
- /*$ c' T. G7 {0 E8 O/ t$ J* L2 Q
- 函数功能:小车移动
$ Y$ v2 d( }% d$ p7 r# U! O9 t - Mode:模式选择 GO:前进 Back:后退 Stop:停止
. [ f% `/ u1 C* m2 e2 ~ - */
$ L5 U* x! h. N% \$ v8 {9 T - void car_move(char Mode)" n7 h! _; j0 E& {
- {4 B4 w# v, q5 t C4 j
- switch(Mode)6 Z. i+ E8 E: p; |* }, v) @& x
- { c& c3 Z4 n% V$ ?) t* J6 Q
- case GO:$ ~ U' H, b4 s8 A- f
- {7 f, d' k, h/ o7 J6 Y; q) W$ w
- Left_mode(GO);
" o# n* V+ h5 E& j - Rright_mode(GO);, t9 G' p: q, h4 y% e) f% t
- }, I% z& ?# ~9 N! `3 l7 [
- break;% p9 t2 z* j1 K: c, a* H" o, T6 R
- case Back:
# y, C4 q$ E. v2 v. U s; D4 m - {
& H3 T7 w" g( Y- q' \ - Left_mode(Back);
4 L% W! B& q+ p- } - Rright_mode(Back);
5 r' i( w. H9 H - }
+ J. ]. l3 K8 H; O# |, ?: l - break;
8 S' C$ u+ H2 N - case Stop:
% D! s, H0 s6 m( p - {
# Y& d+ [6 }4 L - Left_mode(Stop);1 h9 u J/ |- }1 P$ `/ z
- Rright_mode(Stop); , d% Z, U+ U9 [3 H( r
- }7 R5 l3 U! |, T1 a: y7 V: X- p
- break;8 w& B' }* n7 w& T# t9 P
- }( L+ S/ W! u/ y* {8 t/ C& {
- }
复制代码
3 ]8 E, J( o; JMoto.h: R( x! t! E& h% u' V
0 I) c$ ^9 J- I4 e3 J/ m' a
- #ifndef _MOTO_H_: s" |; P4 X$ M8 _; }9 w7 c, L
- #define _MOTO_H_
2 ]# _5 ~: r& j8 v! [# }
! \) s* b( h# l4 s9 A @, l& |- * Q5 U9 n- J; s o) X- m& ?- T
- #include "main.h"
( @; c9 j1 p0 M" N8 h - 8 v( E5 \+ e: a: T2 z' E% d/ ^" m
- #define u8 unsigned char
4 B" R8 k( {! S. U5 y - #define u16 unsigned short
0 g$ W2 f5 @5 ]: n - #define u32 unsigned int
/ C0 R" G+ |7 @0 ]. J - # u6 r. n. R( \. K$ z
- //电机IO定义- g# J) i3 ?( Q
* \9 c, P7 b" a: }- //右电机
) b0 m* n% ~! t- G1 T - #define AIN1_RESET() HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_RESET)$ T+ l3 {' u% \) \, Y4 O
- #define AIN1_SET() HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_SET)+ x: p- S/ u0 M5 K: P3 e
- 3 T9 N2 u6 ~4 {( r4 @" o# F/ F
- #define AIN2_RESET() HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_RESET)
, _( J2 r1 J" L1 @ - #define AIN2_SET() HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_SET)8 |5 V; Q: \2 {! T7 S1 z _. O
- ; T0 T" |, O ]
- //左电机
e! _1 y4 q0 ]9 D - #define BIN1_RESET() HAL_GPIO_WritePin(BIN1_GPIO_Port,BIN1_Pin,GPIO_PIN_RESET)
8 z- j* \' w! l6 v n: J6 F4 } - #define BIN1_SET() HAL_GPIO_WritePin(BIN1_GPIO_Port,BIN1_Pin,GPIO_PIN_SET) Q+ F( k6 p P, {( F
& Y7 A0 n! \& I, @2 X4 H- #define BIN2_RESET() HAL_GPIO_WritePin(BIN2_GPIO_Port,BIN2_Pin,GPIO_PIN_RESET)! G8 M- M) ]4 x8 M" y
- #define BIN2_SET() HAL_GPIO_WritePin(BIN2_GPIO_Port,BIN2_Pin,GPIO_PIN_SET) Z* Z) p5 @+ p+ H
- ! X6 U9 E1 x' L8 |
- `/ ]# `: v6 t; \$ K
% R, Y; i. b& Q9 [, D4 j7 A5 V- void Moto_Iint(void);" v1 L: u% w7 w9 @! e
- void car_move(char Mode);
~5 m# y2 e$ H% x( X: z' m - void Left_mode(char Mode);
2 [6 r, {0 R- g8 Y" S - void Rright_mode(char Mode);
8 Z3 o2 c0 H+ S9 P0 u/ p5 G - 8 K# k9 d# C. S9 C" g" n4 R
5 d- U! ~- G) @8 |3 ?- #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
|