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

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

[复制链接]
STMCU小助手 发布时间:2022-5-14 20:41
一、L298N电机驱动主要介绍/ m* O* b) z* V% e7 s. _+ [
主要I/O口2 b8 }$ C  S. d
  G- v5 y1 ~3 N$ \$ F3 r) \
使能端ENA和ENB,控制输入端INA、INB、INC、IND,马达输出口OUT1、OUT2、OUT3、OUT4,5V输出(可以不接),还有一个板载5V电压,具体如下图所示:
7 M  U5 W) h5 [( V7 Z% D8 e0 \. }: c+ U5 I9 p7 ?7 h( {, K
2L_$AX`QM3WZL$C~O@O3`KA.png
6 H" d; }, Y' T& \: C( E1 q3 j
  u3 Q/ W2 `, r5 {7 N: M二、控制实现功能
; e4 ^! V* Q# e2 ?: B对于L298N模块,直接给12V输入,接上地,就可以给整个模块供电了,之后就是通过控制单片机(这里用的是STM32f1)给4个输入端(INA、INB、INC、IND)控制输入高低电平了
& q7 G' B9 M9 d
) j, F& a" C* S3 k. r8 T9 w( J注意:ENA和ENB一般情况下会有两个跳线帽连着,这是直接连上高电平,只有给高电平,这才能让四个输入端(INA、INB、INC、IND)口去控制四个输出(OUT1、OUT2、OUT3、OUT4)进而直流电机状态。特别注意GND是电源和单片机一起共地!/ g3 P( I- |- {% ?" }* J

8 h4 u  ]8 G* a! f下面为真值表:( l; _% ~0 u% W+ C  D" b5 C1 \
* v& A4 Z0 H$ I! Y9 O' s$ U  e
_IZRG{XIF1`$$NAXLN[8FUI.png 0 T7 k; H7 E2 i0 B( l4 o( t
/ V( a9 Q2 R3 B& Z
0 B; T4 n9 m0 h* c+ g! }  E
三、PWM调速实现$ B, M% Z5 _7 t. c
这里就不再是把ENA、ENB再接上高电平了,这个时候就要把跳线帽拔掉了,在通过定时器来控制实现PWM调速,具体先上代码:; x7 D' U; ~5 l* _* O7 _; W  i

4 m/ t) e! e3 g, k5 e5 }' S9 c
  1. #include "timer.h"1 h# T. k6 e" e; P

  2. 8 g) F" `6 w3 Y$ X4 `- R+ T

  3. / X8 w  B) _: V/ C8 B9 V' {
  4. #define Ina PGout(2)
    ' }9 d& m1 X. j5 k
  5. #define Inb PGout(3)8 i! T% f! \' r' {
  6. #define Inc PGout(4)
    9 B' [1 V3 [: ]  W
  7. #define Ind PGout(5)
    # a2 L  A0 o$ u: i  f

  8. 5 Z' Y; M8 K1 J0 Q0 C  o' w
  9. void TIM3_PWM_Init(u16 arr,u16 psc)
    $ z, l+ W2 z( }( N
  10. {  
    + u8 M. }  l. l, c& }. Y# T
  11.         GPIO_InitTypeDef GPIO_InitStructure;
    5 b9 \& r4 L7 _: ~/ k1 ^6 _
  12.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;/ E7 a' Y* S% V
  13.         TIM_OCInitTypeDef  TIM_OCInitStructure;1 U3 A' ]0 i- e( {, L
  14. ! f7 Y- @& b6 k( K9 h# u
  15.         7 a( m6 M9 u8 R

  16. 2 F0 |$ s: Q! c# p" H0 x
  17.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);        3 f2 h1 H) U& j3 [5 Q( z; e4 k5 M
  18.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG,ENABLE);
    ! k4 T9 z+ g/ J0 A4 c$ o& F
  19.         * J' M  Z# W4 T" w3 D) ~

  20. * x, A2 F/ M% [! o
  21. 5 f5 o7 H$ u9 N" x( @3 L% U
  22.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //4 e- Q3 R2 R1 H  r& Z! N) H
  23.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
    " C; T# I- L$ P8 S) k
  24.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    * A3 F) L6 g# t
  25.         GPIO_Init(GPIOA, &GPIO_InitStructure);//TIM3通道28 c0 c# A* ~* |& F9 B0 J
  26.           y. h* ]- h) w3 o6 H# o
  27.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //7 ]7 i9 y  l/ W, I" z4 m+ N7 Q1 q
  28.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //; ]; R9 E6 O, `. d/ G& y
  29.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;6 C  e, U) D9 w* f# ]) Y. ?' |* B
  30.         GPIO_Init(GPIOA, &GPIO_InitStructure);//TIM3通道1
    / G) l1 @& z& k$ v3 {4 o0 `! N$ d
  31.         
    8 O. ^% ?8 M) r# q2 G! `
  32.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                        
    ) Z5 Y$ O+ A3 R) K' W3 O
  33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 ; K' H& ?7 m- i2 z
  34.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;               
    ( F% b/ H/ F; _8 y
  35.         GPIO_Init(GPIOG, &GPIO_InitStructure);                                         
    0 K9 Z( x2 q: O7 B8 Z
  36.         GPIO_ResetBits(GPIOG,GPIO_Pin_2);                                        : o$ b) x3 r/ H! H* j" _) p
  37.         2 D6 J* a; g5 {9 h! z) r! h# H
  38.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;  y6 r8 P) m! n
  39.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                                 ' ?6 s3 \, y% m. Q1 [( o4 I
  40.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 
      o* x+ E! o9 `: p0 Z
  41.         GPIO_Init(GPIOG, &GPIO_InitStructure);                                - R2 e& j* h( T. n, c& T# d  J
  42.         GPIO_ResetBits(GPIOG,GPIO_Pin_3);                                                ' N" ^0 |. S4 Y" r3 T
  43.         
    2 w" ^/ `$ e+ c2 s5 a: g
  44.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                                 2 {2 l3 `, Q8 Q. c
  45.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 
    8 k# m  W" N* l! A6 ]! a
  46.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 1 r8 O) @7 p0 _( V  P9 D) ~
  47.         GPIO_Init(GPIOG, &GPIO_InitStructure);                                         
      i& e9 P6 B+ G
  48.         GPIO_ResetBits(GPIOG,GPIO_Pin_4);                                                ' T" ^! l4 N& V. ~
  49.         4 |0 w4 F# \' ^: N1 Y
  50.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                
    3 ?2 _  t" \) @  c
  51.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 " ?; E/ U' j- @% f/ q" u; m5 j6 H
  52.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 
    ! U! c$ ?% C% ^" z
  53.         GPIO_Init(GPIOG, &GPIO_InitStructure);                                         % d- U4 [6 n3 h1 k% w
  54.         GPIO_ResetBits(GPIOG,GPIO_Pin_5);                                                * Z$ Y& F7 T3 C8 A& T: X) Y
  55. ! l& H% N8 L3 R' C4 n( ^
  56.         TIM_TimeBaseStructure.TIM_Period = arr; 5 e" ?, N1 @* L! Q" k
  57.         TIM_TimeBaseStructure.TIM_Prescaler =psc; 0 ?% D3 ~" t, C, s1 A
  58.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    5 T, l+ A' d$ I. B; o
  59.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
    , X2 n; g" f+ x/ R- }
  60.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    " [1 N& g: a4 V% J3 [+ H" f
  61.         : i) G: ^# o7 a/ y1 r0 S5 v+ F
  62.         
    . s4 \- g: H# p+ l6 W
  63.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; / A7 A4 W8 J4 ~' q8 k5 c
  64.          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 0 H) x  K& O( y- F
  65.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 1 r+ x) R' i2 n8 r: T
  66.         TIM_OC2Init(TIM3, &TIM_OCInitStructure);  
    6 Q& K4 q4 u+ t% E$ w
  67. * B5 t9 ]1 [. h) F' N5 n0 L# c
  68.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
    ; E% g" i: p$ `
  69.          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    " b: W8 d  i+ m. F
  70.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 4 D2 e% n. v% J) A7 Z9 u
  71.         TIM_OC1Init(TIM3, &TIM_OCInitStructure);  
    ! ]' w9 I( Q& X

  72. ( ^+ u. W6 ^* P# V8 C7 F
  73. 7 A4 t1 m; \5 Q  ^
  74.         TIM_Cmd(TIM3, ENABLE);  
    $ `! r( t- E4 }" p9 ^. ]+ k

  75. ; U" S6 x( f8 e+ n
  76. }
复制代码

2 E2 w' B" U/ }! L! O) `上面这段代码主要是定时器TIM3的初始化以及四个输入端的初始化,至于那个预分配系数psc和自动重装值arr可以自己设定,这里我设定的是arr=450,psc=7199;大家可以自己调试,这里不细讲。( w8 y$ y& }' }$ E" `% f0 o

. }  q- R: Y* A3 P0 t然后把PA6,PA7分别连接到ENA和ENB上,设置好arr和psc,最后通过TIM_SetComparex函数设置占空比即可实现PWM调速功能
' {/ A( }6 `7 C/ A) A1 R1 F* p+ x- P( K' P7 w9 q0 s. W# i8 X( j
四、整体关键代码和马达连接图

