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

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

[复制链接]
STMCU小助手 发布时间:2022-5-14 20:41
一、L298N电机驱动主要介绍
2 d! I& Y; C, c* `- i5 v; ~主要I/O口7 N! A  _' e0 x7 T5 h
( l# Q* ]% U& ]3 O) ~6 Q0 w
使能端ENA和ENB,控制输入端INA、INB、INC、IND,马达输出口OUT1、OUT2、OUT3、OUT4,5V输出(可以不接),还有一个板载5V电压,具体如下图所示:% c' k; F9 h3 f* K9 S9 H

9 P6 @+ ^: l/ ?6 T; w9 Q 2L_$AX`QM3WZL$C~O@O3`KA.png $ u# c4 `3 e. ?: V7 ?

& _3 p/ w5 a! f; b% [二、控制实现功能* l: c8 W. U+ k2 R# k" {' A5 f
对于L298N模块,直接给12V输入,接上地,就可以给整个模块供电了,之后就是通过控制单片机(这里用的是STM32f1)给4个输入端(INA、INB、INC、IND)控制输入高低电平了0 q. p2 _4 x5 r$ a' _5 \! _( |2 @0 f
1 u2 }% ^" t/ A% d: B
注意:ENA和ENB一般情况下会有两个跳线帽连着,这是直接连上高电平,只有给高电平,这才能让四个输入端(INA、INB、INC、IND)口去控制四个输出(OUT1、OUT2、OUT3、OUT4)进而直流电机状态。特别注意GND是电源和单片机一起共地!% @, U/ e' I! p
, i0 z/ \* l9 B8 a6 v: q9 W; U9 E
下面为真值表:
1 D" V; _9 o( w6 J1 z# r7 C5 k2 k8 l! R  ?
_IZRG{XIF1`$$NAXLN[8FUI.png - @9 [( t8 u9 u* T. [

* J' ^8 a* P% \; T  v# a( @
4 Z, e3 r2 p% W, N# Z7 X 三、PWM调速实现" m! n* s% X5 J) P: W- a% U% y
这里就不再是把ENA、ENB再接上高电平了,这个时候就要把跳线帽拔掉了,在通过定时器来控制实现PWM调速,具体先上代码:
0 q6 S+ X: Z& {7 F& K- t6 B5 u* H: N) L) `3 r
  1. #include "timer.h"# ]6 C6 Q  J4 z! q# Z+ \% M$ |' S; }

  2. & {- w4 Z3 @1 W& s: Z1 H
  3. ( T) x4 B' ]9 z  O
  4. #define Ina PGout(2)$ \% X7 g+ [/ n( c- ]9 @
  5. #define Inb PGout(3)! X& ?: i) v5 o2 W
  6. #define Inc PGout(4). B. W1 E3 u* x- a. G
  7. #define Ind PGout(5)& Y5 a" }( S1 [: A, J

  8. , v; A0 [' @/ `6 b
  9. void TIM3_PWM_Init(u16 arr,u16 psc)
    ; x( V; f! h  E/ L
  10. {  
    & a2 Y6 q' o# u5 {0 {  T9 j
  11.         GPIO_InitTypeDef GPIO_InitStructure;8 g' c; T* ^  ~, [
  12.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;2 ^( u) V% U% l6 q" L
  13.         TIM_OCInitTypeDef  TIM_OCInitStructure;  U9 |1 t1 H$ o+ @5 k

  14. + d! ?9 t* s; K9 g  t
  15.         0 @) L# h6 f- T  T
  16. ) x' @) h4 y1 Z
  17.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);        ' O0 ~1 M. h# Q; m0 F
  18.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG,ENABLE);
    / ?* j/ M$ p/ Z9 U6 ~" c! L; E
  19.         
    ( u4 }  \3 u8 k, e1 l

  20. & C" U: Z: R. p2 L/ t
  21. * E+ P; f. U* L3 T
  22.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //
    ! i, J& S; e  ?% Q4 A
  23.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出8 W* ^" G* z$ f0 P; d2 h& d
  24.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;/ d: y: b+ i9 H5 W6 x
  25.         GPIO_Init(GPIOA, &GPIO_InitStructure);//TIM3通道2
    5 G0 h1 K; u; J: g2 Y; y. m5 y
  26.         
    ( }: F4 m& E8 B: h5 X
  27.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //
    8 _6 @" v9 o8 J
  28.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //
    ( I/ G  F5 m+ n1 w
  29.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;6 z8 Y1 K3 _& @0 X: I
  30.         GPIO_Init(GPIOA, &GPIO_InitStructure);//TIM3通道12 t$ f  U, b" r+ z( n! W5 W
  31.         - w$ k/ j7 `4 |- y# U6 u/ G
  32.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                        1 o- g, T) l9 H: r
  33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 # R% ]) F& n0 ~/ i' L) C" }
  34.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                / Z2 N3 Z. T$ j: P' I+ V1 |
  35.         GPIO_Init(GPIOG, &GPIO_InitStructure);                                         7 {9 r' M0 ~9 t9 f0 R$ P: X
  36.         GPIO_ResetBits(GPIOG,GPIO_Pin_2);                                       
    ( X0 L! _( L6 M  N" p0 h
  37.         
    0 l- p3 J% _# k6 L* f7 [7 j7 A7 Y( m
  38.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    4 I) K' p* @" P# `
  39.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                                 6 C; k- y* v, N
  40.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 + [) r$ q+ t9 n1 b
  41.         GPIO_Init(GPIOG, &GPIO_InitStructure);                                3 Q% Y. A; V. ]) k+ s; [9 b. v
  42.         GPIO_ResetBits(GPIOG,GPIO_Pin_3);                                                ) I4 Q  t+ g( E
  43.         
    8 m# U- _0 r- N% \- x
  44.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                                 4 s) l: ^( f. F4 N- W. T
  45.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 
    * v9 v3 i9 h9 J( X
  46.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 4 D2 z; \0 D+ j6 U$ N. Z6 l6 e: t
  47.         GPIO_Init(GPIOG, &GPIO_InitStructure);                                         
    % T' ~2 {- L( h. S# F
  48.         GPIO_ResetBits(GPIOG,GPIO_Pin_4);                                                , s! \. H, U8 g5 b6 W
  49.         + M4 x, h5 l8 m8 e0 b
  50.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                
    ) D( K$ a* N* U1 C+ w, c" D$ R% O
  51.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 " x' f% D4 c/ V0 `6 v
  52.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 
    ) f  d% v9 |/ O0 }8 o" _
  53.         GPIO_Init(GPIOG, &GPIO_InitStructure);                                         # A* r" A* C: }, U9 I: j
  54.         GPIO_ResetBits(GPIOG,GPIO_Pin_5);                                                ' y' c) e9 m" C8 i8 Z8 n& R3 A2 A

  55. : u6 B% ]1 @5 F: p
  56.         TIM_TimeBaseStructure.TIM_Period = arr; & W& G3 A1 q# X( Q
  57.         TIM_TimeBaseStructure.TIM_Prescaler =psc; ( ?3 y( H- y: X
  58.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    $ H  g3 v7 D6 ]- Z  w+ i1 v
  59.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
    9 l2 Y7 p) z" Q% W
  60.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);) c3 r3 y6 b' T) w
  61.         ( J% K6 _9 N5 D
  62.         
    , i4 m5 x2 v9 V- |& |
  63.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
    4 ~. D! a$ u& q
  64.          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    - Q6 K4 ^: m( B1 C7 X5 \0 k
  65.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; : z6 }* q/ i" G  U
  66.         TIM_OC2Init(TIM3, &TIM_OCInitStructure);  2 B' z% J7 i+ F, ~6 Z

  67. % c+ g& J( p) c8 F
  68.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
    2 {; _& K- `# U# {( f) D
  69.          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    , i0 c, G7 S7 b
  70.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    ! _& K& b7 Z# Z7 r" T3 D3 ~- Q) H( ]- A
  71.         TIM_OC1Init(TIM3, &TIM_OCInitStructure);  
    - A8 N/ N/ J3 M4 x9 Q
  72. 5 Z& X% e  C1 _' Y3 ?3 ]

  73. * k# }# I$ p- g( M# V
  74.         TIM_Cmd(TIM3, ENABLE);  
      L3 h& X5 f) K) L; I" ~4 p  P

  75. ' }) j, o6 L- X8 N
  76. }
复制代码
1 C. S0 L/ G0 B! D' K/ Q. P) x
上面这段代码主要是定时器TIM3的初始化以及四个输入端的初始化,至于那个预分配系数psc和自动重装值arr可以自己设定,这里我设定的是arr=450,psc=7199;大家可以自己调试,这里不细讲。
* i; [8 k& A* b4 x7 k5 [$ ]2 B: ]6 {
然后把PA6,PA7分别连接到ENA和ENB上,设置好arr和psc,最后通过TIM_SetComparex函数设置占空比即可实现PWM调速功能
" k) w& @, k* o4 h. v8 F/ e! h3 O; S, q! r" N: q" \" S
四、整体关键代码和马达连接图
  f: `% l- M# d% Y( o0 I  k+ S
剩下一下重要代码如下:2 A5 F- F4 n, H3 Q  B
% u; G1 v/ j, T, d1 c$ h- p& F: o7 H% r
  1. void qianjin(void)2 o5 s5 s, H/ d  G/ s0 P
  2. {' [2 z; ?/ d2 }  y% U; Q; k* N
  3.         TIM_SetCompare2(TIM3,100);//设置通道2的占空比实现PWM调速,这里是100,在0~450间,越小速度越快# Z' o  A1 h* I6 B, I
  4.         TIM_SetCompare1(TIM3,100);//设置通道1的占空比实现PWM调速
    : H" D2 `1 N# l) w
  5.         Ina=1;0 g, |0 |' l" u) D0 {1 y
  6.         Inb=0;
    7 ]% W/ P- x4 L# i# p6 |' H3 y
  7.         Inc=1;5 X+ N8 \- O! L% ^3 `2 A
  8.         Ind=0;
    ' l0 {1 i/ W# [% H
  9. }
    ! k6 C7 }8 S6 @" c! L' |" c
  10. void houtui(void)
    ; ~9 R# j7 Y. L2 |9 v
  11. {4 a& B) U1 V+ e1 @
  12.         TIM_SetCompare2(TIM3,100);; U; j0 u, s: f5 y( t0 U
  13.         TIM_SetCompare1(TIM3,100);
    ( k; d2 i. E6 h, L
  14.         Ina=0;
      {7 ^- R. P9 d( |1 V" `
  15.         Inb=1;8 G. Y1 Z" I& m# h
  16.         Inc=0;, e# g- U  s6 ^1 ~' y7 s
  17.         Ind=1;
    " }/ y8 t# c" F# R3 x2 ~
  18. }
    3 i0 t; `; `4 b% R' a
  19. void zuozhuan(void)
    ! [6 B% O1 D" H1 }( T" Y  U
  20. {2 A0 n3 v$ T7 m( @5 B6 Y; I
  21.         TIM_SetCompare2(TIM3,100);
    / i: H$ H  K2 p4 D$ [6 ^2 e
  22.         TIM_SetCompare1(TIM3,100);
    ( h- |) a, ~: y* x5 T
  23.         Ina=0;) R; D& R9 N. x; s6 W: E" K. c) o
  24.         Inb=0;
    3 ?1 p/ Y* T; z6 k) C6 L
  25.         Inc=1;
    0 [% J1 Z2 N: C* A( q
  26.         Ind=0;1 h' r4 i: ^4 e! J/ Z7 K+ f9 E; s% v
  27. }
    $ L$ B7 @1 r( ~3 ?
  28. void youzhuan(void)8 {. M$ X4 e* V1 W$ o8 {' v
  29. {6 M0 {' F& Z& |0 I
  30.         TIM_SetCompare2(TIM3,100);( y' g6 N0 P/ r+ g9 {* x1 L
  31.         TIM_SetCompare1(TIM3,100);
    ; r* W% g0 y+ A8 G
  32.         Ina=1;
    ( |) K. b0 q: ^$ j9 S
  33.         Inb=0;
    4 U. c  r$ n6 O& q1 R# X
  34.         Inc=0;( L0 Y* x8 O7 Z6 n# ^3 \
  35.         Ind=0;
    / B, v" S- [* v+ J" N
  36. }, W5 C  Z" S- P
  37. void stop(void)
    " J- d5 T; K- d5 Z6 R
  38. {8 \) e7 X8 G  _! y
  39.         TIM_SetCompare2(TIM3,100);1 F+ |) @( f6 A8 B1 H2 r$ {# q
  40.         TIM_SetCompare1(TIM3,100);
    ( O8 N9 c, R# {! @
  41.         Ina=0;- h! _, w0 `( _. W7 k7 G2 N
  42.         Inb=0;
    % W% o7 _0 x& P; a  E8 w/ ?+ w. _
  43.         Inc=0;
    : U$ J0 |( E; Z
  44.         Ind=0;: ~# F1 N5 Q: u; T) D2 Q2 `, e6 I
  45. }
复制代码

6 a/ {) q6 M6 j8 {主函数:
( a6 ~0 h( ]" q2 n% {4 Q$ R; w1 X8 @: K$ W6 P3 w2 c  M
  1. int main(void)
    ( [8 u  `$ s% o5 n
  2. {        
      o* h: H) p( E7 i
  3.         vu8 key=0;* I; G# T9 h2 c3 D9 g# v
  4.          $ J$ R. U  W; b& u
  5.         delay_init();            //          8 V' o, w, R* o* M3 C
  6.         LED_Init();                          //
    0 ]8 \6 P6 ]. b/ {! `
  7.         KEY_Init(); //2 L& e" j: R- e" ^+ w. j; l
  8.     TIM3_PWM_Init(450,7199);
    5 _3 \! i+ v9 K
  9.         while(1)
    $ G9 ]7 ]% \# J+ r8 o8 ?8 a) _, A
  10.         {7 v1 x- n6 v2 f8 L9 a# {% q
  11.            key=KEY_Scan(0);        //通过按键简单实现( V. a1 E, Z0 E# o5 x/ o2 e- U
  12.                    if(key)
    6 h/ T% j+ S) ?- [  c+ M  p
  13.                 {                                                   
    3 B3 e1 A8 m3 e& F% q; ?
  14.                         switch(key)
    4 b4 b* C4 ^" O  R: D5 {
  15.                         {                                 
    4 l! g) B6 g1 F, F, }$ V# n% V
  16.                                 case WKUP_PRES:        1 x# k# L" `0 |& ?) {9 {
  17.                                      LED0=0;1 k; m. `: o( x# j/ k- b
  18.                                      qianjin();2 g1 I! c/ e* J
  19.                                          break;
    4 u/ `. r7 I' U6 y4 L
  20.                                 case KEY1_PRES:        //
    ( Q+ i' e, L! {
  21.                                      qianjin();; x. t2 p  f* Y: b: o
  22.                                          delay_ms(5000);
    : ?. M6 z! ?: }! f. s
  23.                                          delay_ms(5000);
    : f/ z9 t7 W( t  {7 A2 M4 X$ u
  24.                                          delay_ms(5000);" e& Y* g% f7 i' t; c
  25.                                      houtui();- }7 ?3 G2 H& \! \- \  q
  26.                                          delay_ms(5000);
    8 [5 \  `' \4 J  U, k. F- R
  27.                                          delay_ms(5000);1 r0 z; a6 _$ g9 ~' d7 F
  28.                                          delay_ms(5000);; b: L% f  a1 X" K0 Y
  29.                                          break;
    5 v. T/ Z. r# S( K
  30.                                 case KEY0_PRES:        - s0 k( ^3 S* @2 e2 X9 D! U
  31.                                          LED0=1;
    9 |2 Q* w! A% L/ r
  32.                                  stop();
    8 u. J  H5 D& i: [2 p0 ^  W0 `
  33.                                          break;2 k. ^4 ?, t% ?* ]4 g( u
  34.                         }
    4 d! v- q; {1 T# {/ P
  35.                 }, T' w) @0 O2 U  n6 @6 K; W" N
  36.                 else delay_ms(10); 1 N% Y6 v  N- k0 }; _5 r5 I
  37.             
    ' u; L1 t/ i. M4 y* e: G% z1 z+ I8 X
  38.                 & r; t. Q. m& |) m* b3 J, Y/ w
  39.         }
    ' W$ ]2 z  E/ S$ ]
  40. }
复制代码

1 T  J# z4 h$ H: J- N! f& e+ u, A以上是简单的代码实现,大家可以根据自己实际情况调整修改
4 R4 s+ m& C7 v
1 ]- a) d" M+ g: N' |下面是实物连接图:( b1 X+ q8 A9 ~9 H" m7 v

4 C: g+ ~+ D4 J ~3O~2TCPP3P48296G556`(2.png
  s, |/ J, Y* C  {7 Q
* G' z; u1 h+ s+ t! L0 n这里用另一个L298N来连接,原理一样的,我另外那个红色版的螺丝不好拧,就暂且用这个,这里我用这个电机驱动4个马达,特别注意单片机和电机上的GND是连在一起的!
$ q: C. m0 a: G$ r; N/ M7 T
0 s* G7 }  P0 B2 _: w. t那个连接单片机的图片就不发了,具体按上述代码操作,不明白的地方可以留言或者哪里写的不对欢迎指正,谢谢!
( y7 v* |6 K, B- |2 P2 |* R1 V" l. a" o0 b" j% q
- y  _% [& v3 q/ d
收藏 评论0 发布时间:2022-5-14 20:41

举报

0个回答

所属标签

相似分享

官网相关资源

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