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

【经验分享】STM32f1之L298N电机驱动+PWM调速

[复制链接]
STMCU小助手 发布时间:2022-5-14 20:41
一、L298N电机驱动主要介绍
1 d6 p! N" J: w5 C2 M. l) |主要I/O口+ o% p) r( i# c0 e% _  w% U1 k; o
" l# L0 _! C, C# s4 p
使能端ENA和ENB,控制输入端INA、INB、INC、IND,马达输出口OUT1、OUT2、OUT3、OUT4,5V输出(可以不接),还有一个板载5V电压,具体如下图所示:, e  }) i& [6 R; T
) b/ s2 Y3 a( F5 c
2L_$AX`QM3WZL$C~O@O3`KA.png
8 `$ T5 j* r6 W( m. I% a% m4 Y6 B. Y# i8 ~" n$ ?9 I" o
二、控制实现功能" A( m5 j0 b" D7 U* n& N+ c+ i
对于L298N模块,直接给12V输入,接上地,就可以给整个模块供电了,之后就是通过控制单片机(这里用的是STM32f1)给4个输入端(INA、INB、INC、IND)控制输入高低电平了$ D- C# n$ `* s% T

& \% Q0 N) m( ~注意:ENA和ENB一般情况下会有两个跳线帽连着,这是直接连上高电平,只有给高电平,这才能让四个输入端(INA、INB、INC、IND)口去控制四个输出(OUT1、OUT2、OUT3、OUT4)进而直流电机状态。特别注意GND是电源和单片机一起共地!
4 l) M& D. N3 C! Q  f
- J4 c- G/ u" o* O+ s8 K下面为真值表:
4 l; _6 l  b8 o1 y7 O) ^
) E/ x& n: V( Z- P7 h. Q9 S _IZRG{XIF1`$$NAXLN[8FUI.png 2 M4 R1 H, i, |3 f
% S* O: l/ y  v  {) i

# {. y9 u: l7 T5 g, ^% R6 }: n 三、PWM调速实现8 m6 N" w2 d! D
这里就不再是把ENA、ENB再接上高电平了,这个时候就要把跳线帽拔掉了,在通过定时器来控制实现PWM调速,具体先上代码:
: S$ l" `( P0 e. B3 S6 i8 B3 [1 a: g- t& q! h' s( k0 f
  1. #include "timer.h"
    9 l" H% c' B& W5 B. p/ q% D1 e

  2. ( C  u# H6 }' c3 Y) u% u" j
  3. / g: k* u( {# ?7 v: a. X
  4. #define Ina PGout(2)
    + g  o8 J: O, N1 c+ P* o0 k
  5. #define Inb PGout(3)
    ' c6 n3 K4 l+ x; t
  6. #define Inc PGout(4)6 ~9 Q6 P$ o* p' D- t  q
  7. #define Ind PGout(5)
    , W6 S3 o8 b0 `

  8. 7 w$ e; P5 o1 O' y3 E! R
  9. void TIM3_PWM_Init(u16 arr,u16 psc)9 p3 \2 l* S/ ~* L% x2 @: h
  10. {  
    , J& ^* W5 U( @$ Q* R9 t% q
  11.         GPIO_InitTypeDef GPIO_InitStructure;, m# u5 b! i* E# a8 i
  12.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    2 j( b( _4 a- q& e# J9 P6 K; j
  13.         TIM_OCInitTypeDef  TIM_OCInitStructure;- c. c7 L  H6 s6 A6 F' V8 b

  14. * j8 z9 ?1 a+ v0 y) j3 E% }* }
  15.         - S6 W+ h- A. F% x' @* }
  16. # b: e5 K+ F9 x1 H" E! [5 j
  17.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);        9 Y6 Q: @; k$ L; [% y
  18.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG,ENABLE);
    0 p. y- A$ H& K& D
  19.         8 O9 e+ k+ P! W
  20. & M$ [  Y$ a, D. ?! a
  21. : f: X7 o5 g- W& }0 ]
  22.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //1 M1 G) I* G; s
  23.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出( G* X5 k' F) q" i+ v
  24.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;! f7 [# t- z0 I, e2 u, K3 s. v# ]
  25.         GPIO_Init(GPIOA, &GPIO_InitStructure);//TIM3通道2" H5 M, b) }: L/ c: |
  26.         ( w) M4 S; J9 r/ T
  27.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //7 R/ W% u8 ~& N0 ]2 a
  28.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //9 d) X; q4 _# _6 s4 c8 Q' N8 x  i! G
  29.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    & Z; q' j4 b; B* x" c- \
  30.         GPIO_Init(GPIOA, &GPIO_InitStructure);//TIM3通道1/ L9 \% l( ^  O" k, w+ l
  31.         
    4 ~/ z3 B4 s( V$ w- F) e
  32.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                        
    0 F0 c; w: r2 X; C0 ]
  33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 
    : F" @8 }* Y6 K3 d% \  I3 L" Z
  34.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                  g6 s- C1 V' C) _/ ~8 z% Y
  35.         GPIO_Init(GPIOG, &GPIO_InitStructure);                                         
    ) N6 p+ I+ w) Z7 i& z/ |2 G; ?
  36.         GPIO_ResetBits(GPIOG,GPIO_Pin_2);                                        7 }1 N: B% a" \1 X* e; Q* p. E
  37.         : B0 m$ H( Z# Y9 x
  38.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;: `6 {9 I0 X3 a; j7 i9 K) O
  39.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                                 ; c' E7 R8 t5 s6 M. m( B
  40.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 
    ( r! Q+ V: [6 N* s) V
  41.         GPIO_Init(GPIOG, &GPIO_InitStructure);                                
    + z% Z! ?0 g% q# r
  42.         GPIO_ResetBits(GPIOG,GPIO_Pin_3);                                                
    0 i; F, M$ I0 H  r3 F$ b
  43.         
    5 B( W7 c/ s' {" k' D0 h+ k
  44.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                                 
    ! t$ G$ h8 B' t# S7 g1 G7 u
  45.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 
    6 i: K" \6 ?3 O! o
  46.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 
    6 ?  b5 f0 y, g% J
  47.         GPIO_Init(GPIOG, &GPIO_InitStructure);                                         
    " X3 a8 ^: J% N8 u3 g
  48.         GPIO_ResetBits(GPIOG,GPIO_Pin_4);                                                
    % [+ ^) S& V1 c. y
  49.         
    ' g; t5 e+ E" X' H( [2 X9 z
  50.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                4 x  G- E% E7 ]" c
  51.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 
    ) Y  m" `1 Z( x6 n$ [$ O2 a1 B
  52.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 9 Z- D1 `3 |4 X- {: ~
  53.         GPIO_Init(GPIOG, &GPIO_InitStructure);                                           \3 }2 M+ A+ W6 m$ T/ H# D- s: [
  54.         GPIO_ResetBits(GPIOG,GPIO_Pin_5);                                                1 L$ ~- E9 k7 T9 K& ]! R
  55. % j( ~3 I3 G1 K  z2 C
  56.         TIM_TimeBaseStructure.TIM_Period = arr; $ r8 X( M% G/ }# w
  57.         TIM_TimeBaseStructure.TIM_Prescaler =psc;
    ) W3 H9 ~3 r9 e$ A! ?: a
  58.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; & K! l4 _+ j- ^$ a" H! c  i7 E
  59.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
    % D* Z) O% B7 F( \  ~/ @& u
  60.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);2 `# R9 h( A- N/ F% h& U/ g- R
  61.         
    , Y' _- K8 O+ d, u1 z
  62.         ' [9 o/ H5 N# d$ e5 u
  63.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; 9 Z; y+ k2 Z2 s: w
  64.          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    " ]0 H! |  }% d3 Z7 \+ C& p0 l
  65.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; # `6 n) e7 {3 G4 Q
  66.         TIM_OC2Init(TIM3, &TIM_OCInitStructure);  
    ( e4 {1 g$ |9 z1 g+ @- M
  67. % a7 {  B( W0 o7 l  T3 ^& U( P& n
  68.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
    8 B( v! r/ u, [6 _( c4 u! M
  69.          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; . _# u) l5 y2 {5 v' L2 x, l
  70.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; ' C& G5 o5 x1 D2 W
  71.         TIM_OC1Init(TIM3, &TIM_OCInitStructure);  
    - @) O$ w% h+ B2 J  F
  72. 6 J* H1 v5 o1 ]
  73. 4 b/ X+ Q& _& N3 ]
  74.         TIM_Cmd(TIM3, ENABLE);  
    # Q5 a' M, l9 t7 t1 D  ?

  75. 0 @6 P+ y* J+ N% j: K, O# F
  76. }
复制代码
$ {. b+ H9 r+ [! a# p) L
上面这段代码主要是定时器TIM3的初始化以及四个输入端的初始化,至于那个预分配系数psc和自动重装值arr可以自己设定,这里我设定的是arr=450,psc=7199;大家可以自己调试,这里不细讲。
( m8 d' |+ V5 Z, K& G* t
, S& n( q2 @) ]/ `+ J然后把PA6,PA7分别连接到ENA和ENB上,设置好arr和psc,最后通过TIM_SetComparex函数设置占空比即可实现PWM调速功能5 q% k6 w5 ]" l
3 i( O* L: G: i) q
四、整体关键代码和马达连接图
4 ~4 n& F. ~$ H# `1 ]4 V
剩下一下重要代码如下:$ a3 ]& T8 d9 D$ K' X/ k# A
! B9 G( b4 Y. h) m6 H% k( z7 a
  1. void qianjin(void)
    3 b9 A# `/ Y: N' R. ?% ]
  2. {
    ( R( u3 J6 L! E' A
  3.         TIM_SetCompare2(TIM3,100);//设置通道2的占空比实现PWM调速,这里是100,在0~450间,越小速度越快8 ~  N1 ]( B2 m% }2 ~
  4.         TIM_SetCompare1(TIM3,100);//设置通道1的占空比实现PWM调速( l! n7 \. Q/ b2 x, D2 Q
  5.         Ina=1;7 f' D# s& S6 l- l% [2 F
  6.         Inb=0;4 m! C! L* |. v- H7 d+ |% T
  7.         Inc=1;
    : d- H1 b: j! b: R; Y* p" o5 e- e% _" T& h
  8.         Ind=0;
    + m0 j1 s! u0 w4 e9 E
  9. }
    & T, [( b8 Y5 e$ F+ [& N0 `
  10. void houtui(void)" K( B1 e8 m$ }. ]% W
  11. {
    ( D- D2 _7 }0 A/ H  Q; Q
  12.         TIM_SetCompare2(TIM3,100);- H, Z$ f$ q* s* Z8 I; `  q
  13.         TIM_SetCompare1(TIM3,100);
    ! s$ Q5 ^/ }+ T9 ~4 m9 _
  14.         Ina=0;3 D- t; c, _# {$ I/ t5 v! l
  15.         Inb=1;2 n# L" N8 @( \2 n, y5 u; Y
  16.         Inc=0;
    2 P! g+ Y- Z* K  _8 `
  17.         Ind=1;
    4 k" U8 P/ Q, u# q2 c- j+ G7 l8 }
  18. }9 f  Q5 s3 Y* e+ g
  19. void zuozhuan(void)
    : @& [( \2 A4 X* r9 c8 l0 u
  20. {
    7 F  O2 F9 W7 L! s
  21.         TIM_SetCompare2(TIM3,100);/ q6 A/ {( s  k% o6 t
  22.         TIM_SetCompare1(TIM3,100);
    ! [1 f) P# c- I6 w7 h0 ^, G
  23.         Ina=0;) ~; c5 c5 q( o
  24.         Inb=0;
    # @' r( b5 j: g. ?; P, m8 a
  25.         Inc=1;$ a' w% l; `  C% h8 _+ U6 C% S% t
  26.         Ind=0;4 R5 D* ~7 `, c9 }
  27. }) A, I1 Z# g; P& n* L2 F8 e
  28. void youzhuan(void)
    % R( K; G$ C: Y/ Z6 e1 Y
  29. {4 a* a1 ?/ k% ]) A, Y. F( n1 G9 o
  30.         TIM_SetCompare2(TIM3,100);
      J. D: U8 h9 E- z6 I
  31.         TIM_SetCompare1(TIM3,100);
    ) v' X) N) ~: g5 z" G4 s+ n; ?
  32.         Ina=1;, R2 k$ a! F7 m
  33.         Inb=0;, {5 n- M. t6 B
  34.         Inc=0;/ ]/ b% e5 W+ o) T. Z" @
  35.         Ind=0;' f9 ?3 d' A4 f5 e8 q' ]0 R! `6 c# S
  36. }6 U: B$ D: S4 o2 {
  37. void stop(void)
    9 _# |' e$ A# m7 Q% S8 B! g
  38. {; p  `1 N- ?% J$ o  G5 S$ d
  39.         TIM_SetCompare2(TIM3,100);
    2 S0 g) @- Q! H' ~4 B2 W
  40.         TIM_SetCompare1(TIM3,100);4 b6 L; W5 C8 `- Q3 D" k9 f$ u
  41.         Ina=0;. s/ D% Z% v" W9 q
  42.         Inb=0;. L- f" N6 [+ G
  43.         Inc=0;
    ! ^( m8 ]7 I. a0 T$ j
  44.         Ind=0;
    ' [. @5 e) W- S+ t
  45. }
复制代码
5 }8 h0 g* o  r; o4 ~
主函数:* q+ x6 N+ i9 {) w7 C8 s

: m5 Y9 z3 W4 `
  1. int main(void). ~, h, o' ~$ A) r7 f" Z, M
  2. {        & x2 J' q# L+ i6 t( u- L( z& {0 }/ Z9 d' I
  3.         vu8 key=0;$ `- n5 Z- ]+ j! Y) b/ @
  4.          
    0 t/ Q* i& P; E( O. H5 K
  5.         delay_init();            //         
    7 y) Y  ^$ ]0 e8 @5 v
  6.         LED_Init();                          //
    # J& u$ a& a5 X: c, y) `' ~' z
  7.         KEY_Init(); //" R/ S5 m9 F/ k7 e( d) o
  8.     TIM3_PWM_Init(450,7199);
    7 `3 i7 k* |. z: D
  9.         while(1)
    ) Q- A2 [/ [/ O1 R) D1 i& N
  10.         {
    7 q6 v  e4 p! w& H  u+ l9 M
  11.            key=KEY_Scan(0);        //通过按键简单实现! r" ^- ^" V" o" i  l
  12.                    if(key)
    & q5 ]* V0 S5 ^) @& o/ r
  13.                 {                                                   
    - ^# o" ]' j) W# q  m: `1 [+ ^
  14.                         switch(key), J1 s: z! w$ [: Y, A
  15.                         {                                 & X' Y, ~4 {) `# L) x, H! u+ Q
  16.                                 case WKUP_PRES:        2 X2 ?* z8 X8 q& p
  17.                                      LED0=0;3 [( E0 T* c% P8 R" s* F) |/ ?) s
  18.                                      qianjin();
    ; l' x, N; @: n$ q5 K
  19.                                          break; 2 k1 t7 r( y2 H, @
  20.                                 case KEY1_PRES:        // 1 P+ y3 T, k5 j. Z* Z7 Z( u5 N
  21.                                      qianjin();
    1 c9 m' `# T4 Q) `" C* D* @
  22.                                          delay_ms(5000);7 i3 U5 H! I) X# x4 R0 [7 V
  23.                                          delay_ms(5000);6 K/ _: e- ~! C  B+ Y2 F
  24.                                          delay_ms(5000);
      f* }/ h) d* {; I: j
  25.                                      houtui();' t5 G$ T8 o, m% G; ]. o
  26.                                          delay_ms(5000);
    7 i8 t1 }; i* S# L4 P
  27.                                          delay_ms(5000);* ^8 Y) F# Z$ k5 b6 F6 N
  28.                                          delay_ms(5000);# O! Q$ |5 ]/ ^3 ^  L. T# z$ v
  29.                                          break;/ [# v* A; z  h, R
  30.                                 case KEY0_PRES:        8 U' b2 ]3 X7 _9 C# L1 y' Z
  31.                                          LED0=1;
      [. r' D) R. E& D: ~
  32.                                  stop();
    , n! M, r7 C& m2 v3 F  f
  33.                                          break;: u: v- k1 O, M
  34.                         }+ o" K& T& b: H+ W5 M6 }1 ]
  35.                 }
    8 b2 t7 D' Q+ ]+ A  k5 I
  36.                 else delay_ms(10); - M8 y6 W+ {1 g: D" ^
  37.             9 h+ T  h; ^3 r- U9 A) @' Z* _
  38.                
    ; T% o& R& f: M+ l; w8 @* J
  39.         }
    ! U/ ]: v4 M0 D0 B+ m
  40. }
复制代码
8 I1 k+ D# J" I: s1 X( N
以上是简单的代码实现,大家可以根据自己实际情况调整修改
5 M  L7 H; p; \
, H3 ~+ i  S0 J6 A  Z7 K+ ]( w! i下面是实物连接图:, }4 A/ l8 e" a

2 q0 k8 c, j% s  ? ~3O~2TCPP3P48296G556`(2.png " S6 l6 N, S7 R

* p6 X0 S4 o/ h+ W( k这里用另一个L298N来连接,原理一样的,我另外那个红色版的螺丝不好拧,就暂且用这个,这里我用这个电机驱动4个马达,特别注意单片机和电机上的GND是连在一起的!0 P- M. ]  v! ~1 X" F4 k

/ w+ G% m) n; |那个连接单片机的图片就不发了,具体按上述代码操作,不明白的地方可以留言或者哪里写的不对欢迎指正,谢谢!2 m+ I) w1 f) p. E6 p

- ?6 n6 v- ]9 b9 |3 E
$ o- b  O; G$ p
收藏 评论0 发布时间:2022-5-14 20:41

举报

0个回答

所属标签

相似技术帖

官网相关资源

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