5 I! K7 W# T# L( m0 \1 p8 U剩下一下重要代码如下:
& z* ^3 Y/ x; D: e9 @# a& P# R# {9 a2 k! ^+ {
  1. void qianjin(void)
    ; l+ g  K# ]( j8 d9 }* T; t  v- B0 J; G
  2. {
    ' p2 n# U3 T. c- B, `' B
  3.         TIM_SetCompare2(TIM3,100);//设置通道2的占空比实现PWM调速,这里是100,在0~450间,越小速度越快( E2 R) k/ T. B- D2 y3 E7 j
  4.         TIM_SetCompare1(TIM3,100);//设置通道1的占空比实现PWM调速
    4 z- L2 Y9 L' r0 r$ K
  5.         Ina=1;
    & V' i2 D! ]( S, F! j% K, t
  6.         Inb=0;
    ; L$ V1 J( V$ V
  7.         Inc=1;4 o$ K6 ?  h5 X0 \- d' b) i
  8.         Ind=0;! D: R- U0 h" F1 Z; b& q; K9 y
  9. }
    $ d. T6 w* ~, R$ H/ c
  10. void houtui(void)
    ( j; L5 Z6 B( @- J$ J
  11. {$ _- ^7 b# j; K1 z* t
  12.         TIM_SetCompare2(TIM3,100);1 D6 e  ~3 J( z/ J! h
  13.         TIM_SetCompare1(TIM3,100);
    6 n5 g; s8 K$ q& F7 y. ~
  14.         Ina=0;& V2 F9 S  V* e/ e& b
  15.         Inb=1;
    / I$ x! X: u' G2 W0 Y
  16.         Inc=0;
    6 {& o( \* ?2 P2 w  T. J  @! @. s
  17.         Ind=1;
    & F. `0 R6 X: A: }& e
  18. }& n& f; @9 z, c! A3 d9 @  o
  19. void zuozhuan(void)( z1 n1 s& w% n: q8 u) S6 I
  20. {
    0 F2 c9 Q% f  S
  21.         TIM_SetCompare2(TIM3,100);( s1 Q6 H5 n+ ?
  22.         TIM_SetCompare1(TIM3,100);- G, X: M# N4 W( n3 X. D
  23.         Ina=0;% D- ?$ E1 D. Q9 M; h+ e4 y
  24.         Inb=0;
    $ {& i4 E) U; e
  25.         Inc=1;
    ; a; b! n" n- V6 R, [# Y6 p# r
  26.         Ind=0;
    6 ^. V" b" n, e0 P0 i$ Y
  27. }' B5 ^5 @+ }$ x1 L9 e
  28. void youzhuan(void)
    # F' v* {' p# y" o, C
  29. {2 f) |- x+ J) v% r) i
  30.         TIM_SetCompare2(TIM3,100);% T2 y$ W& M; D3 C
  31.         TIM_SetCompare1(TIM3,100);
    ( Z# q/ C7 N* ~1 f# P7 f: h+ s
  32.         Ina=1;2 h$ z. D* B; e, {9 I+ l
  33.         Inb=0;, z, v5 `! @5 X5 f
  34.         Inc=0;
    % k3 j# H! V: |1 a9 Q; k
  35.         Ind=0;/ |5 P, ^: O" Z+ k3 z/ [% d8 P
  36. }
    3 T6 S1 i3 w9 n. V5 P) I! Z, O
  37. void stop(void)
    # `- h. i7 s* [3 h( l* o
  38. {( E. Q$ O0 W6 L# x5 {/ F8 i$ ~
  39.         TIM_SetCompare2(TIM3,100);+ g4 G7 T( p" z4 A
  40.         TIM_SetCompare1(TIM3,100);
    ) u: Q! R$ y1 @1 D1 H. ?
  41.         Ina=0;
    , u: J; @" @+ ~0 S& q
  42.         Inb=0;4 @# M- p1 h2 l! |
  43.         Inc=0;
    . z; ]2 [  \5 i, X: `, D, m
  44.         Ind=0;
    / s" x/ o2 R4 M- x& [
  45. }
复制代码
4 k0 B3 Q% E+ w! U
主函数:
, c9 R7 x- k2 x% z! X' c
; L; u2 |8 D7 `/ q" i
  1. int main(void)3 A4 p7 \" I, O0 c& j- x6 a" b
  2. {        $ o* U6 p& K/ Y2 x: I! c
  3.         vu8 key=0;
    2 k) U+ a3 ?9 Q, J# }; i) y
  4.          
    & E0 C% `5 }# p
  5.         delay_init();            //          0 l% ]$ S$ s1 x, A) l6 I
  6.         LED_Init();                          //2 E, C0 k: H" o% v# ~" W4 z6 H. p
  7.         KEY_Init(); //5 b/ R4 g9 q! g9 |4 A
  8.     TIM3_PWM_Init(450,7199);. d6 X3 G: r* _( m& {; v2 h- G+ i3 F- r
  9.         while(1)
    4 c5 f  y- N. w
  10.         {
    - A2 P5 P2 p6 b1 q" H7 r- b
  11.            key=KEY_Scan(0);        //通过按键简单实现
    ( h% S% u% ^+ X/ u
  12.                    if(key)% c2 v4 g0 k$ O# V) W/ G0 h9 h/ n1 \
  13.                 {                                                   
    , n4 X4 M+ }$ D. t
  14.                         switch(key)2 `1 p% I$ h) ~) C: Z& n* m
  15.                         {                                 * X7 a" X9 C7 o* a0 z1 F
  16.                                 case WKUP_PRES:        , z& T' L% A5 ^4 f- S
  17.                                      LED0=0;# r' S- N- l- V: N) L
  18.                                      qianjin();( _$ u, o$ u  w/ k
  19.                                          break;
    * ]# x, J+ B# r! D* A) o
  20.                                 case KEY1_PRES:        // ! g" o. ~4 ~) C
  21.                                      qianjin();
    1 x, H" C( D& J# p) {
  22.                                          delay_ms(5000);) I- ^; ?0 K0 d- z
  23.                                          delay_ms(5000);- M% C' O+ G# ?2 A8 e+ J' a. ]
  24.                                          delay_ms(5000);: W) m" z* I( K$ U
  25.                                      houtui();% x' J" H( m( j+ ^
  26.                                          delay_ms(5000);
    5 V5 H4 }- a1 J4 D/ d% F. M
  27.                                          delay_ms(5000);3 c. L+ n" q- h% {! Y/ R0 l8 \. i+ b
  28.                                          delay_ms(5000);
    + ?0 [9 c0 j' p
  29.                                          break;
    " p5 U2 `$ N% X9 k- G
  30.                                 case KEY0_PRES:        , p3 p, H( ^5 a: @
  31.                                          LED0=1;
    , b; F; ?6 u! ?) b: W4 I# F
  32.                                  stop();
      a# G6 p. }  e& r3 i4 h
  33.                                          break;
    $ _4 K2 X+ ]8 h$ X0 J1 g8 @  m
  34.                         }) c$ F: Q. v* k- l" I& r1 V
  35.                 }
    $ G/ a* q* F; |( \
  36.                 else delay_ms(10);
    , L' \; n$ L9 j; l9 W
  37.             
    9 K, v/ L+ f$ q) y
  38.                 : ~8 n! L  X% z. O0 }0 y
  39.         }* [% `' D  _! ]
  40. }
复制代码
$ U, j, a; H% l2 [# r) d
以上是简单的代码实现,大家可以根据自己实际情况调整修改
4 H. f6 i; f* |: B; M1 s" w6 V% c
& f+ c9 L+ H7 v- I* f下面是实物连接图:  V0 D% s  I  m- l! F
' B' g/ }9 l/ Q" D. R2 I( P5 a
~3O~2TCPP3P48296G556`(2.png 0 M/ _3 D; I8 E5 z/ t* L' K
- w" m4 G) f9 v! j  ?2 e2 Q
这里用另一个L298N来连接,原理一样的,我另外那个红色版的螺丝不好拧,就暂且用这个,这里我用这个电机驱动4个马达,特别注意单片机和电机上的GND是连在一起的!/ ?0 B& S3 D* Y% Y: _# c

" D7 U6 u) L/ F+ J* W/ h- @那个连接单片机的图片就不发了,具体按上述代码操作,不明白的地方可以留言或者哪里写的不对欢迎指正,谢谢!* ^$ E2 |5 K" ^! }( i1 t0 n2 x* u
* J+ [, d/ [. F3 w: ^4 N: b
" x. Z7 d0 o! s0 O/ e
收藏 评论0 发布时间:2022-5-14 20:41

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版